使用K8S已经快两年多了,期间也碰到了不少涉及调试的场景,一般都是通过kubectl logs 或者 kubectl describe pod 进行问题的查找,有时候,kubectl exec也是经常使用的命令。但这些工具都要求通过 SSH 进入 shell,碰到 Distroless 等容器不能进入的时候该怎么办呢?本文介绍一种新工具,希望能解决这个问题。
目录
kubectl debug
举例说明
进程共享
总结
kubectl debug
这是不久前添加的一个新命令(v1.18),允许调试正在运行的 pod。它会将名为 EphemeralContainer(临时容器)的特殊容器注入到问题 Pod 中,让我们查看并排除故障。
临时容器是个新概念,其实是 Pod 中的子资源,类似普通 container。但不用于构建应用程序,而是用于检查。我们只能使用特殊的 API 将其注入到运的行 Pod 中,来运行命令并检查 Pod 环境。目前仍处于测试阶段,也许将来还有更好的方式,所以必须要手工设定启用才可以。
如下集群的配置中,就启用了临时容器:
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.20.2
apiServer:
extraArgs:
feature-gates: EphemeralContainers=true
举例说明
下面是网上的一个例子,能够演示如何建立一个测试环境,首先启动一个名为 some-app 的 Pod 来进行“调试”。然后针对这个 Pod 运行 kubectl debug,指定 busybox 为临时容器的镜像,并作为原始容器的目标。
~ kubectl run some-app --image=k8s.gcr.io/pause:3.1 --restart=Never
~ kubectl debug -it some-app --image=busybox --target=some-app
Defaulting debug container name to debugger-tfqvh.
If you don't see a command prompt, try pressing enter.
/ #
# From other terminal...
~ $ kubectl describe pod some-app
...
Containers:
some-app:
Container ID: containerd://60cc537eee843cb38a1ba295baaa172db8344eea59de4d75311400436d4a5083
Image: k8s.gcr.io/pause:3.1
Image ID: k8s.gcr.io/pause@sha256:f78411e19d84a252e53bff71a4407a5686c46983a2c2eeed83929b888179acea
...
Ephemeral Containers:
debugger-tfqvh:
Container ID: containerd://12efbbf2e46bb523ae0546b2369801b51a61e1367dda839ce0e02f0e5c1a49d6
Image: busybox
Image ID: docker.io/library/busybox@sha256:ce2360d5189a033012fbad1635e037be86f23b65cfd676b436d0931af390a2ac
Port:
Host Port:
State: Running
Started: Mon, 15 Mar 2021 20:33:51 +0100
Ready: False
Restart Count: 0
Environment:
Mounts:
进程共享
有时候,临时容器也无法解决问题,当故障容器不包括必要的调试工具甚至 shell 时,可以使用 Process Sharing(进程共享)来使用注入的临时容器检查 Pod 的原有容器。这种方式相当于克隆一个新的容器,然后把故障容器的进程共享出来(感觉有点儿奇妙),由于自己也没有能够理解,所以这里就不做阐述,避免引起误解。
总结
感觉kubectl debug的功能十分强大,除了进程共享,其他配置似乎也比较简单,暂时还没有使用到的场景,先记录一下,以免下次真的碰到场景,连这个工具都记不起来了。



