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

来自菜鸟教程
跳转至:导航、​搜索

作为 Write for DOnations 计划的一部分,作者选择了 Tech Education Fund 来接受捐赠。

介绍

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

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

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

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

先决条件

要完成本教程,您需要:

第 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 下载最新的 MacOS 二进制文件(大约 60 MB):

sudo curl -fL https://app.getambassador.io/download/tel2/darwin/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 v2.2.0 (api v3)
Connecting to traffic manager...
Connected to context default (https://<cluster public URL)

如果 Telepresence 未连接,请检查您的 kubectl 配置。

通过使用 status 命令连接到 Kubernetes API 服务器来验证 Telepresence 是否正常工作:

telepresence status

您将看到以下输出。 Telepresence Proxy: ON表示网真已经配置代理访问集群上的服务。

Output
Root Daemon: Running
  Version     : v2.2.0 (api 3)
  Primary DNS : ""
  Fallback DNS: ""
User Daemon: Running
  Version           : v2.2.0 (api 3)
  Ambassador Cloud  : Logged out
  Status            : Connected
  Kubernetes server : https://e5488ea3-6455-4fc7-be25-09d1d90bde82.k8s.ondigitalocean.com
  Kubernetes context: your_kubernetes_context
  Telepresence 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/1READY 状态。

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 localhost: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.2.0 (api 3)
  Primary DNS : ""
  Fallback DNS: ""
User Daemon: Running
  Version           : v2.2.0 (api 3)
  Ambassador Cloud  : Logged out
  Status            : Connected
  Kubernetes server : https://e5488ea3-6455-4fc7-be25-09d1d90bde82.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 hello-node.default:9001

输出将如下所示:

OutputHello, Node V2!                      

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

结论

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