作者选择了科技教育基金,作为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二进制文件(大约50MB)。
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 表示Telepresence已经配置了一个代理来访问集群上的服务。
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
输出将显示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拦截器将流量发送到本地版本_。_拦截器将用于你的集群的流量重新路由到本地版本的服务,所以你可以继续在你的开发环境中工作。
创建一个新的文件,包含样本应用程序的修改版本。
nano hello-node-v2.js
在新文件中添加以下代码。
hello-节点-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文档。