容器探測時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
每個人都有潛在的能量,隻是很容易被習慣所掩蓋,被時間所迷離,被惰性所消磨~