如何不重建镜像即可用root用户访问K8s集群中运行的Pod
Kubernetes集群exec进入容器切换root身份的可用方案
不需要重构镜像的前提下,可按集群版本选择以下三种方案操作:
方案1:直接给kubectl exec指定root用户(适用K8s 1.20及以上版本)
1.20版本之后的kubectl默认支持--user参数,指定uid为0即可直接以root身份进入容器,命令如下:
kubectl exec --stdin --tty --user 0 forms-service-cf95d4c9b-zgv9t -n staging -- /bin/bash
注意:该方案生效的前提是集群未禁用ExecAdmissionPlugin插件,且原Pod的securityContext没有配置
runAsNonRoot: true强制限制非root运行。
方案2:使用临时调试容器进入(适用K8s 1.18及以上版本,完全不影响原容器运行)
利用kubectl debug功能启动一个特权临时容器,共享原Pod的进程命名空间后通过nsenter切入原容器的运行环境,默认就是root权限:
- 第一步:启动临时调试容器
kubectl debug -it forms-service-cf95d4c9b-zgv9t -n staging --image=busybox:1.36 --share-processes --privileged
- 第二步:进入调试容器后,先通过
ps aux查询原容器主进程的PID(通常第一个用户进程PID为1),再执行nsenter命令切入原容器:
nsenter --target 1 --mount --uts --ipc --net --pid -- /bin/bash
注意:1.23版本之前的K8s需要提前在kube-apiserver开启
EphemeralContainers特性门控才能使用该功能。
方案3:修改工作负载的运行身份(可接受Pod重建时使用,无需修改镜像)
如果前面两种方案受集群配置限制无法使用,可直接修改对应Deployment/StatefulSet的配置,指定容器以root身份启动,不需要修改镜像:
- 编辑部署配置,在
spec.template.spec层级添加以下配置:
securityContext: runAsUser: 0 runAsNonRoot: false
- 执行更新操作触发Pod滚动重建:
kubectl apply -f <部署配置文件路径> -n staging
重建完成后exec进入容器默认就是root身份。
内容的提问来源于stack exchange,提问作者toto
相关产品推荐
相关产品推荐

