1. 程式人生 > 其它 >k8s pod啟動後停止問題解決

k8s pod啟動後停止問題解決

狀態:有個k8s tomcat應用 ,pod 啟動後,狀態由ContainerCreating變為Completed再變為CrashLoopBackOff

一開始以為docker容器問題,又由於在伺服器執行,沒有許可權檢視更具體情況。就決定在本地伺服器編譯、docker build、docker run ,在本地伺服器驗證沒有問題,再在伺服器上處理
1、本地編譯,下載程式碼:git clone http://gitlab.testdomain.com/ps_oa_project/ps_oa_bt.git -b master
2、安裝maven,配置setting 檔案並配置setting檔案
3、編譯:cd coreoa-proxy ;mvn clean package -pl coreoa-proxy-service -am -Dmaven.test.skip=true
4、由於編譯伺服器沒有安裝docker ,把編譯後的所有專案檔案scp到另外一臺安裝了docker服務的測試伺服器上130.223.212.105
5、下載tomcat映象,由於安裝docker測試伺服器無法連映象伺服器下載tomcat映象,在容器叢集節點上下載,執行命令:

docker login --username=user hub.testdomain.com
docker pull hub.testdomain.com/platform/test-tomcat:v1.0

6、把下載後的映象匯出、傳輸到測試docker伺服器,匯入映象

docker save -o test-tomcat.tar hub.testdomain.com/platform/test-tomcat:v1.0
scp test-tomcat.tar 130.223.212.105:/opt/pmo

在docker測試伺服器執行:
docker load -i test-tomcat.tar

7、這樣測試伺服器本地就有docker基礎映象和編譯後的war包等docker build必要檔案,其中Dockerfile內容為

FROM hub.testdomain.com/platform/test-tomcat:v1.0
ENV CATALINA_BASE=/opt/pmo/tomcat
ENV CATALINA_HOME=/opt/pmo/tomcat
RUN rm -fr /opt/pmo/tomcat/bin/catalina.sh
COPY coreoa-proxy-service/target/coreoa-proxy.war /opt/pmo/tomcat/webapps/coreoa-proxy.war
COPY catalina.sh /opt/pmo/tomcat/bin/
RUN chmod +x /opt/pmo/tomcat/bin/*.sh
ENTRYPOINT sh /opt/pmo/tomcat/bin/startup.sh


8、只保留Dockerfile前三行,剩餘行都註釋,docker build 並啟動,命令為:

docker build -f Dockerfile -t oa1 .
docker run -d --name oa1 oa1

9、啟動後,還是同樣失敗,針對最少操作還是失敗,網上查詢,說加個死迴圈命令,修改Dockerfile內容為:

FROM hub.testdomain.com/platform/test-tomcat:v1.0
ENV CATALINA_BASE=/opt/pmo/tomcat
ENV CATALINA_HOME=/opt/pmo/tomcat
RUN rm -fr /opt/pmo/tomcat/bin/catalina.sh
COPY coreoa-proxy-service/target/coreoa-proxy.war /opt/pmo/tomcat/webapps/coreoa-proxy.war
COPY catalina.sh /opt/pmo/tomcat/bin/
RUN chmod +x /opt/pmo/tomcat/bin/*.sh
ENTRYPOINT sh /opt/pmo/tomcat/bin/startup.sh & while true;do echo hello;sleep 5;done

10、啟動後,容器狀態能持續為Up狀態,說明啟動成功了,但是加了個死迴圈(一般不會這樣操作),並且執行docker logs oa1 看不到任何tomcat日誌。日誌輸出的是死迴圈列印hello,如想要輸出tomcat日誌,需要像執行死迴圈一樣能在console列印日誌。諮詢運維同事,說tomcat 有一種console啟動,查詢一下,啟動方式為:sh /opt/pmo/tomcat/bin/catalina.sh run。console啟動後,console直接輸出日誌,於是修改Dockerfile 程式碼為:

FROM hub.testdomain.com/platform/test-tomcat:v1.0
ENV CATALINA_BASE=/opt/pmo/tomcat
ENV CATALINA_HOME=/opt/pmo/tomcat
RUN rm -fr /opt/pmo/tomcat/bin/catalina.sh
COPY coreoa-proxy-service/target/coreoa-proxy.war /opt/pmo/tomcat/webapps/coreoa-proxy.war
COPY catalina.sh /opt/pmo/tomcat/bin/
RUN chmod +x /opt/pmo/tomcat/bin/*.sh
ENTRYPOINT sh /opt/pmo/tomcat/bin/catalina.sh run

11、重新docker build 和docker run,容器可以持續Up狀態,說明狀態正常

docker stop oa1
docker rm oa1
docker rmi oa1
docker build -f Dockerfile -t oa1 .
docker run -d --name oa1 oa1
docker ps -a

執行結果:
[root@centos-test coreoa-proxy]# docker ps -a |grep oa1
567d9b6f16a9 oa1 "/bin/sh -c 'sh /opt…" 13 seconds ago Up 12 seconds 8080/tcp oa1

12、修改Dockerfile檔案,上傳程式碼庫,重新在伺服器上編譯執行,還是不行,說明k8s 的command 命令覆蓋Dockerfile的ENTRYPOINT命令,修改k8s模板命令。重新編譯部署,啟動正常

command: ["sh","-c","/opt/pmo/tomcat/bin/startup.sh"]
修改為:
command: ["sh","-c","/opt/pmo/tomcat/bin/catalina.sh run"]


總結:
1、pod 是否能持續執行,是由執行命令決定的,執行命令如果一執行就停止,控制檯也停止持續輸出,pod生命週期就結束,pod狀態就會變成CrashLoopBackOff
2、docker file 修改的:ENTRYPOINT sh /opt/pmo/tomcat/bin/catalina.sh run ,在k8s裡面,會被k8s模板的command 命令覆蓋

歡迎加入自動化測試交流QQ群:143535941 ,進群問題回答:testway

歡迎關注技術公眾號: