为何不同K8s集群对无执行权限脚本的执行规则不一致?
问题排查:AWS EKS 1.23+ 容器启动失败,GKE 1.24 正常运行
问题背景
部署的容器在AWS EKS 1.23+集群启动失败,而在GCP GKE 1.24集群可正常运行。按预期两者都应启动失败,需排查差异原因:是Kubernetes版本不同导致,还是底层容器引擎的差异?
容器内排查结果
进入运行tail -f /dev/null的休眠容器后,执行命令得到以下输出:
/data $ ps -ef PID USER TIME COMMAND 1 6379 0:00 {sleeper} /bin/sh /scripts/sleeper 7 6379 0:00 tail -f /dev/null 8 6379 0:00 sh -c clear; (bash || ash || sh) 15 6379 0:00 ash 16 6379 0:00 ps -ef /data $ ls -l /scripts/..data/sleeper -rwxr----- 1 root 6379 27 Apr 6 15:31 /scripts/..data/sleeper /data $ id uid=6379 gid=0(root) groups=6379
从输出可知:
- 启动脚本
sleeper的权限为*-rwxr-----*,仅所有者拥有执行权限,组和其他用户无执行权限 - 容器运行用户为uid=6379,属于root组(gid=0)
集群运行状态对比
AWS EKS 1.23+
容器启动失败,错误事件:
Reason: ContainerCannotRun - exit code: 126
完整错误详情:
Error: failed to start container "alpine-sleeper": Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec /scripts/sleeper: permission denied: unknown
对应集群版本信息:
Server Version: version.Info{Major:"1", Minor:"23+", GitVersion:"v1.23.16-eks-48e63af", GitCommit:"e6332a8a3feb9e0fe3db851878f88cb73d49dd7a", GitTreeState:"clean", BuildDate:"2023-01-24T19:18:15Z", GoVersion:"go1.19.5", Compiler:"gc", Platform:"linux/amd64"}
GCP GKE 1.24
容器可正常启动运行,对应集群版本信息:
Server Version: version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.10-gke.2300", GitCommit:"1d7ae0799b40b0cd95502e3a5e698db62572e341", GitTreeState:"clean", BuildDate:"2023-02-22T09:28:49Z", GoVersion:"go1.19.6 X:boringcrypto", Compiler:"gc", Platform:"linux/amd64"}
关键发现与疑问
更新1:确认AWS EKS使用Docker作为容器运行时,GCP GKE使用containerd。是否存在Docker允许root组用户执行无组执行权限文件的情况?
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

