Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >使用 Telepresence 轻松在本地调试和开发 Kubernetes 应用程序

使用 Telepresence 轻松在本地调试和开发 Kubernetes 应用程序

作者头像
我的小碗汤
发布于 2023-03-19 08:54:27
发布于 2023-03-19 08:54:27
2.8K00
代码可运行
举报
文章被收录于专栏:我的小碗汤我的小碗汤
运行总次数:0
代码可运行

前言

关于golang程序在k8s中的远程调试,可以参考使用dlv进行,但是这种方式缺陷也很明显,已部署的工作负载,需要重新制作镜像,重新部署,对业务也有一定侵入性,也不够灵活。

本文介绍一种更契合远程调试部署在k8s中的业务的方式,这种方式也是k8s在官方文档中推荐使用的:telepresence

https://github.com/telepresenceio/telepresence

1.准备

telepresence下载

https://www.telepresence.io/docs/latest/install/

kubectl下载

https://kubernetes.io/docs/tasks/tools/

2.版本检测

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$telepresence version
Client: v2.5.3 (api v3)
Root Daemon: not running
User Daemon: not running

注意:如果版本小于v2.0.3,则需要升级telepresence(https://www.telepresence.io/docs/latest/install/upgrade/

3.连接k8s集群

执行以下命令连接k8s集群:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$telepresence connect
Launching Telepresence Root Daemon
Need root privileges to run: /usr/local/bin/telepresence daemon-foreground /Users/xxx/Library/Logs/telepresence '/Users/xxx/Library/Application Support/telepresence'
Password:
Launching Telepresence User Daemon
Connected to context kubernetes-admin@kubernetes (https://8.16.0.211:6443)

注意:连接的集群为kubeconfig中指定的集群,需要能真实可访问。 同时,telepresence会自动打开浏览器,要求登录:

该步骤不能省略,否则后续的步骤执行时,都会要求先登录才能继续执行。

完成上述步骤后,查看k8s集群,能发现在该集群中会创建了名为traffic-manager的控制器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$kubectl get po -n ambassador
NAME                               READY   STATUS    RESTARTS   AGE
traffic-manager-5bcfc9766f-lbrsz   1/1     Running   0          15m

4.拦截器

如上图所示,在k8s中部署了两个service,分别是Users和Orders。

这里以service Orders为例,正常情况下,一个访问Orders的请求,会被正常的收发。而telepresence的功能,就是拦截发送到Orders的请求,并将其转发到用户指定的地址(一般为本地)。

因此在开始配置前,需要了解telepresence中拦截器的概念:

• 全局拦截(Global intercept):将访问k8s中某个service的流量全部拦截,并转发到本地。

如图所示,使用全局拦截,能将访问Orders服务的全部流量拦截,全部转发到本地。当然,我们需要将本地代码运行起来,用于接收转发过来的请求,同时,可以使用任意的debug的工具在本地进行调试。

• 个人拦截(Personal intercept):有选择性地仅拦截某个service的部分流量,而不会干扰其余流量。

可以通过以下参数设置是否拦截请求的标识:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--http-match=key=value 基于请求头识别请求是否需要拦截转发
--http-path-equal <path> 基于请求路径
--http-path-prefix <prefix>  基于请求路径前缀
--http-path-regex <regex> 基于请求路径是否匹配给定的正则表达式

5.实践

在开始前,需要把用来远程调试的服务部署到k8s集群:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$kubectl get po,svc  -lk8s-app=lsh-mcp-idp-cd-test
NAME                                  READY   STATUS    RESTARTS   AGE
pod/lsh-mcp-idp-cd-6c68876d48-v6c88   1/1     Running   0          30s

NAME                     TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                         AGE
service/lsh-mcp-idp-cd   NodePort   20.102.1.158   <none>        9090:30323/TCP,2345:30886/TCP   30s

并在本地debug运行lsh-mcp-idp-cd代码:

接着使用以下命令找到要拦截转发的service,即lsh-mcp-idp-cd:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$telepresence list 
lsh-mcp-idp-cd: ready to intercept (traffic-agent not yet installed)

注意,要指定命名空间时,可以添加--namespace参数,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$telepresence list --namespace=kube-system

添加全局拦截器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
telepresence intercept <service-name> --port <local-port>[:<remote-port>] --http-match=all --env-file <path-to-env-file> [--namespace 可选]

对应到实践场景:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$telepresence intercept lsh-mcp-idp-cd --port 9090:9090 --http-match=all --env-file ~/lsh-mcp-idp-cd-intercept.env  

Flag --http-match has been deprecated, use --http-header
Using Deployment lsh-mcp-idp-cd
intercepted
    Intercept name         : lsh-mcp-idp-cd
    State                  : ACTIVE
    Workload kind          : Deployment
    Destination            : 127.0.0.1:9090
    Service Port Identifier: 9090
    Volume Mount Error     : sshfs is not installed on your local machine
    Intercepting           : matching all HTTP requests
    Preview URL            : https://sad-thompson-7927.preview.edgestack.me
    Layer 5 Hostname       : lsh-mcp-idp-cd.default.svc.cluster.local

执行完成后,会发现工作负载被注入了一个sidecar:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$kubectl get po -lk8s-app=lsh-mcp-idp-cd-test -oyaml | grep -A 5  containerID
    - containerID: docker://6aea792f32af00b2e71f643ea41630de9bb6b0ebbe91251877fd79f67630efa1
      image: registry.cn-beijing.aliyuncs.com/launcher-agent-only-dev/idp:v1
      imageID: docker-pullable://registry.cn-beijing.aliyuncs.com/launcher-agent-only-dev/idp@sha256:c3be2545c30eb75fb652d383e9ec5545df9142e40d3b6f7f78633316b0db8103
      lastState: {}
      name: idp-cd
      ready: true
--
    - containerID: docker://5acc04048950fdd38be3a8012c4cc0edbfd83079883717e34992f6f31036176f
      image: datawire/ambassador-telepresence-agent:1.11.10
      imageID: docker-pullable://datawire/ambassador-telepresence-agent@sha256:9008fc1a6a91dd27baf3da9ebd0aee024f0d6d6a3f9c24611476474f6583e7f8
      lastState: {}
      name: traffic-agent
      ready: true

增加了一个名为traffic-agent的容器,正是该容器,负责拦截发送到该pod的流量,并负责转发。

在k8s集群内执行以下命令,请求lsh-mcp-idp-cd服务:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$curl 20.102.1.158:9090/version

再看本地代码,发现已经收到了请求:

以上就是全局拦截的实践部分,个人拦截gan兴趣的同学自己实践吧,另外关于个人拦截,似乎每个账号存在使用次数限制,超过次数后创建个人拦截器时会报错:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
telepresence: error: Failed to establish intercept: intercept in error state AGENT_ERROR: You’ve reached your limit of personal intercepts available for your subscription. See usage and available plans at https://app.getambassador.io/cloud/subscriptions

See logs for details (1 error found): "/Users/xxx/Library/Logs/telepresence/daemon.log"

See logs for details (13609 errors found): "/Users/xxx/Library/Logs/telepresence/connector.log"
If you think you have encountered a bug, please run `telepresence gather-logs` and attach the telepresence_logs.zip to your github issue or create a new one: https://github.com/telepresenceio/telepresence/issues/new?template=Bug_report.md .

6.卸载

删除拦截器:执行后,会删除注入工作负载的sidecar。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$telepresence leave lsh-mcp-idp-cd

删除telepresence agents and manager,执行后清除所有sidecar,以及traffic-manager控制器,并关闭本地telepresence的后台进程。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$telepresence uninstall --everything
Telepresence Network quitting...done
Telepresence Traffic Manager quitting...done

原文:LStack朗澈云

- END -

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 进击云原生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
让远程成为本地,微服务后端开发的福音
如果我们想与其他微服务进行联动调试,则需要在本地环境中启动对应的微服务模块,这可能需要大量的配置和构建时间,同时也会占用我们本地很多资源,可能还会出现”带不动“的情况。
每周聚焦
2023/03/28
3750
让远程成为本地,微服务后端开发的福音
如果我们想与其他微服务进行联动调试,则需要在本地环境中启动对应的微服务模块,这可能需要大量的配置和构建时间,同时也会占用我们本地很多资源,可能还会出现”带不动“的情况。
Rainbond开源
2023/02/07
5320
让远程成为本地,微服务后端开发的福音
三种不同场景下的 Kubernetes 服务调试方法
在开发、调试为生产环境下 K8s service 中的应用程序时,常常需要一些工具或者命令。本文介绍了三种不同场景下对应的解决方案以及工具。
iMike
2021/04/30
1.4K0
【K8S】一种基于Istio+Okteto下的快乐开发模式
自从服务上云引入K8S后,我们开发模式也发生了改变。我们最能想到的一种开发流程就是:
于顾而言SASE
2024/03/20
2070
【K8S】一种基于Istio+Okteto下的快乐开发模式
Docker集群编排工具之Kubernetes(K8s)介绍、安装及使用
K8s基础原理 k8s中文社区:https://www.kubernetes.org.cn/ 简介 Kubernetes与较早的集群管理系统Mesos和YARN相比,对容器尤其是 Docker的支持更加原生,同时提供了更强大的机制实现资源调度,自动 管理容器生命周期,负载均衡,高可用等底层功能,使开发者可以专注于开发应用。 Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用
863987322
2018/03/29
5K0
Docker集群编排工具之Kubernetes(K8s)介绍、安装及使用
简化Kubernetes开发:你的工具指南
随着 Kubernetes 在应用开发中的日益普及,高效的本地开发工具需求变得至关重要。在过去几年中,用于开发人员与 Kubernetes 协作的工具得到了改进。这些工具帮助开发人员简化工作流程,加速迭代周期,并创建真实的开发环境。本文将全面分析和比较六种流行的现代 Kubernetes 本地开发工具。通过阅读本文,您将获得足够的信息,从而做出明智的选择,并提升 Kubernetes 开发体验。
云云众生s
2024/03/28
2020
17-Kubernetes进阶学习之集群升级迁移和维护实践
描述:Kubernetes 使用 Etcd 数据库实时存储集群中的数据,可以说 Etcd 是 Kubernetes 的核心组件,犹如人类的大脑。如果 Etcd 数据损坏将导致 Kubernetes 不可用,在生产环境中 Etcd 数据是一定要做好高可用与数据备份,这里介绍下如何备份与恢复 Etcd 数据。
全栈工程师修炼指南
2022/09/29
1K0
17-Kubernetes进阶学习之集群升级迁移和维护实践
Kubernetes 二进制部署(一)单节点部署(Master 与 Node 同一机器)
0. 前言 最近受“新冠肺炎”疫情影响,在家等着,入职暂时延后,在家里办公和学习 尝试通过源码编译二进制的方式在单一节点(Master 与 Node 部署在同一个机器上)上部署一个 k8s 环境,整理相关步骤和脚本如下 参考原文:Kubernetes二进制部署(一)单节点部署 1. 相关概念 1.1 基本架构 1.2 核心组件  1.2.1 Master 1.2.1.1 kube-apiserver 集群的统一入口,各组件协调者 以RESTful API提供接口服务 所有对象资源的增删改查和监听操作都
西凉风雷
2022/11/23
1.4K0
Kubernetes 二进制部署(一)单节点部署(Master 与 Node 同一机器)
kubernetes监控-prometheus(十六)
通过各种exporter采集不同维度的监控指标,并通过Prometheus支持的数据格式暴露出来,Prometheus定期pull数据并用Grafana展示,异常情况使用AlertManager告警。
yuezhimi
2020/09/30
7940
kubernetes监控-prometheus(十六)
Kubernetes 入门教程
一 k8s架构 我们看下 k8s 集群的架构,从左到右,分为两部分,第一部分是 Master 节点(也就是图中的 Control Plane),第二部分是 Node 节点。 Master 节点一般包括四个组件,apiserver、scheduler、controller-manager、etcd,他们分别的作用是什么:
张哥编程
2024/12/13
960
Kubernetes V1.15 二进制部署集群
以下操作均在/data/ssl_config/etcd/目录中 etcd证书ca配置
惨绿少年
2019/09/24
2K2
Kubernetes V1.15 二进制部署集群
Kubernetes+Prometheus+Grafana部署笔记
Kubernetes(通常写成“k8s”)Kubernetes是Google开源的容器集群管理系统。其设计目标是在主机集群之间提供一个能够自动化部署、可拓展、应用容器可运营的平台。Kubernetes通常结合docker容器工具工作,并且整合多个运行着docker容器的主机集群,Kubernetes不仅仅支持Docker,还支持Rocket,这是另一种容器技术。
KaliArch
2018/08/16
1.9K0
Kubernetes+Prometheus+Grafana部署笔记
自从用上 Telepresence 后,本地调试 Kubernetes 中的微服务不再是梦!
微服务作为一种全新的软件架构现在正变得越来越火。基本原因我觉得有两点:一方面软件系统越做越复杂,通过拆分将一个大系统解耦成一个个独立的子系统,我们就降低了整个系统的复杂性。另一方面,Kubernetes 的出现使得编排这么多子系统变得简单,可以说 Kubernetes 是目前为止微服务最好的载体。
iMike
2019/11/12
5.9K0
自从用上 Telepresence 后,本地调试 Kubernetes 中的微服务不再是梦!
TKE操作指南 - TKE K8S问题排查(十八)
问题描述:查看pod日志报错,Normal Killing 39s (x735 over 15h) kubelet, 10.179.80.31 Killing container with id docker://apigateway:Need to kill Pod,可能是磁盘满了,无法创建和删除 pod
亮哥说TKE
2019/08/14
5.9K0
部署 Prometheus Operator 监控 Kubernetes 集群
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aixiaoyang168/article/details/81661459
哎_小羊
2019/05/25
1.6K0
k8s集群上ingress实战
使用ingress之前要先在k8s集群部署ingress controller,ingress controller本身需要LoadBalancer支持,一个基本的访问流如下:
王录华
2019/09/25
2.6K0
k8s集群上ingress实战
Kubernetes 之APIServer组件简介
k8s API Server提供了k8s各类资源对象(pod,RC,Service等)的增删改查及watch等HTTP Rest接口,是整个系统的数据总线和数据中心。
菲宇
2019/06/12
3.8K0
Kubernetes 之APIServer组件简介
Kubernetes容器集群管理环境 - Prometheus监控篇
一、Prometheus介绍 之前已经详细介绍了Kubernetes集群部署篇,今天这里重点说下Kubernetes监控方案-Prometheus+Grafana。Prometheus(普罗米修斯)是一个开源系统监控和警报工具,最初是在SoundCloud建立的。自2012年成立以来,许多公司和组织都采用了普罗米修斯,该项目拥有一个非常活跃的开发者和用户社区。它现在是一个独立的开放源码项目,并且独立于任何公司,为了强调该点并澄清项目的治理结构,Prometheus在2016年加入了云计算基金会,成为继Kubernetes之后的第二个托管项目。 Prometheus是用来收集数据的,同时本身也提供强大的查询能力,结合Grafana即可以监控并展示出想要的数据。
洗尽了浮华
2019/07/10
2.1K0
Kubernetes容器集群管理环境 - Prometheus监控篇
Docker 与 Kubernetes在前端开发的应用
Docker是开发人员和系统管理员使用容器开发、部署和运行应用程序的平台,使用Linux容器来部署应用程序称为集装箱化,使用Docker可以轻松部署应用程序。Docker 和传统部署方式最大的不同在于,它将不会限制我们使用任何工具,任何语言,任何版本的 runtime,Docker 将我们的应用看成一个只提供网络服务的盒子(也即容器),Kubernetes 则是对这些盒子进行更多自动化的操作,自动创建,自动重启,自动扩容,自动调度,这个过程称之为容器编排。
xiangzhihong
2022/11/30
8020
利用GPU服务器实现边云协同推理
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情
鳄鱼儿
2024/05/22
2720
利用GPU服务器实现边云协同推理
推荐阅读
相关推荐
让远程成为本地,微服务后端开发的福音
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档