Pod详解-生命周期-容器探测
容器探測用于檢測容器中的應用實例是否正常工作,是保障業務可用性的一種傳統機制。如果經過探測,實例的狀態不符合預期,那么kubernetes就會把該問題實例" 摘除 ",不承擔業務流量。kubernetes提供了兩種探針來實現容器探測,分別是:
-
liveness probes:存活性探針,用于檢測應用實例當前是否處于正常運行狀態,如果不是,k8s會重啟容器
-
readiness probes:就緒性探針,用于檢測應用實例當前是否可以接收請求,如果不能,k8s不會轉發流量
livenessProbe 決定是否重啟容器,readinessProbe 決定是否將請求轉發給容器。
上面兩種探針目前均支持三種探測方式:
-
Exec命令:在容器內執行一次命令,如果命令執行的退出碼為0,則認為程序正常,否則不正常
TCPSocket:將會嘗試訪問一個用戶容器的端口,如果能夠建立這條連接,則認為程序正常,否則不正常
…… livenessProbe:tcpSocket:port: 8080 ……HTTPGet:調用容器內Web應用的URL,如果返回的狀態碼在200和399之間,則認為程序正常,否則不正常
……livenessProbe:httpGet:path: / #URI地址port: 80 #端口號host: 127.0.0.1 #主機地址scheme: HTTP #支持的協議,http或者https ……下面以liveness probes為例,做幾個演示:
方式一:Exec
創建pod-liveness-exec.yaml
apiVersion: v1 kind: Pod metadata:name: pod-liveness-execnamespace: dev spec:containers:- name: nginximage: nginx:1.17.1ports: - name: nginx-portcontainerPort: 80livenessProbe:exec:command: ["/bin/cat","/tmp/hello.txt"] # 執行一個查看文件的命令創建pod,觀察效果
# 創建Pod [root@k8s-master01 ~]# kubectl create -f pod-liveness-exec.yaml pod/pod-liveness-exec created# 查看Pod詳情 [root@k8s-master01 ~]# kubectl describe pods pod-liveness-exec -n dev ......Normal Created 20s (x2 over 50s) kubelet, node1 Created container nginxNormal Started 20s (x2 over 50s) kubelet, node1 Started container nginxNormal Killing 20s kubelet, node1 Container nginx failed liveness probe, will be restartedWarning Unhealthy 0s (x5 over 40s) kubelet, node1 Liveness probe failed: cat: can't open '/tmp/hello11.txt': No such file or directory# 觀察上面的信息就會發現nginx容器啟動之后就進行了健康檢查 # 檢查失敗之后,容器被kill掉,然后嘗試進行重啟(這是重啟策略的作用,后面講解) # 稍等一會之后,再觀察pod信息,就可以看到RESTARTS不再是0,而是一直增長 [root@k8s-master01 ~]# kubectl get pods pod-liveness-exec -n dev NAME READY STATUS RESTARTS AGE pod-liveness-exec 0/1 CrashLoopBackOff 2 3m19s# 當然接下來,可以修改成一個存在的文件,比如/tmp/hello.txt,再試,結果就正常了......方式二:TCPSocket
創建pod-liveness-tcpsocket.yaml
apiVersion: v1 kind: Pod metadata:name: pod-liveness-tcpsocketnamespace: dev spec:containers:- name: nginximage: nginx:1.17.1ports: - name: nginx-portcontainerPort: 80livenessProbe:tcpSocket:port: 8080 # 嘗試訪問8080端口創建pod,觀察效果
# 創建Pod [root@k8s-master01 ~]# kubectl create -f pod-liveness-tcpsocket.yaml pod/pod-liveness-tcpsocket created# 查看Pod詳情 [root@k8s-master01 ~]# kubectl describe pods pod-liveness-tcpsocket -n dev ......Normal Scheduled 31s default-scheduler Successfully assigned dev/pod-liveness-tcpsocket to node2Normal Pulled <invalid> kubelet, node2 Container image "nginx:1.17.1" already present on machineNormal Created <invalid> kubelet, node2 Created container nginxNormal Started <invalid> kubelet, node2 Started container nginxWarning Unhealthy <invalid> (x2 over <invalid>) kubelet, node2 Liveness probe failed: dial tcp 10.244.2.44:8080: connect: connection refused# 觀察上面的信息,發現嘗試訪問8080端口,但是失敗了 # 稍等一會之后,再觀察pod信息,就可以看到RESTARTS不再是0,而是一直增長 [root@k8s-master01 ~]# kubectl get pods pod-liveness-tcpsocket -n dev NAME READY STATUS RESTARTS AGE pod-liveness-tcpsocket 0/1 CrashLoopBackOff 2 3m19s# 當然接下來,可以修改成一個可以訪問的端口,比如80,再試,結果就正常了......方式三:HTTPGet
創建pod-liveness-httpget.yaml
apiVersion: v1 kind: Pod metadata:name: pod-liveness-httpgetnamespace: dev spec:containers:- name: nginximage: nginx:1.17.1ports:- name: nginx-portcontainerPort: 80livenessProbe:httpGet: # 其實就是訪問http://127.0.0.1:80/hello scheme: HTTP #支持的協議,http或者httpsport: 80 #端口號path: /hello #URI地址創建pod,觀察效果
# 創建Pod [root@k8s-master01 ~]# kubectl create -f pod-liveness-httpget.yaml pod/pod-liveness-httpget created# 查看Pod詳情 [root@k8s-master01 ~]# kubectl describe pod pod-liveness-httpget -n dev .......Normal Pulled 6s (x3 over 64s) kubelet, node1 Container image "nginx:1.17.1" already present on machineNormal Created 6s (x3 over 64s) kubelet, node1 Created container nginxNormal Started 6s (x3 over 63s) kubelet, node1 Started container nginxWarning Unhealthy 6s (x6 over 56s) kubelet, node1 Liveness probe failed: HTTP probe failed with statuscode: 404Normal Killing 6s (x2 over 36s) kubelet, node1 Container nginx failed liveness probe, will be restarted# 觀察上面信息,嘗試訪問路徑,但是未找到,出現404錯誤 # 稍等一會之后,再觀察pod信息,就可以看到RESTARTS不再是0,而是一直增長 [root@k8s-master01 ~]# kubectl get pod pod-liveness-httpget -n dev NAME READY STATUS RESTARTS AGE pod-liveness-httpget 1/1 Running 5 3m17s# 當然接下來,可以修改成一個可以訪問的路徑path,比如/,再試,結果就正常了......至此,已經使用liveness Probe演示了三種探測方式,但是查看livenessProbe的子屬性,會發現除了這三種方式,還有一些其他的配置,在這里一并解釋下:
[root@k8s-master01 ~]# kubectl explain pod.spec.containers.livenessProbe FIELDS:exec <Object> tcpSocket <Object>httpGet <Object>initialDelaySeconds <integer> # 容器啟動后等待多少秒執行第一次探測timeoutSeconds <integer> # 探測超時時間。默認1秒,最小1秒periodSeconds <integer> # 執行探測的頻率。默認是10秒,最小1秒failureThreshold <integer> # 連續探測失敗多少次才被認定為失敗。默認是3。最小值是1successThreshold <integer> # 連續探測成功多少次才被認定為成功。默認是1下面稍微配置兩個,演示下效果即可:
[root@k8s-master01 ~]# more pod-liveness-httpget.yaml apiVersion: v1 kind: Pod metadata:name: pod-liveness-httpgetnamespace: dev spec:containers:- name: nginximage: nginx:1.17.1ports:- name: nginx-portcontainerPort: 80livenessProbe:httpGet:scheme: HTTPport: 80 path: /initialDelaySeconds: 30 # 容器啟動后30s開始探測timeoutSeconds: 5 # 探測超時時間為5s總結
以上是生活随笔為你收集整理的Pod详解-生命周期-容器探测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Pod详解-生命周期-钩子函数
- 下一篇: CompletableFuture异步调