作者选择了 技术教育基金作为 写给捐款计划的一部分接受捐款。
介绍
应用程序开发人员在Kubernetes上构建微服务往往会遇到两大问题,这会使它们放缓:
- 缓慢的反馈循环.一旦进行代码更改,它必须部署到 Kubernetes 进行测试。这需要集装箱构建,推到集装箱注册表,并部署到 Kubernetes。这会为每个代码迭代增加几分钟
- 局部内存和CPU不足。开发人员试图通过本地运行 Kubernetes 使用 minikube或同等功能来加速反馈循环。
Telepresence是一个云原生计算基金会项目,旨在在Kubernetes上快速、高效地开发。使用Telepresence,您可以本地运行您的服务,同时在云中运行您的应用程序的其余部分。Telepresence创建了Kubernetes群集与本地工作站之间的双向网络连接。
在本教程中,您将在运行 Ubuntu 20.04 的本地机器上配置 Telepresence,以便与 Kubernetes 集群一起工作. 您将拦截到您的集群的流量并将其重定向到您的本地环境。
如果您正在寻找一个管理的Kubernetes托管服务,请查看我们的简单的,用于增长的管理的Kubernetes服务(https://www.digitalocean.com/products/kubernetes)。
前提条件
要完成本教程,您将需要:
我們將使用DigitalOcean Kubernetes為教程,但您也可以使用現有的Kubernetes群集(本地或雲端)。
*(kubectl
本地安裝)(https://kubernetes.io/docs/tasks/tools/)在您的工作站上,並設定以連接到Kubernetes群集
- Node.js 的本地開發環境。
步骤 1 - 安装 Telepresence
在此步骤中,您将安装 Telepresence 并将其连接到您的 Kubernetes 集群. 首先,请确保您已配置了kubectl
,并且您可以从本地工作站连接到您的 Kubernetes 集群。
1kubectl get services
输出将看起来像这样,列出了您自己的集群的 IP 地址:
1[secondary_label Output]
2NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
3kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 116m
接下来,您将本地安装 Telepresence. Telepresence 作为单个二进制。
使用弯曲
来下载Linux的最新二进制版(约50 MB):
1sudo curl -fL https://app.getambassador.io/download/tel2/linux/amd64/latest/telepresence -o /usr/local/bin/telepresence
然后使用chmod
来使二进制可执行:
1sudo chmod a+x /usr/local/bin/telepresence
现在你已经安装了本地的Telepresence,你可以通过连接到你的Kubernetes集群来验证它是否起作用:
1telepresence connect
您将看到以下输出:
1[secondary_label Output]
2
3Launching Telepresence Daemon
4...
5Connected to context default (https://<cluster public IP>)
如果 Telepresence 无法连接,请检查您的kubectl
配置。
通过使用状态
命令连接到 Kubernetes API 服务器来验证 Telepresence 是否正常工作:
1telepresence status
您将看到以下输出. Telepresence Proxy: ON
表示 Telepresence 已配置一个代理来访问集群中的服务。
1[secondary_label Output]
2
3Root Daemon: Running
4 Version : v2.1.4 (api 3)
5 Primary DNS : ""
6 Fallback DNS: ""
7User Daemon: Running
8 Version : v2.1.4 (api 3)
9 Ambassador Cloud : Logged out
10 Status : Connected
11 Kubernetes server : https://7c10e553-10d1-4fee-9b7d-1ccbce4cdd34.k8s.ondigitalocean.com
12 Kubernetes context: <your_kubernetes_context>
13 Telepresence proxy: ON (networking to the cluster is enabled)
14 Intercepts : 0 total
15
16Connected
17 Context: do-tor1-k8s-bg-telepresence (https://bee66877-1b07-4bb1-8c8f-4fd62e416865.k8s.ondigitalocean.com)
18 Proxy: ON (networking to the cluster is enabled)
19 Intercepts: 0 total
当您使用telepresence connect
时,在服务器侧,Telepresence创建了一个名称空间,名为ambassador
,并运行流量管理器。在客户端,Telepresence设置了DNS,以允许本地访问远程服务器。这意味着您不必使用kubectl端口前进
来手动配置本地服务的访问。当您访问远程服务时,DNS将分解为特定IP地址。 有关详细信息,请参阅Telepresence架构文档。
您现在可以从本地工作站连接到远程的Kubernetes集群,就像Kubernetes集群在笔记本电脑上运行一样。
步骤 2 — 添加样本 Node.js 应用程序
在此步骤中,您将使用一个简单的 Node.js 应用程序来模拟在您的 Kubernetes 集群上运行的复杂服务. 而不是本地创建该文件,您将从 DockerHub访问它,并从那里部署到您的集群。
1var http = require('http');
2
3var handleRequest = function(request, response) {
4 console.log('Received request for URL: ' + request.url);
5 response.writeHead(200, {'Content-Type': 'text/plain'});
6 response.write('Hello, Node!');
7 response.end();
8};
9
10http.createServer(handleRequest).listen(9001);
11console.log('Use curl <hostname>:9001 to access this server...');
使用kubectl create deployment
命令创建一个名为hello node
的部署:
1kubectl create deployment hello-node --image=docommunity/hello-node:1.0
您将看到以下结果:
1[secondary_label Output]
2deployment.apps/hello-node created
使用get pod
命令确认部署已经发生,并且应用程序现在在集群中运行:
1kubectl get pod
输出将显示准备
状态为1/1
。
1[secondary_label Output]
2NAME READY STATUS RESTARTS AGE
3hello-node-86b49779bf-9zqvn 1/1 Running 0 11s
使用曝光部署
命令在端口9001
上提供应用程序:
1kubectl expose deployment hello-node --type=LoadBalancer --port=9001
结果将是这样的:
1[secondary_label Output]
2service/hello-node exposed
使用kubectl get svc
命令来检查负载平衡器是否正在运行:
1kubectl get svc
输出将看起来像这样,有自己的IP地址:
1[secondary_label Output]
2NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
3hello-node LoadBalancer 10.245.75.48 <pending> 9001:30682/TCP 4s
4kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 6d
如果您正在使用本地 Kubernetes 没有负载平衡器的支持,那么LoadBalancer
的外部 IP 值将永久显示为< pending>
。
接下来,通过使用弯曲
来访问负载平衡器来验证应用程序是否正在运行:
1curl <ip-address>:9001
如果您没有运行负载平衡器,您可以使用弯曲
直接访问服务:
1curl <servicename>.<namespace>:9001
结果将是这样的:
1[secondary_label Output]
2Hello, Node!
接下来,使用telepresence connect
命令将Telepresence连接到集群:
1telepresence connect
这使您可以像本地一样访问所有远程服务,因此您可以以名称访问该服务:
1curl hello-node.default:9001
您将收到与您通过其IP访问服务时相同的响应:
1[secondary_label Output]
2Hello, Node!
该服务正在集群中运行,您可以远程访问它. 如果您对hello-node.js
应用进行任何更改,则需要执行以下步骤:
- 更改应用程序
- 重建容器图像
- 将其推到容器注册表
- 部署到 Kubernetes
你可以使用工具(自动管道,如 Skaffold)来减少手动工作。
现在你将构建我们hello-node app
的另一个版本,并使用Telepresence来测试它,而无需构建容器图像或推动它注册或甚至部署到Kubernetes。
步骤 3 – 在本地运行服务的新版本
在此步骤中,您将在本地机器上修改现有的hello-node
应用程序,然后使用Telepresence将流量路由到本地版本,使用Telepresence intercept。
创建包含样本应用程序的修改版本的新文件:
1nano hello-node-v2.js
将以下代码添加到新文件中:
1[label hello-node-v2.js]
2var http = require('http');
3
4var handleRequest = function(request, response) {
5 console.log('Received request for URL: ' + request.url);
6 response.writeHead(200, {'Content-Type': 'text/plain'});
7 response.write('Hello, Node V2!');
8 response.end();
9};
10
11http.createServer(handleRequest).listen(9001);
保存和退出文件。
使用 Node 启动服务:
1node hello-node-v2.js
让服务运行,然后打开一个新的终端窗口并访问服务:
1curl <ip_address>:9001
结果将是这样的:
1[secondary_label Output]
2Hello, Node V2!
但是,如果您试图访问远程服务器,它目前正在运行hello-node
的版本 1。 为了修复此问题,您将允许一个拦截器将所有流量路由到群集中的hello-node
服务到服务的本地版本。
使用intercept
命令来设置intercept
:
1telepresence intercept hello-node --port 9001
结果将是这样的:
1[secondary_label Output]
2Using deployment hello-node
3intercepted
4 Intercept name : hello-node
5 State : ACTIVE
6 Destination : 127.0.0.1:9001
7 Volume Mount Error: sshfs is not installed on your local machine
8 Intercepting : all TCP connections
检查状态
命令是否正确设置了拦截:
1telepresence status
结果将是这样的:
1[secondary_label Output]
2Root Daemon: Running
3 Version : v2.1.4 (api 3)
4 Primary DNS : ""
5 Fallback DNS: ""
6User Daemon: Running
7 Version : v2.1.4 (api 3)
8 Ambassador Cloud : Logged out
9 Status : Connected
10 Kubernetes server : https://7c10e553-10d1-4fee-9b7d-1ccbce4cdd34.k8s.ondigitalocean.com
11 Kubernetes context: <your_kubernetes_context>
12 Telepresence proxy: ON (networking to the cluster is enabled)
13 Intercepts : 1 total
14 hello-node: user@context
现在可以像以前那样使用curl
访问远程服务:
1curl <ip-address>:9001
结果将是这样的:
1[secondary_label Output]
2Hello, Node V2!
现在,任何发送到群集中的服务的消息都将重定向到本地服务,这在开发阶段是非常有用的,因为您可以避免在每一次对代码的个别更改中使用部署循环(构建、推送、部署)。
结论
在本教程中,您已在本地机器上安装了 Telepresence,并展示了如何在本地环境中进行代码更改,而无需每次进行更改时部署到 Kubernetes。