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

255 阅读8分钟

作者选择了科技教育基金,作为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地址。

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文档