如何在 Ubuntu 20.04 上使用 Kubernetes 上的网真进行快速开发

作者选择了 技术教育基金作为 写给捐款计划的一部分接受捐款。

介绍

应用程序开发人员在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。

Published At
Categories with 技术
comments powered by Disqus