专栏首页运维之美三种不同场景下的 Kubernetes 服务调试方法

三种不同场景下的 Kubernetes 服务调试方法

在开发、调试为生产环境下 K8s service 中的应用程序时,常常需要一些工具或者命令。本文介绍了三种不同场景下对应的解决方案以及工具。

  • 作者:Erkan Erol
  • 翻译:Bach(才云)
  • 校对:木子(才云)

基本设置

以下解释了场景的基本设置:

我们有 3 个 service,service-front 通过入口暴露给外网。service-front 的后端服务是 service-middle,service-middle 的后端是 service-back。通信是通过 K8s service 完成的。

以下是安装该设置的必要命令:

$ kubectl create ns service-debug
$ kubectl -n service-debug run service-back --image=erkanerol/service-back:v1 --port=8080 --expose=true --labels="app=back"
$ kubectl -n service-debug run service-middle --image=erkanerol/service-middle:v1 --port=8081 --expose=true --labels="app=middle"
$ kubectl -n service-debug run service-front --image=erkanerol/service-front:v1 --port=8082 --expose=true --labels="app=front"

这是这些服务的源代码:https://github.com/erkanerol/service-examples-for-blog

工具1:kubectl port-forward

场景:

作为开发人员,我希望 service-back 可以直接发送一些请求,并在不影响其他 service 的情况下查看结果。

问题:

service-back 不会暴露在外网,所以我们不能直接向其发送请求。

解决方案:

使用 kubectl port-forward,可以打开从本地计算机到 service-back 集群中的隧道。

可参考:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#port-forward

步骤:

在终端中运行以下命令:

$ kubectl -n service-debug port-forward service/service-back 8080:8080
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080

然后在另一个终端中运行以下 curl 命令,以查看是否可以访问 service-back:

$ curl localhost:8080
Timestamp from back:1614508193

实现原理:

kubectl 启动一个监听在 localhost:8080 的进程。它监控该端口并建立与 api-server 的连接,该连接将请求转发到 service-back。

工具2:kubefwd

场景:

作为开发人员,我希望在本地计算机上运行 service-front,以便在 IDE 中设置断点来调试应用程序。

问题:

service-front 被设计为,在 Kubernetes 中运行并可以通过 K8s service 访问 service-middle。service 名称是硬编码的,或者很难配置的,又或者我们懒得在本地计算机上模拟依赖项。

解决方案:

kubefwd 是解决该问题的有用工具。它可以执行批量端口转发并管理本地计算机中的 DNS 记录。

可参考:https://github.com/txn2/kubefwd

步骤:

在终端中运行以下命令:

$ sudo KUBECONFIG=$KUBECONFIG kubefwd svc -n service-debug -l app=middle

请注意,kubefwd 需要 root 特权,并且必须使用 sudo 运行。事先设置 KUBECONFIG 变量,不需要任何主文件夹引用。

在另一个终端中,在本地计算机上运行 front 应用程序。注意,我们也可以在调试模式下运行它并设置断点。

$ cd /tmp
$ git clone https://github.com/erkanerol/service-examples-for-blog.git
$ cd service-examples-for-blog/front
$ go run main.go

再在另一个终端中,向 front 应用发送请求,以查看 front 应用在本地提供服务,并且可以在集群中访问 service-middle。

$ curl localhost:8082
Response from service middle:'Response from service back:'Timestamp from back:1614513901''

实现原理:

从 kubefwd 的日志中可以看到:

...
INFO[14:07:38] 'cat /etc/hosts' to see all host entries.
INFO[14:07:38] Loaded hosts file /etc/hosts
INFO[14:07:38] HostFile management: Original hosts backup already exists at /root/hosts.original
...
INFO[14:07:38] Port-Forward: 127.1.27.1 service-middle:8081 to pod service-middle:8081
...

它启动一个进程,监听在 127.1.27.1:8081,并配置了 service-middle 的 /etc/hosts:

$ cat /etc/hosts |grep service-middle
127.1.27.1       service-middle.default service-middle.default.svc service-middle.default.svc.cluster.local service-middle.default.minikube service-middle.default.svc.minikube service-middle.default.svc.cluster.minikube service-middle service-middle.service-debug service-middle.service-debug.svc service-middle.service-debug.svc.cluster.local service-middle.service-debug.minikube service-middle.service-debug.svc.minikube service-middle.service-debug.svc.cluster.minikube

然后,本地 front 应用程序可以像访问 K8s 集群一样访问 service-middle,而无需其他额外的工作。

工具3:telepresence

场景:

作为开发人员,我希望在本地计算机上运行 service-middle,以便可以在 IDE 中设置断点来调试应用程序。

问题:

service-middle 设计为可在 Kubernetes 中运行,可通过 K8s service 访问 service-back。另外,它的 service-front 正在 K8s 上运行。这些 service 在本地计算机上不可用,而且我们也很难在本地计算机上模拟这些环境。

解决方案:

telepresence 是解决此问题的有用工具。

可参考:https://www.telepresence.io/

步骤:

首先从 K8s 集群中删除 service-middle。我们在本地运行:

$ kubectl -n service-debug delete service service-middle --ignore-not-found=true
$ kubectl -n service-debug delete pod service-middle --ignore-not-found=true

为 service-middle 运行 telepresence:

$  telepresence --namespace service-debug --new-deployment service-middle --expose 8081

在另一个终端中,在本地计算机上运行 middle 应用程序。注意,我们也可以在调试模式下运行并设置断点。

$ cd /tmp
$ git clone https://github.com/erkanerol/service-examples-for-blog.git
$ cd service-examples-for-blog/middle
$ go run main.go

再在另一个终端中,运行以下命令以通过集群中的临时 Pod 发送请求至 service-front :

$ kubectl -n service-debug run curl -it  --rm=true --image=curlimages/curl --restart=Never -- http://service-front:8082Response from service middle:'
Response from service back:'Timestamp from back:1614517363''pod "curl" deleted

要注意,这里的请求将转到 K8s 中的 service-front,K8s 将请求发送到本地计算机中的 service-middle,本地计算机再将请求发送到集群中的 service-back。

实现原理:

实际上,telepresence 将 proxy、fake agent 部署到集群中,并通过该代理在本地环境和集群之间打开一条双向通道。这样一来,我们便可以在本地计算机上运行 middle service,而无需调整 consumers、dependent service。

telepresence 工作原理的详细说明,详见:https://www.telepresence.io/discussion/how-it-works

小结

如果我们需要在不暴露 service 的情况下访问 service,kubectl port-forward 就足够了。

如果我们需要在本地运行 service 进行调试,并且 service 需要访问 K8s 上的其他 service ,kubefwd 可以发挥作用。它管理着本地计算机中的 DNS 记录,并为 service 依赖性打开从计算机到集群的单向通道。

如果我们需要在本地运行 service 进行调试,并且应用程序在集群中有一些使用方,那就使用telepresence。它可以打开双向网络通道,并将请求从集群转发至本地实例。

原文链接:https://erkanerol.github.io/post/debugging-k8s-services/

本文转载自:「 K8sMeetup」,原文:http://t.cn/A6t1ABFC ,版权归原作者所有。欢迎投稿,投稿邮箱: editor@hi-linux.com。

本文分享自微信公众号 - 运维之美(Hi-Linux),作者:Erkan Erol

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-04-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用 Bridge to Kubernetes 简化云端开发

    当我们面对一个大型应用程序,它有大量的微服务,并希望完成一些功能开发? 我们面临许多挑战,其中之一将是处理正确的环境,如何进行开发。我们知道,在团队中...

    张善友
  • 【技术创作101训练营】三种不同场景下 vue 组件动态加载的方法及实现

    前端模块化开发模式已成主流,但随着前端项目规模的不断扩大,开发者可能会遇到以下一些问题:

    CS逍遥剑仙
  • 如何为 Kubernetes 定制特性

    Kubernetes 是非常复杂的集群编排系统,然而哪怕包含丰富的功能和特性,因为容器的调度和管理本身就有较高的复杂性,所以它无法满足所有场景下的需求。虽然 K...

    我是阳明
  • 腾讯容器云平台GaiaStack亮相kubeCon

    KubeCon + CloudNativeCon 首次登陆中国上海。这意味着中国Kubernetes 爱好者们齐聚上海来参与这场全球范围内最大的 Kuberne...

    腾讯技术工程官方号
  • 50 个你必须掌握的 Kubernetes 面试题

    Kubernetes 一直是当今业界的流行语,也是最好的编排工具。它吸引了许多想要提升自己职业生涯的经验丰富的专业人士。

    iMike
  • 50个你必须了解的Kubernetes面试问题

    Kubernetes一直是当今业界的流行语,也是最好的编排工具。它吸引了许多想要提升自己职业生涯的经验丰富的专业人士。HuaWei,Pokemon,Box,eB...

    DevOps时代
  • 传统企业微服务落地大法(5)-如何实施真正的微服务化

    其中容器化的部分,Kubernetes当之无愧的选择。但是Kubernetes可不仅仅志在容器,他是为微服务而设计的。对于实施微服务各方面都有涉及。

    物流IT圈
  • 从YARN迁移到k8s,滴滴机器学习平台二次开发是这样做的

    2019 AI开发者大会是由中国IT社区 CSDN 主办的 AI 技术与产业年度盛会,2019 年 9 月 6-7 日,近百位中美顶尖 AI 专家、知名企业代表...

    AI科技大本营
  • 腾讯云私有化容器平台之网络

    刚开始接触容器集群的人会发现,与在单节点上使用容器相比,容器集群一个很复杂的领域就是网络。Kubernetes 作为容器编排领域的事实标准,对容器集群的网络进行...

    腾讯云原生

扫码关注云+社区

领取腾讯云代金券