
# 使用Telepresence在本地开发和测试微服务
Kubernetes应用程序通常由多个独立的服务组成，每个服务都在自己的容器中运行。 在远端的Kubernetes集群上开发和调试这些服务可能很麻烦， 需要[在运行的容器上打开 Shell](https://kubernetes.io/zh-cn/docs/tasks/debug/debug-application/get-shell-running-container/)， 以运行调试工具。
在典型的Kubernetes开发流程中，开发者需重复以下步骤：
1. 修改代码
2. 构建镜像
3. 推送镜像到仓库
4. 更新集群Deployment
5. 等待Pod重启
6. 验证变更
此过程耗时数分钟甚至更久，严重拖慢迭代速度。
Telepresence是一个工具，它将Traffic Agent作为Sidecar注入工作负载Pod。Traffic Agent充当代理，将来自CCE集群的进出网络流量重新路由到本地环境。这样您就可以在本地环境（例如调试器和IDE）中进行开发和测试，就像本地开发环境位于CCE集群中一样。
本文档描述如何在本地使用Telepresence开发和调试CCE集群上运行的服务，更多详情请参见[Code and debug an application locally](https://telepresence.io/docs/howtos/engage)。
#### 前提条件
创建一个CCE集群，并在本地环境通过kubectl连接集群，详情请参见[使用kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)。
#### 安装Telepresence
1. 在本地环境中安装Telepresence客户端。 
   1. 下载[Telepresence二进制文件](https://github.com/telepresenceio/telepresence/releases/latest/download/telepresence-linux-amd64)。根据操作系统安装步骤会有所不同，本文以amd64为例，更多安装方式详情请参见[Install client](https://telepresence.io/docs/install/client)。
      ```
      sudo curl -fL https://github.com/telepresenceio/telepresence/releases/latest/download/telepresence-linux-amd64 -o /usr/local/bin/telepresence
      ```
      
   
   2. 为文件添加可执行权限。
      ```
      sudo chmod a+x /usr/local/bin/telepresence
      ```
      
   
   
   
   
2. 在CCE集群中安装Telepresence Traffic Manager，详情请参见[Install Traffic Manager](https://telepresence.io/docs/install/manager)。
   
   在已安装Telepresence客户端的本地环境中执行以下命令：
   ```
   telepresence helm install
   ```
   
   
 
#### 配置拦截规则
1. 在本地开发环境中连接CCE集群中的kube-apiserver。 
   ```
   telepresence connect
   ```
   
   
2. 创建一个Deployment作为示例，本文中使用nginx镜像部署。 
   ```
   kubectl create deployment echo-server --image=nginx --port=80 --replicas=1
   ```
   回显如下：
   ```
   deployment.apps/echo-server
   ```
   
   
3. 创建一个Service关联Deployment。 
   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，访问成功后回显如下：
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002261517312.png "点击放大")
   
   
4. 选择需要拦截的服务，命令如下，该规则会拦截发往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
   ```
   
   
5. 在本地IDE中编写一个HTTP Server，监听80端口，代码如下所示： 
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002296050133.png "点击放大")
   
   
6. 此时，再次在集群中访问echo-server Service，可以看到如下返回，说明此时流量已发送到本地服务器端。 
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002296265637.png "点击放大")
   本地服务器端同时也打印相应日志，表明接收到从集群里转发来的请求：
   ![](https://support.huaweicloud.com/bestpractice-cce/zh-cn_image_0000002296051577.png "点击放大")
   
   
 
