更新时间:2025-04-30 GMT+08:00
使用Telepresence在本地开发和测试微服务
Kubernetes应用程序通常由多个独立的服务组成,每个服务都在自己的容器中运行。 在远端的Kubernetes集群上开发和调试这些服务可能很麻烦, 需要在运行的容器上打开 Shell, 以运行调试工具。
在典型的Kubernetes开发流程中,开发者需重复以下步骤:
- 修改代码
- 构建镜像
- 推送镜像到仓库
- 更新集群Deployment
- 等待Pod重启
- 验证变更
此过程耗时数分钟甚至更久,严重拖慢迭代速度。
Telepresence是一个工具,它将Traffic Agent作为Sidecar注入工作负载Pod。Traffic Agent充当代理,将来自CCE集群的进出网络流量重新路由到本地环境。这样您就可以在本地环境(例如调试器和IDE)中进行开发和测试,就像本地开发环境位于CCE集群中一样。
本文档描述如何在本地使用Telepresence开发和调试CCE集群上运行的服务,更多详情请参见Code and debug an application locally。
前提条件
创建一个CCE集群,并在本地环境通过kubectl连接集群,详情请参见使用kubectl连接集群。
安装Telepresence
- 在本地环境中安装Telepresence客户端。
- 下载Telepresence二进制文件。根据操作系统安装步骤会有所不同,本文以amd64为例,更多安装方式详情请参见Install client。
sudo curl -fL https://github.com/telepresenceio/telepresence/releases/latest/download/telepresence-linux-amd64 -o /usr/local/bin/telepresence
- 为文件添加可执行权限。
sudo chmod a+x /usr/local/bin/telepresence
- 下载Telepresence二进制文件。根据操作系统安装步骤会有所不同,本文以amd64为例,更多安装方式详情请参见Install client。
- 在CCE集群中安装Telepresence Traffic Manager,详情请参见Install Traffic Manager。
在已安装Telepresence客户端的本地环境中执行以下命令:
telepresence helm install
配置拦截规则
- 在本地开发环境中连接CCE集群中的kube-apiserver。
telepresence connect
- 创建一个Deployment作为示例,本文中使用nginx镜像部署。
kubectl create deployment echo-server --image=nginx --port=80 --replicas=1
回显如下:
deployment.apps/echo-server
- 创建一个Service关联Deployemt。
YAML示例如下:
apiVersion: v1 kind: Service metadata: labels: app: echo-server name: echo-server namespace: default spec: internalTrafficPolicy: Cluster ipFamilies: - IPv4 ipFamilyPolicy: SingleStack ports: - name: http port: 80 protocol: TCP targetPort: 80 selector: app: echo-server sessionAffinity: None type: ClusterIP
在集群中使用curl测试访问Service的ClusterIP,访问成功后回显如下:
- 选择需要拦截的服务,命令如下,该规则会拦截发往echo-server Service的流量,发送到本地的localhost:80,通过应用程序可以监听localhost:80,来调试echo-server的功能。
telepresence intercept echo-server --port 80:80
回显如下:
Using Deployment echo-server Intercept name : echo-server State : ACTIVE Workload kind : Deployment Intercepting : 192.168.1.215 -> 127.0.0.1 80 -> 80 TCP
- 在本地IDE中编写一个HTTP Server,监听80端口,代码如下所示:
- 此时,再次在集群中访问echo-server Service,可以看到如下返回,说明此时流量已发送到本地服务器端。
本地服务器端同时也打印相应日志,表明接收到从集群里转发来的请求: