[英]Why kubernetes pod fails to run docker image
我创建了一个永远运行的简单可执行二进制文件program
:
// pseudocode
while (true) {
print("Sleeping")
sleep(seconds(1));
}
然后我使用这样的Dockerfile
dockerise 这个程序:
FROM debian:10
ADD program /
ENTRYPOINT ["/program"]
然后我构建 docker 镜像并将其推送到全局存储库:
docker build -t docker:5000/program .
docker push docker:5000/program
然后我为这个程序创建了一个deploy.yaml
文件,以便在 kubernetes pod 上运行:
apiVersion: v1
kind: Pod
metadata:
name: program
namespace: my_namespace
spec:
containers:
- name: program
image: docker:5000/program
imagePullPolicy: Always
command: ["echo", "SUCCESS"]
最后,我在 kubernetes 上启动程序:
kubectl create -f deploy.yaml
但是, kubectl describe pods -n my_namespace program
报告:
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 27m default-scheduler Successfully assigned
mariusl/ingress to mma7-standard5-ime
Normal Created 26m (x4 over 27m) kubelet, mma7-standard5-ime Created container
ingress
Normal Started 26m (x4 over 27m) kubelet, mma7-standard5-ime Started container
ingress
Normal Pulling 25m (x5 over 27m) kubelet, mma7-standard5-ime Pulling image
"docker:5000/program"
Normal Pulled 25m (x5 over 27m) kubelet, mma7-standard5-ime Successfully pulled
image "docker:5000/program"
Warning BackOff 2m (x117 over 27m) kubelet, mma7-standard5-ime Back-off restarting
failed container
在我的解释中,这意味着程序无法执行并反复重新启动。 为什么会发生这种情况?
您的 pod 配置了command: ["echo", "SUCCESS"]
这将覆盖ENTRYPOINT ["/program"]
,因此,您的容器只会echo SUCCESS
并立即终止。
请注意,在Kubernetes 中, command
将覆盖 Docker 容器中的entrypoint
,而args
将覆盖 Docker 容器中的cmd
。
您可以删除行command: ["echo", "SUCCESS"]
并且 pod 将启动并运行!
当你覆盖默认的 Entrypoint 和 Cmd 时,这些规则适用: 阅读这里
1) 如果您不为容器提供命令或参数,则使用 Docker 镜像中定义的默认值。
2) 如果您为容器提供命令但没有参数,则仅使用提供的命令。 Docker 镜像中定义的默认 EntryPoint 和默认 Cmd 将被忽略。
3) 如果您只为容器提供 args,则 Docker 映像中定义的默认入口点将使用您提供的 args 运行。
4) 如果你提供一个命令和参数,Docker 镜像中定义的默认 Entrypoint 和默认 Cmd 将被忽略。 您的命令与您的参数一起运行。
您的容器执行 echo "SUCCESS" 并终止,请参阅https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/#notes
kubernetes 中的command
会覆盖 docker 中的entrypoint
。 但这并不能解释容器失败的原因。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.