天天看點

容器探針

容器探測時pod對象生命周期中的一項重要的日常任務,它是kubelet對容器周期性執行的健康狀态診斷,診斷操作由容器的處理器進行定義。k8s支援三種容器探針用于pod探測:

  • ExecAction:在容器中執行一個指令,并根據其傳回的狀态碼進行診斷的操作稱為Exec探測,狀 态碼為0表示成功,否則即為不健康狀态
  • TCPSocketAction:通過與容器的某TCP端口嘗試建立連接配接進行診斷,端口能夠成功打開即為正 常,否則為不健康狀。
  • HTTPGetAction:通過向容器IP位址的某指定端口的指定path發起HTTP GET請求進行診斷,響應 碼大于等于200且小于400時即為成功

任何一種探測方式都可能存在三種結果:

  • success(成功):容器通過了診斷
  • failure(失敗):容器未通過了診斷
  • unknown(未知):診斷失敗,是以不會采取任何行動

kubelet可在活動容器上執行兩種類型的檢測:

  • (livenessProbe)存活性檢測:用于判定容器是否處于運作狀态,一旦此類檢測未通過,kubelet将殺死容器并根據restartPolicy決定是否将其重新開機;未定義存活性檢測的容器的預設狀态未success
  • (readinessProbe)就緒性檢測:用于判斷容器是否準備就緒并可對外提供服務;未通過檢測的容器意味着尚未準備就緒,端點控制器會将其IP從所有比對到此pod對象的service對象的端點清單中移除;檢測通過之後,會再次将其IP添加至端點清單中。

案例

準備鏡像

docker pull busybox:1.32.0
docker pull nginx:1.17.10-alpine
           

readinessProbe(就緒檢測)

readinessprobe.yml

apiVersion: v1
kind: Pod
metadata:
  name: readinessprobe-test
  labels:
    app: readinessprobe-test
spec:
  containers:
    - name: readinessprobe-test
      image: nginx:1.17.10-alpine
      imagePullPolicy: IfNotPresent
      readinessProbe:
        httpGet:
          port: 80
          path: /index1.html
        initialDelaySeconds: 1
        periodSeconds: 3
  restartPolicy: Always
           

檢視

建立pod
kubectl apply -f readinessprobepod.yml

檢查pod狀态,雖然pod狀态顯示running但是ready顯示0/1,因為就緒檢查未通過
kubectl get pods

檢視pod詳細資訊,檔案最後一行顯示readiness probe failed。。。。
kubectl describe pod readinessprobe-pod

進入pod内部,因為是alpine系統,需要使用sh指令
kubectl exec -it readinessprobe-pod sh

進入容器内目錄
cd /usr/share/nginx/html/

追加一個index1.html檔案
echo "welcome lagou" >> index1.html

退出容器,再次檢視pod狀态,pod已經正常啟動
exit
kubectl get pods
           

livenessProbe(存活檢測)

案例一

livenessprobepod.yml

apiVersion: v1
kind: Pod
metadata:
  name: livenessprobe-test
  labels:
    app: livenessprobe-test
spec:
  containers:
    - name: livenessprobe-test
      image: busybox:1.32.0
      imagePullPolicy: IfNotPresent
      command: [ "/bin/sh","-c","touch /tmp/livenesspod ; sleep 30; rm -rf /tmp/livenesspod; sleep 3600"]
      livenessProbe:
        exec:
          command: ["test","-e","/tmp/livenesspod"]
        initialDelaySeconds: 1
        periodSeconds: 3
  restartPolicy: Always
           

執行

建立pod
kubectl apply -f livenessprobepod.yml

監控pod狀态變化,容器正常啟動
kubectl get pod -w

等待30秒後,發現pod的RESTARTS值從0變為1.說明pod已經重新開機一次
           
案例二

livenessprobenginxpod.yml

apiVersion: v1
kind: Pod
metadata:
name: livenessprobenginx-pod
labels:
 app: livenessprobenginx-pod
spec:
containers:
 - name: livenessprobenginx-pod
  image: nginx:1.17.10-alpine
  imagePullPolicy: IfNotPresent
  ports:
   - containerPort: 80
    name: nginxhttpget
  livenessProbe:
   httpGet:
    port: 80
    path: /index.html
   initialDelaySeconds: 1
   periodSeconds: 3
   timeoutSeconds: 10
restartPolicy: Always
           
建立pod
kubectl apply -f livenessprobenginxpod.yml

檢視pod狀态
kubectl get pod

檢視容器IP,通路index.html頁面。index.html頁面可以正常通路。
kubectl get pod -o wide
curl 10.81.58.199

進入容器内部
kubectl exec -it livenessprobenginx-pod sh

删除index.html檔案,退出容器
rm -rf //usr/share/nginx/html/index.html
exit

再次監控pod狀态,等待一段時間後,發現pod的RESTARTS值從0變為1.說明pod已經重新開機一次。
kubectl get pod -w

進入容器删除檔案一條指令執行rm -rf指令後退出容器。
kubectl exec -it livenessprobenginx-pod -- rm -rf
/usr/share/nginx/html/index.html

再次監控pod狀态,等待一段時間後,發現pod的RESTARTS值從1變為2.說明pod已經重新開機一次。
kubectl get pod -w

因為liveness監控index.html頁面已經被删除,是以pod需要重新啟動,重新開機後又重新建立nginx
鏡像。nginx鏡像中預設有index.html頁面。
           
案例三

livenessprobenginxpod2.yml

apiVersion: v1
kind: Pod
metadata:
name: livenessprobenginx-pod2
labels:
 app: livenessprobenginx-pod2
spec:
containers:
 - name: livenessprobenginx-pod2
  image: nginx:1.17.10-alpine
  imagePullPolicy: IfNotPresent
  livenessProbe:
   tcpSocket:
    #監測8080端口,如果8080端口沒有回報資訊,重新開機pod
    port: 8080
   initialDelaySeconds: 10
   periodSeconds: 3
   timeoutSeconds: 5
restartPolicy: Always
           
建立pod
kubectl apply -f livenessprobenginxpod2.yml

檢視pod狀态
kubectl get pod -w

存活檢測監聽8080端口,8080端口沒有回報資訊後重新開機pod,RESTARTS值從0變為1
           

每個人都有潛在的能量,隻是很容易被習慣所掩蓋,被時間所迷離,被惰性所消磨~

pod

繼續閱讀