我想查看容器中某个特定进程的详细信息
ps aux
。我有一个部署,其中有一个容器。部署有
spec:
securityContext:
runAsNonRoot: true
为了查看容器中运行的进程,我尝试在与现有容器相同的空间中启动一个临时的新容器。这个新容器应该能够访问相同的进程和资源(这是我相信并想要测试的)。我使用的命令是
kubectl debug pod-name -c my-new-container --image=busybox -it -- sh
当我运行它时,我收到警告, “容器 busybox:容器已 runAsNonRoot 并且映像将以 root 身份运行”
此消息提示后不会返回。它挂了。
是因为runAsNonRoot吗?如果是的话解决方法是什么?
是因为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
这是一个非常有趣的问题,我什至准备了一个在线游乐场来演示它和潜在的解决方案。