作为Write for DOnations计划的一部分,作者选择了技术教育基金来接受捐赠。
介绍
在 Kubernetes 上构建微服务的应用程序开发人员经常遇到两个主要问题,这会降低他们的速度:
- 缓慢的反馈循环。代码更改后,必须将其部署到 Kubernetes 进行测试。这需要构建容器、推送到容器注册表并部署到 Kubernetes。这会增加每次代码迭代的时间。
- 本地内存和 CPU 不足。开发人员试图通过使用minikube或等效物在本地运行 Kubernetes 来加速反馈循环。然而,资源匮乏的应用程序很快就会超过本地可用的计算和内存。
Telepresence是一个云原生计算基金会项目,用于在 Kubernetes 上进行快速、高效的开发。使用 Telepresence,您可以在本地运行服务,而在云中运行其余应用程序。Telepresence 在您的 Kubernetes 集群和您的本地工作站之间创建双向网络连接。这样,您在本地运行的服务就可以与集群中的服务进行通信,反之亦然。这使您可以使用集群的计算和内存资源,而不必为每次更改都经历一个完整的部署周期。
在本教程中,您将在运行 Ubuntu 20.04 的本地计算机上配置 Telepresence 以使用 Kubernetes 集群。您将拦截到集群的流量并将其重定向到您的本地环境。
先决条件
要完成本教程,您需要:
-
Kubernetes 集群,例如DigitalOcean Kubernetes。我们将在本教程中使用 DigitalOcean Kubernetes,但您也可以使用现有的 Kubernetes 集群(本地或云)。
-
kubectl
本地安装在您的工作站上并配置为连接到 Kubernetes 集群 -
Node.js 的本地开发环境。您可以按照如何安装 Node.js 并创建本地开发环境。
步骤 1 — 安装 Telepresence
在此步骤中,您将安装 Telepresence 并将其连接到您的 Kubernetes 集群。首先,确保您已kubectl
配置好并且可以从本地工作站连接到 Kubernetes 集群。使用get services
命令检查集群的状态:
- kubectl get services
输出将如下所示,其中列出了您自己的集群的 IP 地址:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 116m
接下来,您将在本地安装 Telepresence。Telepresence 是一个二进制文件。
使用curl
下载最新的二进制的Linux(约50 MB):
- sudo curl -fL https://app.getambassador.io/download/tel2/linux/amd64/latest/telepresence -o /usr/local/bin/telepresence
然后使用chmod
使二进制可执行文件:
- sudo chmod a+x /usr/local/bin/telepresence
现在您已经在本地安装了 Telepresence,您可以通过连接到您的 Kubernetes 集群来验证它是否有效:
- telepresence connect
您将看到以下输出:
Output
Launching Telepresence Daemon
...
Connected to context default (https://<cluster public IP>)
如果 Telepresence 未连接,请检查您的kubectl
配置。
通过使用以下status
命令连接到 Kubernetes API 服务器来验证 Telepresence 是否正常工作:
- telepresence status
您将看到以下输出。Telepresence Proxy: ON
表示智真配置了代理访问集群上的服务。
Output
Root Daemon: Running
Version : v2.1.4 (api 3)
Primary DNS : ""
Fallback DNS: ""
User Daemon: Running
Version : v2.1.4 (api 3)
Ambassador Cloud : Logged out
Status : Connected
Kubernetes server : https://7c10e553-10d1-4fee-9b7d-1ccbce4cdd34.k8s.ondigitalocean.com
Kubernetes context: <your_kubernetes_context>
Telepresence proxy: ON (networking to the cluster is enabled)
Intercepts : 0 total
Connected
Context: do-tor1-k8s-bg-telepresence (https://bee66877-1b07-4bb1-8c8f-4fd62e416865.k8s.ondigitalocean.com)
Proxy: ON (networking to the cluster is enabled)
Intercepts: 0 total
当您使用 时telepresence connect
,在服务器端,Telepresence 会创建一个名为的命名空间ambassador
并运行流量管理器。在客户端,Telepresence 设置 DNS 以启用对远程服务器的本地访问。这意味着您不必使用kubectl port-forward
手动配置对本地服务的访问。当您访问远程服务时,DNS 会解析为特定的 IP 地址。有关更多详细信息,请参阅Telepresence 架构文档。
您现在可以从本地工作站连接到远程 Kubernetes 集群,就像 Kubernetes 集群在您的笔记本电脑上运行一样。接下来,您将尝试一个示例应用程序。
第 2 步 – 添加示例 Node.js 应用程序
在这一步中,您将使用一个简单的 Node.js 应用程序来模拟在 Kubernetes 集群上运行的复杂服务。您无需在本地创建文件,而是从DockerHub访问它并从那里将其部署到您的集群。该文件名为hello-node
,并返回一个文本字符串:
var http = require('http');
var handleRequest = function(request, response) {
console.log('Received request for URL: ' + request.url);
response.writeHead(200, {'Content-Type': 'text/plain'});
response.write('Hello, Node!');
response.end();
};
http.createServer(handleRequest).listen(9001);
console.log('Use curl <hostname>:9001 to access this server...');
使用该kubectl create deployment
命令创建一个名为 的部署hello node
:
- kubectl create deployment hello-node --image=docommunity/hello-node:1.0
您将看到以下输出:
Outputdeployment.apps/hello-node created
使用get pod
命令确认部署已经发生并且应用程序现在正在集群上运行:
- kubectl get pod
输出将显示READY
状态为1/1
。
OutputNAME READY STATUS RESTARTS AGE
hello-node-86b49779bf-9zqvn 1/1 Running 0 11s
使用expose deployment
命令使应用程序在端口上可用9001
:
- kubectl expose deployment hello-node --type=LoadBalancer --port=9001
输出将如下所示:
Outputservice/hello-node exposed
使用以下kubectl get svc
命令检查负载均衡器是否正在运行:
- kubectl get svc
输出将如下所示,带有您自己的 IP 地址:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-node LoadBalancer 10.245.75.48 <pending> 9001:30682/TCP 4s
kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 6d
如果您在没有负载均衡器支持的情况下使用本地 Kubernetes,则 的外部 IP 值LoadBalancer
将<pending>
永久显示。就本教程而言,这很好。如果您使用的是 DigitalOcean Kubernetes,您应该会看到外部 IP 值会在延迟后显示 IP 地址。
接下来,通过使用curl
访问负载均衡器来验证应用程序是否正在运行:
- curl <ip-address>:9001
如果您没有运行负载均衡器,则可以使用curl
直接访问该服务:
- curl <servicename>.<namespace>:9001
输出将如下所示:
OutputHello, Node!
接下来,使用telepresence connect
命令将 Telepresence 连接到集群:
- telepresence connect
这允许您像访问本地一样访问所有远程服务,因此您可以按名称访问服务:
- curl hello-node.default:9001
您将收到与通过 IP 访问服务时相同的响应:
OutputHello, Node!
该服务已在集群上启动并运行,您可以远程访问它。如果您对hello-node.js
应用程序进行任何更改,则需要执行以下步骤:
- 修改应用程序。
- 重建容器镜像。
- 将其推送到容器注册表。
- 部署到 Kubernetes。
这是很多步骤。您可以使用工具(自动化管道,例如Skaffold)来减少手动工作。但是这些步骤本身是无法绕过的。
现在,您将构建我们的另一个版本hello-node app
,并使用 Telepresence 对其进行测试,而无需构建容器映像或将其推送到注册中心,甚至部署到 Kubernetes。
步骤 3 — 在本地运行新版本的服务
在此步骤中,您将修改hello-node
本地计算机上的现有应用程序。然后,您将使用 Telepresence 将流量路由到具有 Telepresence拦截的本地版本。拦截获取用于您的集群的流量并将其重新路由到您的本地版本的服务,因此您可以继续在您的开发环境中工作。
创建一个包含示例应用程序修改版本的新文件:
- nano hello-node-v2.js
将以下代码添加到新文件中:
var http = require('http');
var handleRequest = function(request, response) {
console.log('Received request for URL: ' + request.url);
response.writeHead(200, {'Content-Type': 'text/plain'});
response.write('Hello, Node V2!');
response.end();
};
http.createServer(handleRequest).listen(9001);
保存并退出文件。
使用 Node 启动服务:
- node hello-node-v2.js
保持服务运行,然后打开一个新的终端窗口并访问该服务:
- curl <ip_address>:9001
输出将如下所示:
OutputHello, Node V2!
但是,此服务仅在本地运行。如果您尝试访问远程服务器,它当前运行的是hello-node
. 要解决此问题,您将启用拦截功能,将所有流向hello-node
集群中服务的流量路由到服务的本地版本。
使用intercept
命令设置拦截:
- telepresence intercept hello-node --port 9001
输出将如下所示:
OutputUsing deployment hello-node
intercepted
Intercept name : hello-node
State : ACTIVE
Destination : 127.0.0.1:9001
Volume Mount Error: sshfs is not installed on your local machine
Intercepting : all TCP connections
使用以下status
命令检查拦截是否已正确设置:
- telepresence status
输出将如下所示:
OutputRoot Daemon: Running
Version : v2.1.4 (api 3)
Primary DNS : ""
Fallback DNS: ""
User Daemon: Running
Version : v2.1.4 (api 3)
Ambassador Cloud : Logged out
Status : Connected
Kubernetes server : https://7c10e553-10d1-4fee-9b7d-1ccbce4cdd34.k8s.ondigitalocean.com
Kubernetes context: <your_kubernetes_context>
Telepresence proxy: ON (networking to the cluster is enabled)
Intercepts : 1 total
hello-node: user@context
现在curl
像以前一样访问远程服务:
- curl <ip-address>:9001
输出将如下所示:
OutputHello, Node V2!
现在,发送到集群上的服务的任何消息都被重定向到本地服务。这在开发阶段很有用,因为您可以避免对代码的每个单独更改的部署循环(构建、推送、部署)。
结论
在本教程中,您已经在本地机器上安装了 Telepresence,并演示了如何在本地环境中进行代码更改,而无需每次进行更改时都部署到 Kubernetes。有关 Telepresence 的更多教程和信息,请参阅Telepresence 文档。