如何在Kubernetes上使用Telepresence在Ubuntu20.04上进行快速开发
作为 Write for DOnations 计划的一部分,作者选择了 Tech Education Fund 来接受捐赠。
介绍
在 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 地址。 更多详细信息,请参阅网真架构文档。
您现在可以从本地工作站连接到远程 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
输出将显示 1/1
的 READY
状态。
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 文档。