Kubernetes Pod对象command字段正确用法及相关问题咨询
Kubernetes Pod command字段使用问题解答
问题1:sleep 3600执行完成后Pod持续运行的原因
- 你的busybox2 Pod配置未显式声明
restartPolicy,Kubernetes Pod默认重启策略为Always,即容器只要退出(不管退出码是否为0),kubelet都会自动重启容器。你看到的运行状态是容器反复退出重启后的结果,你可以执行kubectl get pod busybox2查看RESTARTS列的数值,会发现数值随时间持续增长,也可以通过kubectl describe pod busybox2查看事件列表确认重启记录。 - 如果要让Pod执行完sleep后自动终止不再重启,只需要在Pod spec下添加
restartPolicy: Never或者restartPolicy: OnFailure即可,修改后的配置示例:
apiVersion: v1 kind: Pod metadata: name: busybox2 namespace: default spec: restartPolicy: Never containers: - name: busy image: busybox command: - sleep - "3600"
问题2:command两种写法的混用规则
你提到的两种写法是YAML语法里两种不同的序列声明格式,在Kubernetes中解析结果完全一致,所有场景下都可以自由替换,没有功能差异:
- 多行短横线的写法是YAML块序列格式
- 方括号包裹的写法是YAML流序列格式
你提到的两个改写方案都是完全合法可用的:
- 第一个示例的command完全可以改写为
command: ["sleep", "3600"],和原多行写法没有任何功能区别 - 第二个官方示例也可以把参数合并到command中,改写为
command: ["printenv", "HOSTNAME", "KUBERNETES_PORT"],删除原args字段后依然可以正常运行
这里额外补充command和args的配合规则,避免使用混淆:
- 仅配置command、不配置args:直接执行command中定义的命令和附带的所有参数
- 同时配置command和args:command为可执行文件路径/名称,args为传给该可执行文件的参数
- 仅配置args、不配置command:使用镜像默认的ENTRYPOINT作为可执行文件,args为传入的参数
- command和args都不配置:使用镜像默认的ENTRYPOINT和CMD运行
内容的提问来源于stack exchange,提问作者Abhishek Danej
相关产品推荐
相关产品推荐

