CrashLoopBackOff:
The issue caused by the docker container which exits as soon as the "start" process finishes.
这个问题的原因是docker container在运行start之后很快退出。
那说明pull docker image步骤已经完成了,但是在运行docker image的时候出现了问题。
我在实际中遇到的情况,Docker image 源码如下:
FROM websphere-liberty:javaee8
MAINTAINER AliceDong "[email protected]"
ARG PACKAGE_NAME
COPY build/libs/${PACKAGE_NAME} /config/dropins/application.war
打包部署到K8S Server 上 deployment 情况:
kubectl get deployment -n
Deployment 显示:
$ kubectl get deployment -n vt-provint
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
application-deployment 1 0 0 0 1m
查看K8s 上pod情况:
kubectl get pod -n
pod 情况:
$ kubectl get pods -n
NAME READY STATUS RESTARTS AGE
application-pod 0/1 RunContainerError 0 3s
查看pod logs:
kubectl logs pod/application-pod -n
没有显示任何内容...
接下来查看pod 的 description:
kubectl describe pod application-deployment -n
显示结果:
$ kubectl -n describe pod application-deployment-6bf7967cdc-hsrf8
Name: application-deployment-6bf7967cdc-hsrf8
Namespace:
Priority: 0
PriorityClassName:
Node: x.x.x.x/x.x.x.x
Start Time: Thu, 17 Jan 2019 17:38:33 +0800
Labels: app=
pod-template-hash=2693523787
Annotations: kubernetes.io/psp: xxxx
Status: Running
IP: 172.30.144.233
Controlled By: ReplicaSet/appliction-deployment-6bf7967cdc
Containers:
Container ID: containerd://0d2d852ab2abbb1b671edcb604c60664904caed784eb1d2e0da3e49bd18b1ff3
Image: artifactory.xxx.com/integration/application:1.40
Image ID: artifactory.xxx.com/integration/application@
sha256:666ddc327750acfe3051984327c7b0644e4ab4baf141fb5edc26781b6d7e7ed8
Port:
State: Terminated
Reason: Error
Exit Code: 1
...
基本上就是没有得到任何有用的信息,感觉似乎就是卡在这里了。
下一步,把docker image 拉取到本地
docker pull artifactory.xxx.com/integration/application:1.40
尝试在本地build并运行docker image:
docker run -it -p 9080:9080 application:1.40 /bin/bash
尝试在docker container里面启动liberty server
$ /opt/ibm/wlp/bin/server run defaultServer
这一步是成功的。
然后尝试在local 用docker语句启动 liberty
docker run -p 9080:9080 -d application:1.40
启动失败了,显示为exit。
到这里似乎找到了问题的原因,在Dockerfile里面缺失了liberty启动的CMD 语句,导致K8s尝试运行image的时候找不到入口,
表象是显示CrashLoopBackOff, 实际上是没有运行语句,导致启动后马上退出了。
解决办法:
在Dockerfile最后一行加入程序入口语句:
CMD ["/opt/ibm/wlp/bin/server", "run", "defaultServer"]
整个Dockerfile看起来就是这样的:
FROM websphere-liberty:javaee8
MAINTAINER AliceDong "[email protected]"
ARG PACKAGE_NAME
COPY build/libs/${PACKAGE_NAME} /config/dropins/application.war
CMD ["/opt/ibm/wlp/bin/server", "run", "defaultServer"]
重新build docker image,成功,
运行docker run语句,成功,
部署到K8s上,启动成功。
问题完美解决~
总结:
CrashLoopBackOff 是docker image部署到K8s上面经常遇到的问题,基本的原因都是Dockerfile中CMD语句错误或者找不到container入口语句导致了快速退出。
如果遇到类似问题,可以首先检查Dockerfile中的CMD 语句是否确实或者是否有语法错误。