K8s Pod启动失败报OCI runtime create failed错误问题排查
问题根因
核心报错由配置错误直接导致:
容器command字段格式不符合Kubernetes语法要求:使用数组写法配置启动命令时,数组每个元素会被容器运行时分别识别为「可执行文件路径」「启动参数1」「启动参数2」……当前配置将完整命令串/bin/sh -c 'mkdir /tmp && touch /tmp/date.log'作为单个数组元素传入,运行时会把这整串内容当成一个可执行文件的绝对路径去查找,自然找不到对应文件,直接抛出no such file or directory错误。
另外原配置还存在三个会引发启动/运行异常的隐患:
- YAML结构存在缩进错误:Pod模板(
spec.template)下的labels字段被错误配置为与metadata平级,实际labels应该是metadata的子字段,会导致配置解析异常 - 启动命令执行完创建文件的操作后就会结束,没有启动Redis主进程,容器主进程退出后Pod会持续重启
- 配置的
containerPort为6739,与Redis默认监听的6379端口不匹配,会导致后续服务访问异常 - 手动执行
mkdir /tmp属于冗余操作,emptyDir卷挂载到容器路径时会自动创建不存在的挂载目录
排查思路
- 先定位报错关键字段:报错信息中
exec: "/bin/sh -c 'mkdir /tmp && touch /tmp/date.log'"明确显示运行时尝试执行的可执行文件是整串带参数的命令,可直接定位到command字段格式错误。 - 再校验YAML结构层级:逐行核对字段缩进,确认Pod模板的元数据字段(labels、name等)是否都归属在
metadata字段下。 - 最后校验启动命令逻辑:确认命令执行完后是否会启动容器的主进程,避免主进程提前退出导致Pod反复重启。
修复方案
调整后的完整可用ReplicaSet配置如下:
apiVersion: apps/v1 kind: ReplicaSet metadata: name: redis-rs01 labels: name: redis-rs01 run: redis-rs01 app: redis spec: replicas: 3 selector: matchLabels: app: redis template: metadata: name: redis labels: app: redis spec: volumes: - name: vol001 emptyDir: {} containers: - name: redis image: redis ports: - containerPort: 6379 env: - name: MY_NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName volumeMounts: - name: vol001 mountPath: /tmp command: ["/bin/sh", "-c", "touch /tmp/date.log && redis-server"]
修正点说明:
- 调整
labels缩进,将其归属到spec.template.metadata下,符合Kubernetes YAML结构规范 - 拆分
command数组元素,将可执行文件路径、参数、执行命令拆分为独立数组项,解决运行时找不到可执行文件的问题 - 移除冗余的
mkdir /tmp操作,emptyDir挂载时会自动创建目标目录 - 启动命令末尾增加
redis-server启动Redis主进程,避免命令执行完容器直接退出 - 将容器端口修正为Redis默认监听的6379端口,若有自定义端口需求可自行修改为对应值
内容的提问来源于stack exchange,提问作者Raja G
相关产品推荐
相关产品推荐

