Kubernetes 上的 httpd Docker 图片 CrashLoopBackOff
httpd Docker image CrashLoopBackOff on Kubernetes
我有一个简单的 docker 图像,它在本地运行良好。
和apache的httpd page.
上的例子基本一样
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个问题:
- 我应该向我的 Dockerfile 添加什么命令来启动 http 服务器并 运行在 pod 上运行(假设我对问题的评估确实是正确的)?
- 运行在当地如何?在本地我只是
$ 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
CrashLoopBackOff
错误意味着 pod 不断崩溃并且 kubernetes 已经放弃了它。您必须确定导致崩溃的原因。
总的来说,问题的原因可能是:
- 容器内的应用一直崩溃
您可以键入 watch kubectl describe <pod-name>
以在创建 pod 时检查事件。但是如果pod启动后crash,需要获取容器日志kubectl logs -f <your-pod-name>
.
阅读更多:kubernetes-crashloopbackoff.
如@Krishna Chaurasia said check the which is implying that the default command being run is not an executable - executable formats could be different for different platforms. As @Sagar Velankar mentioned use in Docker file in FROM
line --platform
flag to specify linux/amd64 as the target architecture. See: dockerfile-from.
您可以使用 docker buildx docs.docker.com/docker-for-mac/multi-arch 构建和推送多架构镜像,kubelet 将拉取具有正确架构的镜像。
我有一个简单的 docker 图像,它在本地运行良好。 和apache的httpd page.
上的例子基本一样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个问题:
- 我应该向我的 Dockerfile 添加什么命令来启动 http 服务器并 运行在 pod 上运行(假设我对问题的评估确实是正确的)?
- 运行在当地如何?在本地我只是
$ 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
CrashLoopBackOff
错误意味着 pod 不断崩溃并且 kubernetes 已经放弃了它。您必须确定导致崩溃的原因。
总的来说,问题的原因可能是:
- 容器内的应用一直崩溃
您可以键入 watch kubectl describe <pod-name>
以在创建 pod 时检查事件。但是如果pod启动后crash,需要获取容器日志kubectl logs -f <your-pod-name>
.
阅读更多:kubernetes-crashloopbackoff.
如@Krishna Chaurasia said check the FROM
line --platform
flag to specify linux/amd64 as the target architecture. See: dockerfile-from.
您可以使用 docker buildx docs.docker.com/docker-for-mac/multi-arch 构建和推送多架构镜像,kubelet 将拉取具有正确架构的镜像。