简介
Telepresence 是一款开源工具,使您能够为 Kubernetes 设置远程开发环境,在其中您仍然可以使用所有您喜欢的本地工具,例如 IDE、调试器和分析器。
架构
image.pngTraffic Manager:
需要在k8s集群中安装一个Traffic Manager服务,它的作用是接受来自开发者机器的指令,转发本地与集群之间请求和响应,集群中被拦截调试的对象被称为Intercepted container。
Traffic Agent:
当开发者本地使用Telepresence附加调试之后,Traffic Manager会以sidecar模式向目标服务注入一个container:Traffic Agent,它是一个代理网关。Traffic Agent的作用是将你的本地流量转发到Kubernetes集群中的Pod上,同时将从Pod返回的流量重定向回本地。
Telepresence Daemon:
位于开发者本地计算机,它是本地与集群网络连接的通讯站。
安装
安装kubectl
telepresence工具依赖kubectl,需先在本地开发机安装kubectl
参考 :https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-macos
安装telepresence客户端
参考官网:https://www.getambassador.io/docs/telepresence-oss/latest/quick-start
# Intel Macs
sudo curl -fL https://app.getambassador.io/download/tel2oss/releases/download/v2.14.2/telepresence-darwin-amd64 -o /usr/local/bin/telepresence
sudo chmod a+x /usr/local/bin/telepresence
# Apple silicon Macs
sudo curl -fL https://app.getambassador.io/download/tel2oss/releases/download/v2.14.2/telepresence-darwin-arm64 -o /usr/local/bin/telepresence
sudo chmod a+x /usr/local/bin/telepresence
#查看版本
$ telepresence version
OSS Client : v2.14.2
Root Daemon: not running
User Daemon: not running
配置RBAC集群凭证
将凭证内容复制到计算机 $HOME/.kube/config 文件下
方式一:在本地用telepresence客户端搞定
官网:https://www.getambassador.io/docs/telepresence-oss/latest/install/manager
#安装
telepresence helm install
#卸载
telepresence helm uninstall
方式二:在k8s集群中安装Telepresence
#添加Telepresence仓库资源并更新
helm repo add datawire https://app.getambassador.io
helm repo update
#我这里将所有组件全部安装在ambassador命名空间
kubectl create namespace ambassador
helm install traffic-manager --namespace ambassador datawire/telepresence
安装命名空间范围的Telepresence
您可能不希望Traffic Manager在整个kubernetes集群中拥有权限,或者您可能希望能够在每个集群中安装多个流量管理器(例如,按环境将它们分开)。在这些情况下,流量管理器支持使用命名空间作用域进行安装,从而允许集群管理员限制流量管理器权限的范围。
#例如,假设您想要一个只适用于命名空间dev和test的Traffic Manager,请创建一个values.yaml
vim values.yaml
managerRbac:
create: true
namespaced: true
namespaces:
- dev
- test
helm install traffic-manager --namespace ambassador datawire/telepresence -f ./values.yaml
$ kubectl get po -n ambassador
NAME READY STATUS RESTARTS AGE
traffic-manager-986b84564-hq7t2 1/1 Running 0 1h
traffic-manager-ambassador-agent-744f89bb68-k4khz 1/1 Running 0 1h
本地用telepresence客户端连接远程k8s集群
1.启动本地守护程序并将 Telepresence 连接到您的集群并安装流量管理器(如果缺少)。连接后,就像在同一网络上一样。您现在可以使用任何本地工具连接到集群中的任何服务。(本地需要有 kubeconfig 文件 ~/.kube/config)
$ telepresence connect
Launching Telepresence User Daemon
Launching Telepresence Root Daemon
Need root privileges to run: /usr/local/bin/telepresence daemon-foreground /Users/mac/Library/Logs/telepresence '/Users/mac/Library/Application Support/telepresence'
Password:
Connected to context kubernetes-admin@kubernetes (https://10.0.0.20:6443)
2.运行telepresence status 以确认与集群的连接以及它正在代理流量
$ telepresence status
OSS User Daemon: Running
Version : v2.14.2
Executable : /usr/local/bin/telepresence
Install ID : 8324c5ec-69d2-4ca7-93f3-9cb08f4f0e08
Status : Connected
Kubernetes server : https://10.0.0.20:6443
Kubernetes context: kubernetes-admin@kubernetes
Manager namespace : ambassador
Mapped namespaces : [ambassador dev test]
Intercepts : 0 total
OSS Root Daemon: Running
Version : v2.14.2
Version : v2.14.2
DNS :
Remote IP : 127.0.0.1
Exclude suffixes: [.com .io .net .org .ru]
Include suffixes: []
Timeout : 8s
Also Proxy : (0 subnets)
Never Proxy: (1 subnets)
- 10.0.0.20/32
3.本地就可以直接将请求路由到集群
$ curl http://nginx.dev.svc.cluster.local
hello nginx
全局流量拦截(这里只介绍全局拦截)
image.png1.输入telepresence list 列出要拦截的服务。例如:
telepresence list -n dev
nginx: ready to intercept (traffic-agent not yet installed)
2.获取要在服务上拦截的端口的名称
kubectl get service <service name> --output yaml
kubectl get service nginx -n dev --output yaml
···
ports:
- name: nginx-80
port: 80
protocol: TCP
targetPort: 80
···
3.拦截流向集群中服务的所有流量
telepresence intercept <service-name> --port <local-port>[:<remote-port>] --env-file <path-to-env-file>
--port:指定运行服务的本地实例的端口。如果截获的服务公开多个端口,请在冒号后指定要截获的端口。
--env文件:指定Telepresence的文件路径,以写入在pod中设置的环境变量。下面的示例显示了Telepresence拦截流向服务示例服务的流量。现在,到达集群中http端口的服务的请求被路由到工作站上的8080,并将服务的环境变量写入~/example-service-intercept.env。
$ telepresence intercept nginx --port 80:nginx-80 -n dev
Using Deployment nginx
Intercept name : nginx-dev
State : ACTIVE
Workload kind : Deployment
Destination : 127.0.0.1:80
Service Port Identifier: nginx-80
Volume Mount Error : sshfs is not installed on your local machine
Intercepting : all TCP requests
4.删除拦截器
telepresence leave <Intercept name>
$ telepresence list -n dev
nginx: intercepted
Intercept name : nginx-dev
State : ACTIVE
Workload kind : Deployment
Destination : 127.0.0.1:80
Service Port Identifier: nginx-80
Intercepting : all TCP requests
$ telepresence leave nginx-dev
终止telepresence客户端
$ telepresence quit
Telepresence Daemons disconnecting...done
$ telepresence version
OSS Client : v2.14.2
OSS Root Daemon: v2.14.2
OSS User Daemon: v2.14.2
Traffic Manager: not connected
清除注入的所有流量代理
telepresence uninstall --all-agents
常用命令
connect |
启动本地守护程序并将 Telepresence 连接到您的集群并安装流量管理器(如果缺少)。连接后,出站流量将路由到集群,以便您可以与服务交互,就像您的笔记本电脑是另一个 Pod 一样(例如,按服务名称卷曲服务) |
---|---|
status |
显示当前连接状态 |
quit |
告诉 Telepresence 守护进程退出 |
list |
列出当前活动的拦截 |
intercept |
拦截服务,运行后跟要拦截的服务名称以及代理到您的笔记本电脑的端口:(telepresence intercept <service name> --port <TCP/UDP port> 用于port/UDP 强制 UDP)。此命令还可以启动一个进程,以便您可以运行正在拦截的服务的本地实例。例如,以下命令将拦截端口 8000 上的 hello 服务并启动 Python Web 服务器telepresence intercept hello --port 8000 -- python3 -m http.server 8000 :可以使用特殊标志在 docker 容器中--docker-run 运行本地实例。 |
leave |
停止主动拦截:telepresence leave hello
|
loglevel |
临时更改流量管理器、流量代理以及用户和根守护程序的日志级别 |
gather-logs |
从流量管理器、流量代理、用户和根守护程序收集日志,并将其导出到可与其他人共享或包含在 github 问题中的 zip 文件中。用于包含和s--get-pod-yaml 的 yaml 。用于替换日志中包含 s 的和 pod 所使用的实际 pod 名称 + 命名空间。traffic-manager``traffic-agent``--anonymize``traffic-manager``traffic-agent
|
version |
显示 Telepresence CLI + Traffic-Manager 的版本(如果已连接) |
uninstall |
从集群中卸载 Telepresence,使用该--agent 标志将流量代理定位为特定工作负载,使用该--all-agents 标志从所有工作负载中删除所有流量代理,或使用该--everything 标志删除所有流量代理和流量管理器。 |
网友评论