pod狀態CrashLoopBackOff

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章