美文网首页
Telepresence 快速、高效的 k8s 微服务本地开发

Telepresence 快速、高效的 k8s 微服务本地开发

作者: Rami | 来源:发表于2023-08-08 16:27 被阅读0次

简介

Telepresence 是一款开源工具,使您能够为 Kubernetes 设置远程开发环境,在其中您仍然可以使用所有您喜欢的本地工具,例如 IDE、调试器和分析器。

架构

image.png

Traffic 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.png

1.输入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标志删除所有流量代理和流量管理器。

相关文章

网友评论

      本文标题:Telepresence 快速、高效的 k8s 微服务本地开发

      本文链接:https://www.haomeiwen.com/subject/qqnnpdtx.html