如何在 Kubernetes 上使用 Telepresence 在 Ubuntu 20.04 上进行快速开发

作为Write for DOnations计划的一部分,作者选择了技术教育基金来接受捐赠

介绍

在 Kubernetes 上构建微服务的应用程序开发人员经常遇到两个主要问题,这会降低他们的速度:

  • 缓慢的反馈循环。代码更改后,必须将其部署到 Kubernetes 进行测试。这需要构建容器、推送到容器注册表并部署到 Kubernetes。这会增加每次代码迭代的时间。
  • 本地内存和 CPU 不足。开发人员试图通过使用minikube或等效物在本地运行 Kubernetes 来加速反馈循环然而,资源匮乏的应用程序很快就会超过本地可用的计算和内存。

Telepresence是一个云原生计算基金会项目,用于在 Kubernetes 上进行快速、高效的开发。使用 Telepresence,您可以在本地运行服务,而在云中运行其余应用程序。Telepresence 在您的 Kubernetes 集群和您的本地工作站之间创建双向网络连接。这样,您在本地运行的服务就可以与集群中的服务进行通信,反之亦然。这使您可以使用集群的计算和内存资源,而不必为每次更改都经历一个完整的部署周期。

在本教程中,您将在运行 Ubuntu 20.04 的本地计算机上配置 Telepresence 以使用 Kubernetes 集群。您将拦截到集群的流量并将其重定向到您的本地环境。

先决条件

要完成本教程,您需要:

步骤 1 — 安装 Telepresence

在此步骤中,您将安装 Telepresence 并将其连接到您的 Kubernetes 集群。首先,确保您已kubectl配置好并且可以从本地工作站连接到 Kubernetes 集群。使用get services命令检查集群的状态:

  • kubectl get services

输出将如下所示,其中列出了您自己的集群的 IP 地址:

Output
NAME 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

您将看到以下输出:

Output
deployment.apps/hello-node created

使用get pod命令确认部署已经发生并且应用程序现在正在集群上运行:

  • kubectl get pod

输出将显示READY状态为1/1

Output
NAME 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

输出将如下所示:

Output
service/hello-node exposed

使用以下kubectl get svc命令检查负载均衡器是否正在运行:

  • kubectl get svc

输出将如下所示,带有您自己的 IP 地址:

Output
NAME 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

输出将如下所示:

Output
Hello, Node!

接下来,使用telepresence connect命令将 Telepresence 连接到集群:

  • telepresence connect

这允许您像访问本地一样访问所有远程服务,因此您可以按名称访问服务:

  • curl hello-node.default:9001

您将收到与通过 IP 访问服务时相同的响应:

Output
Hello, Node!

该服务已在集群上启动并运行,您可以远程访问它。如果您对hello-node.js应用程序进行任何更改,则需要执行以下步骤:

  • 修改应用程序。
  • 重建容器镜像。
  • 将其推送到容器注册表。
  • 部署到 Kubernetes。

这是很多步骤。您可以使用工具(自动化管道,例如Skaffold)来减少手动工作。但是这些步骤本身是无法绕过的。

现在,您将构建我们的另一个版本hello-node app,并使用 Telepresence 对其进行测试,而无需构建容器映像或将其推送到注册中心,甚至部署到 Kubernetes。

步骤 3 — 在本地运行新版本的服务

在此步骤中,您将修改hello-node本地计算机上的现有应用程序。然后,您将使用 Telepresence 将流量路由到具有 Telepresence拦截的本地版本拦截获取用于您的集群的流量并将其重新路由到您的本地版本的服务,因此您可以继续在您的开发环境中工作。

创建一个包含示例应用程序修改版本的新文件:

  • nano hello-node-v2.js

将以下代码添加到新文件中:

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

输出将如下所示:

Output
Hello, Node V2!

但是,此服务仅在本地运行。如果您尝试访问远程服务器,它当前运行的是hello-node. 要解决此问题,您将启用拦截功能,将所有流向hello-node集群中服务的流量路由到服务的本地版本。

使用intercept命令设置拦截:

  • telepresence intercept hello-node --port 9001

输出将如下所示:

Output
Using 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

输出将如下所示:

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 : 1 total hello-node: user@context

现在curl像以前一样访问远程服务

  • curl <ip-address>:9001

输出将如下所示:

Output
Hello, Node V2!

现在,发送到集群上的服务的任何消息都被重定向到本地服务。这在开发阶段很有用,因为您可以避免对代码的每个单独更改的部署循环(构建、推送、部署)。

结论

在本教程中,您已经在本地机器上安装了 Telepresence,并演示了如何在本地环境中进行代码更改,而无需每次进行更改时都部署到 Kubernetes。有关 Telepresence 的更多教程和信息,请参阅Telepresence 文档

觉得文章有用?

点个广告表达一下你的爱意吧 !😁