Kubernetes中应用启动后又挂掉的解决思路
之前有人问我为什么Kubernetes中的应用已启动就会挂掉,今天就来聊聊这件事。
其实,k8s 中应用启动后就挂掉是一个非常常见的现象。本文将通过案例模拟这种现象,以及提供一些解决思路和方法。
首先我们创建一个deployment ,其应用会很快挂掉:
当然先检查集群状态
集群没有问题,我们进行案例测试验证
创建容器中,一会儿后,会发现STATUS变为CrashLoopBackOff的错误,也就是说左边的容器一直没有变为READY。当然这排除了我们拼写错误的前提之下来进行的测试。
这个现象告诉我们Kubernetes正在尽力启动这个pod,但是一个或多个容器已经挂了,或者正在被删除。
解决的思路就是:先定位这个状态问题,然后使用describe去查看这个pod创建等更多的信息
这个比较长久不太方便截图,就直接看代码吧,截图解决看下面的截图。
[root@master01 ~]# kubectl describe pod crasher-95bc688d7-6p7cn
Name: crasher-95bc688d7-6p7cn
Namespace: default
Priority: 0
PriorityClassName: <none>
Node: 192.168.0.130/192.168.0.130
Start Time: Thu, 28 May 2020 11:34:50 +0800
Labels: pod-template-hash=95bc688d7
run=crasher
Annotations: <none>
Status: Running
IP: 172.17.70.4
Controlled By: ReplicaSet/crasher-95bc688d7
Containers:
crasher:
Container ID: docker://fffb471ab7d1e7c071d90b8a9558e330f5f075a34562b248a421d6fc572ab185
Image: rosskukulinski/crashing-app
Image ID: docker-pullable://rosskukulinski/crashing-app@sha256:5f7a1a3425f3e8eeaa5b0be0f3948ee6cf5380f75d95f0c96e549e91cf98db1d
Port: <none>
Host Port: <none>
State: Waiting
Reason: CrashLoopBackOff
Last State: Terminated
Reason: Error
Exit Code: 1
Started: Thu, 28 May 2020 11:39:41 +0800
Finished: Thu, 28 May 2020 11:39:42 +0800
Ready: False
Restart Count: 5
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-sj4gb (ro)
Conditions:
Type Status
Initialized True
Ready False
ContainersReady False
PodScheduled True
Volumes:
default-token-sj4gb:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-sj4gb
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 7m15s default-scheduler Successfully assigned default/crasher-95bc688d7-6p7cn to 192.168.0.130
Normal Pulled 5m12s (x4 over 6m48s) kubelet, 192.168.0.130 Successfully pulled image "rosskukulinski/crashing-app"
Normal Created 5m12s (x4 over 6m48s) kubelet, 192.168.0.130 Created container
Normal Started 5m12s (x4 over 6m47s) kubelet, 192.168.0.130 Started container
Normal Pulling 4m20s (x5 over 7m14s) kubelet, 192.168.0.130 pulling image "rosskukulinski/crashing-app"
Warning BackOff 2m9s (x17 over 6m28s) kubelet, 192.168.0.130 Back-off restarting failed container
请看下图红色方框信息
表示这个pod正在被terminated,这是因为容器中的应用挂了,而且我们发现其退出码为1。
为什么会挂掉呢?你去查看日志就会大吃一惊:没有日志!!!
[root@master01 ~]# kubectl logs crasher-95bc688d7-6p7cn
[root@master01 ~]# kubectl logs crasher-95bc688d7-6p7cn --previous//查看前一个容器
这就很尴尬了,接下来的思路就是我们需要给应用加一些启动日志,来定位问题,也可以在本地运行这个容器,来确定是否确实环境变量或者是挂载卷的问题
以上就该问题的主要解决思路,希望大家采纳!