1

我要调试的 Kubernetes 集群中有一个容器。

但是没有netstat,没有ip,也没有apk

有没有办法升级这个镜像,以便安装常用工具?

在本例中,它是 K8s 1.23 集群中的 nginx 容器镜像。

4

2 回答 2

8

Alpine 是图像的精简版本,以减少占用空间。因此,预计没有这些工具。尽管从Kubernetes 开始 1.23,您可以使用该kubectl debug命令将调试 pod 附加到主题 pod。句法:

kubectl debug -it <POD_TO_DEBUG> --image=ubuntu --target=<CONTAINER_TO_DEBUG> --share-processes

示例:在下面的示例中,ubuntu容器附加到 Nginx-alpine pod,需要调试。另外,请注意ps -eaf输出显示 nginx 进程正在运行并且cat /etc/os-release显示 ubuntu 正在运行。指示过程在两个容器之间共享/可见。

ps@kube-master:~$ kubectl debug -it nginx --image=ubuntu --target=nginx --share-processes
Targeting container "nginx". If you don't see processes from this container, the container runtime doesn't support this feature.
Defaulting debug container name to debugger-2pgtt.
If you don't see a command prompt, try pressing enter.
root@nginx:/# ps -eaf
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 19:50 ?        00:00:00 nginx: master process nginx -g daemon off;
101           33       1  0 19:50 ?        00:00:00 nginx: worker process
101           34       1  0 19:50 ?        00:00:00 nginx: worker process
101           35       1  0 19:50 ?        00:00:00 nginx: worker process
101           36       1  0 19:50 ?        00:00:00 nginx: worker process
root         248       0  1 20:00 pts/0    00:00:00 bash
root         258     248  0 20:00 pts/0    00:00:00 ps -eaf
root@nginx:/# 

像这里看到的那样调试 ubuntu,这为我们提供了各种工具:

root@nginx:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.3 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.3 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
root@nginx:/# 
于 2022-01-26T20:03:51.590 回答
0

使用容器的全部意义在于优化集群中的资源利用率。使用的图像应仅包含运行您的应用程序所需的包。

应该从您的图像中删除不需要的包(尤其是在 prod 中),以降低计算利用率并减少攻击向量。

这似乎是一个精简的图像,只有运行该应用程序所需的库。

为了调试,您必须在与您尝试调试的容器相同的 pid 和网络命名空间中创建一个新容器

首先构建容器

Dockerfile

FROM alpine
RUN apk update && apk add strace
CMD ["strace", "-p", "1"]

建造

$ docker build -t strace .

docker run -t --pid=container:<targetContainer> \
  --net=container:targetContainer \
  --cap-add sys_admin \
  --cap-add sys_ptrace \
  strace
strace: Process 1 attached
futex(0xd72e90, FUTEX_WAIT, 0, NULL

https://rothgar.medium.com/how-to-debug-a-running-docker-container-from-a-separate-container-983f11740dc6

于 2022-01-26T19:00:40.033 回答