即時焦點:Kubernetes中容器探測,你都了解了嗎?
發(fā)稿時間:2023-06-26 22:12:58 來源: 今日頭條
1、概述
容器探測用于檢測容器中的應(yīng)用實例是否正常工作,是保障業(yè)務(wù)可用性的一種傳統(tǒng)機制。如果經(jīng)過探測,實例的狀態(tài)不符合預期,那么kubernetes就會把該問題實例" 摘除 ",不承擔業(yè)務(wù)流量。kubernetes提供了兩種探針來實現(xiàn)容器探測,分別是:
liveness probes:存活性探針,用于檢測應(yīng)用實例當前是否處于正常運行狀態(tài),如果不是,k8s會重啟容器readiness probes:就緒性探針,用于檢測應(yīng)用實例當前是否可以接收請求,如果不能,k8s不會轉(zhuǎn)發(fā)流量livenessProbe 決定是否重啟容器,readinessProbe 決定是否將請求轉(zhuǎn)發(fā)給容器。
上面兩種探針目前均支持三種探測方式:
【資料圖】
…… livenessProbe: exec: command: - cat - /tmp/healthy……
TCPSocket:將會嘗試訪問一個用戶容器的端口,如果能夠建立這條連接,則認為程序正常,否則不正常…… livenessProbe: tcpSocket: port: 8080……
HTTPGet:調(diào)用容器內(nèi)Web應(yīng)用的URL,如果返回的狀態(tài)碼在200和399之間,則認為程序正常,否則不正常…… livenessProbe: httpGet: path: / #URI地址 port: 80 #端口號 host: 127.0.0.1 #主機地址 scheme: HTTP #支持的協(xié)議,http或者https……
2、存活性探針(1)Exec模式創(chuàng)建pod-liveness-exec.yaml。
apiVersion: v1kind: Podmetadata: name: pod-liveness-exec namespace: devspec: containers: - name: nginx image: nginx ports: - name: nginx-port containerPort: 80 livenessProbe: exec: command: ["/bin/cat","/tmp/hello.txt"] # 執(zhí)行一個查看文件的命令
因為/tmp/hello.txt 文件不存在,導致反復重啟容器。
#進入yaml目錄[root@k8s-master ~]# lsanaconda-ks.cfg pod-liveness-exec.yaml[root@k8s-master ~]# clear[root@k8s-master ~]#[root@k8s-master ~]##查看當前dev命名空間下無pod[root@k8s-master ~]# kubectl get pod -n devNo resources found in dev namespace.[root@k8s-master ~]##創(chuàng)建pod[root@k8s-master ~]# kubectl apply -f pod-liveness-exec.yamlpod/pod-liveness-exec created[root@k8s-master ~]##再次查看dev命名空間已創(chuàng)建pod[root@k8s-master ~]# kubectl get pod -n devNAME READY STATUS RESTARTS AGEpod-liveness-exec 0/1 ContainerCreating 0 5s#查看pod詳情[root@k8s-master ~]# kubectl describe pod pod-liveness-exec -n dev#在最下面Events中,容器創(chuàng)建過程報錯Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 28s default-scheduler Successfully assigned dev/pod-liveness-exec to k8s-node2 Normal Pulling 27s kubelet Pulling image "nginx" Normal Pulled 11s kubelet Successfully pulled image "nginx" in 15.48165061s Normal Created 11s kubelet Created container nginx Normal Started 11s kubelet Started container nginx Warning Unhealthy 7s kubelet Liveness probe failed: /bin/cat: /tmp/hello.txt: No such file or directory#再次頻繁查看dev下pod信息可以發(fā)現(xiàn) pod的重啟次數(shù)一直在增加[root@k8s-master ~]# kubectl get pod -n devNAME READY STATUS RESTARTS AGEpod-liveness-exec 1/1 Running 3 (53s ago) 2m54s[root@k8s-master ~]# kubectl get pod -n devNAME READY STATUS RESTARTS AGEpod-liveness-exec 1/1 Running 4 (20s ago) 3m1s
這個時候我們將 yaml改為查看已存在的文件。
apiVersion: v1kind: Podmetadata: name: pod-liveness-exec namespace: devspec: containers: - name: nginx image: nginx ports: - name: nginx-port containerPort: 80 livenessProbe: exec: command: ["/bin/cat","/usr/share/nginx/html/index.html"] # 執(zhí)行一個查看文件的命令 此文件為nginx歡迎頁面 因為我們的容器就是nginx所以這個文件肯定存在的
再看效果:
(2)TCPSocket模式創(chuàng)建pod-liveness-tcpsocket.yaml。
apiVersion: v1kind: Podmetadata: name: pod-liveness-tcpsocket namespace: devspec: containers: - name: nginx image: nginx ports: - name: nginx-port containerPort: 80 livenessProbe: tcpSocket: port: 8080 # 嘗試訪問8080端口,端口不存在
因為容器中8080端口未開通,所以連接失敗。
[root@k8s-master ~]# lsanaconda-ks.cfg pod-liveness-tcpsocket.yaml[root@k8s-master ~]##創(chuàng)建pod[root@k8s-master ~]# kubectl apply -f pod-liveness-tcpsocket.yamlpod/pod-liveness-tcpsocket created[root@k8s-master ~]##獲取pod[root@k8s-master ~]# kubectl get pod -n devNAME READY STATUS RESTARTS AGEpod-liveness-tcpsocket 1/1 Running 0 12s#查看詳情可以看出最后一步 連接被拒絕[root@k8s-master ~]# kubectl describe pod pod-liveness-tcpsocket -n devEvents: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 23s default-scheduler Successfully assigned dev/pod-liveness-tcpsocket to k8s-node2 Normal Pulling 22s kubelet Pulling image "nginx" Normal Pulled 21s kubelet Successfully pulled image "nginx" in 475.556438ms Normal Created 21s kubelet Created container nginx Normal Started 21s kubelet Started container nginx Warning Unhealthy 2s (x2 over 12s) kubelet Liveness probe failed: dial tcp 172.17.169.138:8080: connect: connection refused#頻繁獲取pod詳情可以看出 重啟次數(shù)也在不斷增加[root@k8s-master ~]# kubectl get pod -n devNAME READY STATUS RESTARTS AGEpod-liveness-tcpsocket 1/1 Running 3 (32s ago) 2m13s[root@k8s-master ~]#[root@k8s-master ~]# kubectl get pod -n devNAME READY STATUS RESTARTS AGEpod-liveness-tcpsocket 1/1 Running 3 (46s ago) 2m27s[root@k8s-master ~]#[root@k8s-master ~]# kubectl get pod -n devNAME READY STATUS RESTARTS AGEpod-liveness-tcpsocket 1/1 Running 4 (16s ago) 2m37s
然后將 tcpSocket.port 改為80 再重復以上步驟就會發(fā)現(xiàn),容器正常啟動。
(3)HTTPGet模式創(chuàng)建pod-liveness-httpget.yaml。
apiVersion: v1kind: Podmetadata: name: pod-liveness-httpget namespace: devspec: containers: - name: nginx image: nginx ports: - name: nginx-port containerPort: 80 livenessProbe: httpGet: # 其實就是訪問http://127.0.0.1:80/hello scheme: HTTP #支持的協(xié)議,http或者https port: 80 #端口號 path: /hello #URI地址 此地址不存在
[root@k8s-master ~]##創(chuàng)建pod[root@k8s-master ~]# kubectl apply -f pod-liveness-httpget.yamlpod/pod-liveness-httpget created#獲取pod[root@k8s-master ~]# kubectl get pod -n devNAME READY STATUS RESTARTS AGEpod-liveness-httpget 0/1 ContainerCreating 0 7s[root@k8s-master ~]# kubectl get pod -n devNAME READY STATUS RESTARTS AGEpod-liveness-httpget 0/1 ContainerCreating 0 13s#查看pod詳情 發(fā)現(xiàn)最后HTTP執(zhí)行報404[root@k8s-master ~]# kubectl describe pod pod-liveness-httpget -n devEvents: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 24s default-scheduler Successfully assigned dev/pod-liveness-httpget to k8s-node2 Normal Pulling 23s kubelet Pulling image "nginx" Normal Pulled 8s kubelet Successfully pulled image "nginx" in 15.416092349s Normal Created 8s kubelet Created container nginx Normal Started 8s kubelet Started container nginx Warning Unhealthy 4s kubelet Liveness probe failed: HTTP probe failed with statuscode: 404#頻繁獲取pod,發(fā)現(xiàn)pod重啟次數(shù)不斷增加[root@k8s-master ~]# kubectl get pod -n devNAME READY STATUS RESTARTS AGEpod-liveness-httpget 1/1 Running 0 36s[root@k8s-master ~]# kubectl get pod -n devNAME READY STATUS RESTARTS AGEpod-liveness-httpget 1/1 Running 1 (3s ago) 43s[root@k8s-master ~]# kubectl get pod -n devNAME READY STATUS RESTARTS AGEpod-liveness-httpget 1/1 Running 2 (47s ago) 117s
然后將 httpGet.path 改為/ 再重復以上步驟就會發(fā)現(xiàn),容器正常啟動。
至此,已經(jīng)使用liveness Probe演示了三種探測方式,但是查看livenessProbe的子屬性,會發(fā)現(xiàn)除了這三種方式,還有一些其他的配置,在這里一并解釋下:
[root@k8s-master01 ~]# kubectl explain pod.spec.containers.livenessProbeFIELDS: exec
產(chǎn)業(yè)
- 1 即時焦點:Kubernetes中容器探測,你都了解了嗎?
- 2 【當前獨家】星帥爾: 第五屆董事會第四次會議決議公告
- 3 “深海一號”大氣田投產(chǎn)兩周年 累計生產(chǎn)天然氣超50億立方米
- 4 熱議:郟縣被確定為河南省青年發(fā)展型縣域試點
- 5 盆栽黃楊什么時候整形好_黃楊盆景什么季節(jié)修剪 黃楊盆景哪個季節(jié)修剪 環(huán)球播資訊
- 6 伊利股份(600887)6月26日主力資金凈賣出7198.40萬元|當前快報
- 7 天天熱頭條丨好玩的撲克RPG推薦 有哪些好玩的撲克RPG
- 8 20+所新學校來襲!武漢迎一大批教育資源新消息
- 9 密云黑龍?zhí)禵密云黑龍?zhí)秥天天熱點評
- 10 大業(yè)股份定增遭問詢 要求說明前次募投項目未達預期效益的原因及合理性 實施環(huán)境是否發(fā)生重大不利變化