Kubernetes(k8s)pod的探針liveness、readiness詳細教程


Kubernetes pod的探針

探針是由  kubelet 對容器執行的定期診斷。要執行診斷,kubelet 調用由容器實現的  Handler。有三種類型的處理程序:

  • Ø ExecAction:在容器內執行指定命令。如果命令退出時返回碼為 0 則認為診斷成功。
  • Ø TCPSocketAction:對指定端口上的容器的 IP 地址進行 TCP 檢查。如果端口打開,則診斷被認為是成功的。
  • Ø HTTPGetAction:對指定的端口和路徑上的容器的 IP 地址執行 HTTP Get 請求。如果響應的狀態碼大於等於200 且小於 400,則診斷被認為是成功的
     

每次探測都將獲得以下三種結果之一: 

  •  成功:容器通過了診斷。
  • 失敗:容器未通過診斷。
  • 未知:診斷失敗,因此不會采取任何行動
  1. livenessProbe:指示容器是否正在運行。如果存活探測失敗,則 kubelet 會殺死容器,並且容器將受到其 重啟策略 的影響。如果容器不提供存活探針,則默認狀態為 Success
  2. readinessProbe:指示容器是否准備好服務請求。如果就緒探測失敗,端點控制器將從與 Pod 匹配的所有 Service 的端點中刪除該 Pod 的 IP 地址。初始延遲之前的就緒狀態默認為 Failure。如果容器不提供就緒探針,則默認狀態為 Success
     

檢測探針 - 就緒檢測 

readinessProbe-httpget 

apiVersion: v1
kind: Pod
metadata:
  name: readiness-httpget-pod
  namespace: default
spec:
  containers:
  - name: readiness-httpget-container
    image: wangyanglinux/myapp:v1
    imagePullPolicy: IfNotPresent
    readinessProbe:
      httpGet:
        port: 80
        path: /index1.html
      initialDelaySeconds: 1
      periodSeconds: 3

因為這nginx下的80那里,沒有index1.html這個界面

查看Pod的詳細描述

 kubectl describe pod readiness-httpget-pod

查看Pod的日志【一直不斷的探測

kubectl log  readiness-httpget-pod

解決辦法

進入這個容器

kubectl exec  readiness-httpget-pod -it -- /bin/sh
[root@master k8s]# kubectl exec  readiness-httpget-pod -it -- /bin/sh
/ # cd /usr/share/nginx/html/
/usr/share/nginx/html # ls
50x.html    index.html
/usr/share/nginx/html # echo "123" >> index1.html
/usr/share/nginx/html # exit

 

檢測探針 - 存活檢測 

livenessProbe-exec 

apiVersion: v1
kind: Pod
metadata:
  name: liveness-exec-pod
  namespace: default
spec:
  containers:
  - name: liveness-exec-container
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ["/bin/sh","-c","touch /tmp/live ; sleep 60; rm -rf /tmp/live; sleep
3600"]
    livenessProbe:
      exec:
        command: ["test","-e","/tmp/live"]
      initialDelaySeconds: 1
      periodSeconds: 3

檢測/tmp/live,每隔60秒就會被刪除,liveness檢測,如果被刪除,就會返回失敗,重啟pod。陷入無限循環

livenessProbe-httpget 

apiVersion: v1
kind: Pod
metadata:
  name: liveness-httpget-pod
  namespace: default
spec:
  containers:
  - name: liveness-httpget-container
    image: wangyanglinux/myapp:v1
    imagePullPolicy: IfNotPresent
    ports:
    - name: http
      containerPort: 80
    livenessProbe:
      httpGet:
        port: http
        path: /index.html
      initialDelaySeconds: 1
      periodSeconds: 3
      timeoutSeconds: 10

現在進入容器,刪除index.html文件

 kubectl exec liveness-httpget-pod -it -- /bin/sh

livenessProbe-tcp 

apiVersion: v1
kind: Pod
metadata:
  name: probe-tcp
spec:
  containers:
  - name: nginx
    image: wangyanglinux/myapp:v1
    livenessProbe:
      initialDelaySeconds: 5
      timeoutSeconds: 1
      tcpSocket:
        port: 8080
      periodSeconds: 3

檢測8080端口,但是那個端口沒有,就會一直檢測,重啟。

啟動、退出動作 

apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
spec:
  containers:
  - name: lifecycle-demo-container
    image: wangyanglinux/myapp:v1
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler > 
/usr/share/message"]
      preStop:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the poststop handler > 
/usr/share/message"]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM