如何在 Kubernetes 上使用 Telepresence 在 Ubuntu 20.04 上进行快速开发
作者选择了Tech Education Fund作为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 并创建本地开发环境。
第一步——安装网真
在这一步中,您将安装 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,则LoadBalancer的外部 IP 值将永久显示为<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 intercept 的本地版本。拦截获取用于您的集群的流量并将其重新路由到您的本地版本的服务,因此您可以继续在您的开发环境中工作。
创建一个包含示例应用程序修改版本的新文件:
nano hello-node-v2.js
将以下代码添加到新文件中:
你好节点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的版本 1。要解决此问题,您将启用拦截,以将前往集群中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 文档。
更多推荐

所有评论(0)