Kubernates部署Liberty Docker image时pod出现CrashLoopBackOff问题并解决办法

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 语句是否确实或者是否有语法错误。

 

 

 

 

你可能感兴趣的:(Docker)