如何使用 kubectl debug 检查 pod 中现有容器的运行进程

问题描述 投票:0回答:1

我想查看容器中某个特定进程的详细信息

ps aux
。我有一个部署,其中有一个容器。部署有

spec:
  securityContext:
    runAsNonRoot: true

为了查看容器中运行的进程,我尝试在与现有容器相同的空间中启动一个临时的新容器。这个新容器应该能够访问相同的进程和资源(这是我相信并想要测试的)。我使用的命令是

kubectl debug pod-name -c my-new-container --image=busybox -it -- sh

当我运行它时,我收到警告, “容器 busybox:容器已 runAsNonRoot 并且映像将以 root 身份运行”

此消息提示后不会返回。它挂了。

是因为runAsNonRoot吗?如果是的话解决方法是什么?

kubernetes kubectl
1个回答
0
投票

是因为runAsNonRoot吗?如果是的话解决方法是什么?

正确。 Pod 的安全上下文不允许以 root 身份运行容器,而您的调试器映像默认希望以 root 身份运行。

解决方法是让临时容器也以非 root 身份运行。您可以找到其中已有

USER
指令的图像,也可以快速构建自己的图像:

$ docker build -t registry/non-root-alpine -<<EOF
FROM alpine

USER 1000
EOF

$ docker push registry/non-root-alpine

$ kubectl debug -it --image registry/non-root-alpine -c <container> <pod>

或者,您可以直接创建临时容器(通过 API 调用),使用正确的 UID 配置其安全上下文。在这种情况下,您不需要寻找特殊的“非根”图像:

kubectl proxy &

curl -Lvk localhost:8001/api/v1/namespaces/default/pods/<pod>/ephemeralcontainers \
  -XPATCH \
  -H 'Content-Type: application/strategic-merge-patch+json' \
  -d '
{
    "spec":
    {
        "ephemeralContainers":
        [
            {
                "name": "debugger-123",
                "command": ["sh"],
                "targetContainerName": "<container>",
                "image": "alpine",
                "stdin": true,
                "tty": true,
                "securityContext": {"runAsNonRoot": true, "runAsUser": 101}
            }
        ]
    }
}'

之后,您将需要使用

kubectl attach
kubectl exec
:

kubectl exec -it -c debugger-123 <pod> -- sh

这是一个非常有趣的问题,我什至准备了一个在线游乐场来演示它和潜在的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.