1、問題
pod啓動或者通過ReplicaSet等控制器啓動pod後,pod的狀態一瞬間呈現Completed狀態,隨後一直顯示CrashLoopBackOff狀態,導致pod一直重啓失敗,如下所示
[root@k8s-master01 sc_work]# kubectl create -f replica_set_example.yaml
replicaset.extensions/nginx-relica created
[root@k8s-master01 sc_work]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-relica-d6fhn 0/1 Completed 0 3s
nginx-relica-gqsbn 0/1 Completed 0 3s
nginx-relica-nvjk5 0/1 Completed 1 3s
[root@k8s-master01 sc_work]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-relica-d6fhn 0/1 CrashLoopBackOff 1 6s
nginx-relica-gqsbn 0/1 CrashLoopBackOff 1 6s
nginx-relica-nvjk5 0/1 CrashLoopBackOff 1 6s
所用的yaml如下所示:
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: nginx-relica
spec:
replicas: 3
selector:
matchLabels:
app: nginx-label
template:
metadata:
labels:
app: nginx-label
spec:
containers:
- name: nginx-pod
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
command: ["/bin/sh", "-c", "echo hello world > /usr/share/nginx/html/hello.html"]
2、原因
當ReplicaSet控制創建3個pod後,3個pod中分別啓動了容器nginx-pod,啓動容器後,以非常短的時間執行 ["/bin/sh", “-c”, “echo hello world > /usr/share/nginx/html/hello.html”]後,容器就要結束了,退出碼爲0,pod狀態爲completed狀態。但ReplicaSet設置的副本數爲3,導致3個pod要重啓,但pod中容器只執行一個command命令就結束,導致pod的生命週期非常短,k8s都來不及啓動就消亡了,導致pod出現CrashLoopBackOff狀態。
3、解決辦法
延長pod的聲明週期,比如yaml改成如下形式,在command中增加sleep延長pod的運行時間。
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: nginx-relica
spec:
replicas: 3
selector:
matchLabels:
app: nginx-label
template:
metadata:
labels:
app: nginx-label
spec:
containers:
- name: nginx-pod
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
#command中增加sleep,延長pod運行時間
command: ["/bin/sh", "-c", "echo hello world > /usr/share/nginx/html/hello.html; sleep 60"]
刪除原來的ReplicaSet後,再重新執行ReplicaSet,pod正常運行
[root@k8s-master01 sc_work]# kubectl create -f replica_set_example.yaml
replicaset.extensions/nginx-relica created
[root@k8s-master01 sc_work]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-relica-4vjl9 1/1 Running 0 4s
nginx-relica-5l7w2 1/1 Running 0 4s
nginx-relica-t6qdc 1/1 Running 0 4s
[root@k8s-master01 sc_work]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-relica-4vjl9 1/1 Running 0 16s
nginx-relica-5l7w2 1/1 Running 0 16s
nginx-relica-t6qdc 1/1 Running 0 16s