首页 > 解决方案 > Kubernetes 上的 httpd Docker 映像 CrashLoopBackOff

问题描述

我有一个简单的 docker 镜像,在本地运行良好。它与 apache 的httpd 页面上的示例基本相同。

FROM httpd:2.4
COPY ./public-html/ /usr/local/apache2/htdocs/

根据页面示例,我可以按如下方式构建和运行我的图像:

$ docker build -t gcr.io/${PROJECT_ID}/hello-app:v1 .

$ docker run -dit --name my-running-app -p 8080:80 <img_id>

然后我转到 http://localhost:8080 ,一切似乎都在正常工作。

但是,当我尝试为我的 Google Cloud Kubernetes 实例创建部署时,我的 pod 失败并进入CrashLoopBackOff. (这是在我将图像推送到 Google Cloud Registry 之后,以便部署可以从那里获取图像。)

我认为这个CrashLoopBackOff问题是由于我没有ENTRYPOINT容器而发生的;即,pod 生成,没有发出任何命令,然后它完成并崩溃。

那我有2个问题:

  1. 我应该在我的 Dockerfile 中添加什么命令来启动 http 服务器并在 pod 上运行(假设我对问题的评估确实是正确的)?
  2. 这是如何在本地运行的?本地我干脆$ docker run -dit --name my-running-app -p 8080:80 <img_id>。我没有指定容器应该运行 httpd,但它可以吗?这是怎么回事?

编辑 - 附加信息:

我通过执行以下操作部署到 K8 上:

$ kubectl create deployment hello-app --image=gcr.io/${PROJECT_ID}/hello-app:v1

Kubectl 日志:

$ kubectl logs <pod_name>

standard_init_linux.go:211: exec user process caused "exec format error"

kubectl 描述:

$ kubectl describe pod hello-app-6b89cd98f6-gn65p

Name:         <name>
Namespace:    default
Priority:     0
Node:         <my_node>
Start Time:   Mon, 22 Mar 2021 12:32:51 +0200
Labels:       app=hello-app
              pod-template-hash=6b89cd98f6
Annotations:  <none>
Status:       Running
IP:           10.12.1.13
IPs:
  IP:           10.12.1.13
Controlled By:  <replica_set>
Containers:
  hello-app:
    Container ID:   <cid>
    Image:          <img>
    Image ID:       <img_id>
    Port:           <none>
    Host Port:      <none>
    State:          Waiting
      Reason:       CrashLoopBackOff
    Last State:     Terminated
      Reason:       Error
      Exit Code:    1
      Started:      Mon, 22 Mar 2021 15:12:18 +0200
      Finished:     Mon, 22 Mar 2021 15:12:18 +0200
    Ready:          False
    Restart Count:  36
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-b8p9t (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             False 
  ContainersReady   False 
  PodScheduled      True 
Volumes:
  default-token-b8p9t:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-b8p9t
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type     Reason   Age                    From     Message
  ----     ------   ----                   ----     -------
  Warning  BackOff  4m9s (x741 over 164m)  kubelet  Back-off restarting failed container

标签: dockerapachekubernetes

解决方案


CrashLoopBackOff错误意味着 pod 不断崩溃,kubernetes 已经放弃了。您必须确定导致崩溃的原因。总的来说,问题的原因可能是:

您可以在创建 pod 时键入watch kubectl describe <pod-name>以检查事件。但是如果 Pod 启动后崩溃,则需要获取容器日志kubectl logs -f <your-pod-name>

阅读更多:kubernetes-crashloopbackoff

正如@ Krishna Chaurasia所说,检查暗示正在运行的默认命令不是可执行文件的 线程 - 不同平台的可执行格式可能不同。正如@Sagar Velankar提到的,在 Docker 文件中使用FROMline --platformflag 来指定 linux/amd64 作为目标架构。请参阅: dockerfile-from

您可以使用docker buildx docs.docker.com/docker-for-mac/multi-arch来构建和推送多架构镜像,kubelet 将使用正确架构拉取镜像。


推荐阅读