繁体   English   中英

为什么 kubernetes pod 无法运行 docker 镜像

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM