Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何用K8S临时容器来调试pods

如何用K8S临时容器来调试pods

作者头像
云原生小白
发布于 2021-07-20 08:15:11
发布于 2021-07-20 08:15:11
2.6K00
代码可运行
举报
文章被收录于专栏:LokiLoki
运行总次数:0
代码可运行

曾几何时,我们将自己的应用运行在Kubernetes上,每当出现容器异常崩溃时,我们往往都是一边重启容器,一边面对崩溃的容器无从下手。通常在业务研发自己build的镜像内包含了shell,我们还能通过在command中嵌入一个["sleep", "3600"]命令来阻塞容器内服务启动,不过也有时候会出现不知道从哪里冒出来一个distroless镜像,这时可能最先崩溃的就是运维了。那是一种运维这个职业自诞生以来,第一次感受到手足无措并脱离掌控的无助感。于是在k8s环境下无法debug容器的梗开始在坊间广为吐槽。

第一个打破魔咒的是kubectl-debug,它包含了agentdebug-tools两个部分。也是目前全网内搜到文档最全的解决方案。不过目前它的开发似乎已经停止,上一次提交还是在8个月之前,而最近一次Release版本也停留在两年前。更难以接受的是,当前它无法被集成在容器运行时为Containerd的k8s集群。

尽管kubectl-debug曾经确实是一款非常好用的容器调试工具,但如今Kubernetes已经有了更好的容器调试解决方案,Ephemeral Containers

Ephemeral Containers

Ephemeral Containers字如其名,它就是一个临时容器。这是一个自Kubernetes v1.16中作为alpha引入的新功能,虽然当前它还没有GA,不过自从在Kubernetes v1.18之后,在kubectl内已经集成了debug客户端,我们几乎可以完整的使用并体验它的新特性。

临时容器的目标是为Kubernetes用户提供一个故障诊断工具,同时具备满足以下需求:

  • 作为一个开箱即用的平台化工具
  • 不依赖于已经包含在容器镜像中的工具
  • 不需要直接登陆计算节点(可以通过Kubernetes API的管理访问Node)

不过也有东西是临时容器不计划支持的,比如对windows上启用临时容器就不太友好。

启用临时容器的特性也非常简单,在kubernetes v1.16之后的版本中将启动参数--feature-gates=EphemeralContainers=true配置到kube-api和kubelet服务上重启即可。

在1.20之前,kubectl debug工具被放在alpha中,注意不同版本的命令操作差别 这里推荐使用客户端为1.20+的版本体验会更好

那么我们有了Ephemeral Containers能做哪些事情呢?

1. POD Troubleshooting

如上文所说,我们可以直接通过kubectl debug命令进行容器调试。最直接简单的对一个pod进行调试命令如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl debug mypod -it --image=busybox

默认情况下用户不指定临时容器名称的话,debug容器名称就由kubectl自动生成一个唯一id的名称。如果用户需要自己指定容器名称则使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl debug mypod -c debugger --image=busybox

有了临时容器除了日常debug功能外,我们可以扩展出很多新花样的玩法。比如批量跑某个命名空间下的安全扫描的脚本而不用干扰原容器。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for pod in $(kubectl get -o name pod); 
do
    kubectl debug --image security/pod_scanner -p $pod /sanner.sh
done
2. POD Troubleshooting by Copy

对于没有开启Ephemeral Containers特性的集群,我们就只能通过复制模式来调试容器。它的原理是复制一个指定pod的新容器,并将debug作为sidecar跟随新容器一起启动。通过这种方式也能达到曲线救国的目的。此种方式的几个参数还是挺有意思:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--copy-to   指定新pod的名称
--replace=true   是否删除原容器
--same-node=true  是否调度到和原容器一样的node上
--share-processes=true  是否共享容器pid空间

例如我们就可以启动一个跟需要调试pod一样配置的debug容器如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl debug mypod -it \
--container=debug \
--image=busybox \
--copy-to=my-debugger \
--same-node=true \
--share-processes=true 
3. Node Troubleshooting

对!你没看错!利用Ephemeral Containers还能对Worker节点进行调试。当以节点为目标调用时,kubectl debug 将创建一个带有node名称的pod,并且调度到该节点。同时该容器还具备了hostIPChostNetworkhostPID这些特权模式。不可思议的是Worker节点的根文件系统还被mount到了debug容器下的/host目录下

直接执行这个命令就能debug主机。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl debug node/mynode -it --image=busybox

Debug镜像

工欲善其事,必先利其器。不管怎样我们都需要一套工具完善的debug镜像,在处理问题时能够得心应手。虽然网上也有不少debug镜像,不过都还是不如自己构建来的畅快。

这里小白分享一个Debug镜像的Dockerfile,大家可以根据自己条件修改即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
FROM golang:alpine as grpcurl
RUN apk update \
  && apk add --virtual build-dependencies git \
  && apk add bash curl jq \
  && go get -u github.com/fullstorydev/grpcurl \
  && go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest

FROM alpine:latest
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories && \
    apk update && \
    apk add --no-cache vim bash tcpdump curl wget strace mysql-client iproute2 redis jq iftop tzdata tar nmap bind-tools htop && \
    ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN wget -O /usr/bin/httpstat https://github.com/davecheney/httpstat/releases/download/v1.0.0/httpstat-linux-amd64-v1.0.0 && \
    chmod +x /usr/bin/httpstat
COPY --from=grpcurl  /go/bin/grpcurl /usr/bin/grpcurl
ENV TZ=Asia/Shanghai LC_ALL=C.UTF-8 LANG=C.UTF-8 LANGUAGE=C.UTF-8
ENTRYPOINT [ "/bin/bash" ]

debug镜像内支持的工具包如下图

总结

本文主要讲述了kubernetes在v1.18版本之后被提上alpha的Ephemeral Containers特性,通过临时容器我们可以debug容器,甚至还可以debug主机。它确实是一个非常方便和足以替代kubectl-debug的解决方案。不过,目前临时容器对于用户权限这块并没有特别的说明,特别是用特权模式调试主机的时候,希望后面能够借助PSP(Pod Security Policy)做一个额外的补充。

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Kubernetes 官方出品调试工具上手指南(无需安装,开箱即用)
调试容器化工作负载和 Pod 是每位使用 Kubernetes 的开发人员和 DevOps 工程师的日常任务。通常情况下,我们简单地使用 kubectl logs 或者 kubectl describe pod 便足以找到问题所在,但有时候,一些问题会特别难查。这种情况下,大家可能会尝试使用 kubectl exec,但有时候这样也还不行,因为 Distroless 等容器甚至不允许通过 SSH 进入 shell。那么,如果以上所有方法都失败了,我们要怎么办?
iMike
2021/07/01
1.1K0
Kubernetes(k8s)-pod介绍
我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。
运维小路
2024/12/23
2470
Kubernetes(k8s)-pod介绍
k8s-ephemeral和init容器
截止到目前k8s1.18版本,k8s已经支持四种类型的container:标准容器,sidecar容器,init容器,ephemeral容器。
yaohong
2020/06/16
1.6K0
k8s-ephemeral和init容器
Kubectl debug 调试容器
调试容器化工作负载和 Pod 是每位使用 Kubernetes 的开发人员和 DevOps 工程师的日常任务。通常情况下,我们简单地使用 kubectl logs 或者 kubectl describe pod 便足以找到问题所在,但有时候,一些问题会特别难查。这种情况下,大家可能会尝试使用 kubectl exec,但有时候这样也还不行,因为 Distroless 等容器甚至不允许通过 SSH 进入 shell。那么,如果以上所有方法都失败了,我们要怎么办?
Se7en258
2021/07/23
1.9K0
Kubectl debug 调试容器
一文带您探索 Kubernetes 中的容器类型
在 Kubernetes 中,containers被部署和管理在 Pod 中。Pod 是 Kubernetes 对象模型中最小和最简单的单元,可以被创建、部署和管理。在这里,您可以在单个 pod 中使用不同的容器类型来实现特定的功能。以下是在 Kubernetes 中常用的一些容器类型:
用户1107783
2024/03/18
4020
一文带您探索 Kubernetes 中的容器类型
超好用的k8s中pod诊断工具:kubectl-debug
容器技术的一个最佳实践是构建尽可能精简的容器镜像。但这一实践却会给排查问题带来麻烦:精简后的容器中普遍缺失常用的排障工具,部分容器里甚至没有 shell (比如 FROM scratch )。 在这种状况下,我们只能通过日志或者到宿主机上通过 docker-cli 或 nsenter 来排查问题,效率很低,在K8s环境部署应用后,经常遇到需要进入pod进行排错。除了查看pod logs和describe方式之外,传统的解决方式是在业务pod基础镜像中提前安装好procps、net-tools、tcpdump、vim等工具。但这样既不符合最小化镜像原则,又徒增Pod安全漏洞风险。
没有故事的陈师傅
2021/12/21
1.8K0
超好用的k8s中pod诊断工具:kubectl-debug
为什么要用临时容器
在Kubernetes中,临时容器是一种特殊类型的容器,用于在Pod中运行短暂的、不常驻的任务,例如调试、修复或数据备份等。与常规容器不同,临时容器不会一直运行,它们只会在需要时启动,完成任务后就会被删除。
玖叁叁
2023/05/03
8731
打造自己的K8s debug image
生产上,有时候为了便于调试,会需要用到一些dig curl等工具,这里提供一个很好用的 docker image
保持热爱奔赴山海
2022/01/11
7090
技术漫谈 | 超好用的K8s诊断工具:kubectl-debug
在K8s环境部署应用后,经常遇到需要进入pod进行排错。除了查看pod logs和describe方式之外,传统的解决方式是在业务pod基础镜像中提前安装好procps、net-tools、tcpdump、vim等工具。但这样既不符合最小化镜像原则,又徒增Pod安全漏洞风险。
CNCF
2019/12/04
2.1K0
技术漫谈 | 超好用的K8s诊断工具:kubectl-debug
如何使用K8S快速部署测试环境
对于已经成熟的项目团队,测试环境基本上已经配置完成,开发人员提测后,会有本次提测的版本信息,涉及到项目中哪些工程,包括前端,后端等,不需要太多的配置即可完成测试环境的构建及部署。
漫谈测试
2025/03/29
2140
如何使用K8S快速部署测试环境
k8s中 pause 容器作用
在k8s中集群中每当我们创建一个pod,都会伴随着一个pause容器产生,因此我们在node节点上会有很多的pause容器。
iginkgo18
2023/07/21
9911
【赵渝强老师】Pod中的临时容器
Pod由一个或者多个容器组成,这里的容器通常指的是运行应用程序的业务容器。但是Pod中除了业务容器外,还有基础容器、初始化容器和临时容器。
赵渝强老师
2024/08/13
1030
【赵渝强老师】Pod中的临时容器
一文搞懂 4 种常用的 Kubernetes 容器
截止目前 Kubernetes 1.18,Kubernetes 已经支持标准容器,Sidecar 容器,Init 容器,Ephemeral 容器 4 种类型的 Containers。本文我们详细介绍一下这 4 种容器的特性以及使用场景。
公众号: 云原生生态圈
2021/08/06
1.7K0
一文搞懂 4 种常用的 Kubernetes 容器
Kubernetes 故障诊断神器 kubectl-debug 入门教程
容器技术的一个最佳实践是构建尽可能精简的容器镜像。但这一实践却会给排查问题带来麻烦:精简后的容器中普遍缺失常用的排障工具,部分容器里甚至没有 shell (比如 FROM scratch )。在这种状况下,我们只能通过日志或者到宿主机上通过 docker-cli 或 nsenter 来排查问题,效率很低。Kubernetes 社区也早就意识到了这个问题,在 16 年就有相关的 Issue Support for troubleshooting distroless containers[1] 并形成了对应的 Proposal[2]。遗憾的是,由于改动的涉及面很广,相关的实现至今还没有合并到 Kubernetes 上游代码中。而在 一个偶然的机会下(PingCAP 一面要求实现一个 kubectl 插件实现类似的功能),我开发了 kubectl-debug[2]:通过启动一个安装了各种排障工具的容器,来帮助诊断目标容器。
iMike
2019/08/09
2.7K0
Kubernetes 故障诊断神器 kubectl-debug 入门教程
DevOps工程师常用的K8s命令和技巧
本文将帮助您理解DevOps 工程师所需的最重要的和最常用的 Kubernetes 命令。通过掌握这些命令,您将能够轻松导航和控制 Kubernetes 集群。 Kubernetes 改变了容器编排方式,kubectl是管理 Kubernetes 集群的主要工具。要运行这些命令,请使用Kubernetes 集群或在线集群,并确保kubectl已安装。 让我们深入了解基本kubectl命令:
DevOps云学堂
2024/06/19
1860
DevOps工程师常用的K8s命令和技巧
k8s(十)基本存储[通俗易懂]
在前面已经提到,容器的生命周期可能很短,会被频繁的创建和销毁。那么容器在销毁的时候,保存在容器中的数据也会被清除。这种结果对用户来说,在某些情况下是不乐意看到的。为了持久化保存容器中的数据,kubernetes引入了Volume的概念。 Volume是Pod中能够被多个容器访问的共享目录,它被定义在Pod上,然后被一个Pod里面的多个容器挂载到具体的文件目录下,kubernetes通过Volume实现同一个Pod中不同容器之间的数据共享以及数据的持久化存储。Volume的生命周期不和Pod中的单个容器的生命周期有关,当容器终止或者重启的时候,Volume中的数据也不会丢失。
全栈程序员站长
2022/09/22
6640
k8s(十)基本存储[通俗易懂]
深入理解 K8S Pod 调试与实践技巧
调试运行中的容器和 Pod 不像直接调试进程那么容易,本文介绍了通过临时容器共享命名空间的方式调试业务容器进程的方法。调试 pod 最简单的方法是在有问题的 pod 中执行命令,并尝试排除故障。这种方法很简单,但有许多缺点。
我的小碗汤
2023/03/20
8770
深入理解 K8S Pod 调试与实践技巧
kubernetes 近期进展 - 1.14-1.19
本文基于 kubernetes v1.19 文档,并主要关注 2019 年 以及之后(v1.14-v1.19)出现或者变化状态(比如 alpha -> beta)的特性 容器与工作负载 容器引擎 cri-containerd 已经成熟,在主流的云厂商新建 k8s 集群时大都(如google clout、腾讯云、阿里云)提供了基于 containerd 的创建选项 (另一个选项为 docker)。关于 docker 和 containterd 的关系和区别可以参考这篇文章 docker 推荐安装 19.03.
王磊-字节跳动
2020/10/20
2.5K1
K8S原来如此简单(七)存储
例如,缓存服务经常受限于内存大小,将不常用的数据转移到比内存慢、但对总体性能的影响很小的存储中。
Chester Chen
2022/08/18
3870
K8S原来如此简单(七)存储
二进制安装k8s集群(17)-安装kubectl-debug
在上一篇文章里我们主要介绍安装k8s集群内的基础服务nginx-ingress-controller,这里我们介绍一下k8s的pod调试工具。在k8s的容器环境中,去排查问题是避免不了的,这就需要在pod里有各种工具,例如top,ps,pidstat,vmstat,nslookup,netstat,tcpdump,dig,traceroute等。可是有些pod里就没有这些工具(当然从制作image的角度来说确实是不应该把和应用自身无关的tools放到image里),这无疑给我们调试排查问题带来巨大的困难。kubectl-debug就是为了解决这个问题的,它不是k8s官方工具,是个人项目,但是用起来却比较方便,这里我们用0.1.1本版。kubectl-debug具体原理不在这里详细展开,有兴趣的同学可以到github的项目里看一下(https://github.com/aylei/kubectl-debug)。
TA码字
2020/04/01
8720
二进制安装k8s集群(17)-安装kubectl-debug
相关推荐
Kubernetes 官方出品调试工具上手指南(无需安装,开箱即用)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验