[單master節點k8s部署]8.pod健康探測

k8s默認的健康檢查機制是,每個容器都有一個監控進程,如果進程退出時返回碼非零,則認為容器發生故障。

存活探測

監測pod是否處于運行狀態,當liveness probe探測失敗的時候,根據重啟策略判斷是否需要重啟。適用于需要在容器發生故障時需要立即重啟的狀態。

用指定的方式(exec,tcp,http等)監測pod中的容器是否正常運行

yaml文件如下:

[root@master yam_files]# cat live-http.yaml 
apiVersion: v1
kind: Pod
metadata:name: liveness-httpnamespace: defaultlabels:app: nginxspec:containers:- name: livenessimage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80livenessProbe:httpGet: path: /index.htmlport: 80initialDelaySeconds: 5periodSeconds: 10readinessProbe:httpGet:path: /index.htmlport: 80initialDelaySeconds: 5periodSeconds: 10restartPolicy: Always 

新建的pod里面運行一個nginx,而且通過http訪問,設定啟動探測為5s,周期為10s,存活探測周期為10s,啟動探測為5s。

啟動pod后,破壞他,刪除這個探測的路徑index.html

kubectl exec -it liveness-http -- /bin/bash
root@liveness-http:/# cd /usr/share/nginx/html
root@liveness-http:/usr/share/nginx/html# ls
50x.html  index.html
root@liveness-http:/usr/share/nginx/html# rm index.html

?探針發現錯誤后重啟pod

kubectl get pods -l app=nginx -w
NAME                          READY   STATUS    RESTARTS   AGE
liveness-http                 1/1     Running   0          5m37s
nginx-test-6cf9d87fbf-26h6m   1/1     Running   0          127m
nginx-test-6cf9d87fbf-wn94b   1/1     Running   0          7d17h
liveness-http                 0/1     Running   0          5m50s
liveness-http                 0/1     Running   1 (2s ago)   5m52s
liveness-http                 1/1     Running   1 (10s ago)   6m

隨后用tcp做一個實驗,寫yaml文件如下

cat live-tcp.yaml
apiVersion: v1
kind: Pod
metadata:name: liveness-tcpspec:containers:- name: livenessimage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80livenessProbe:tcpSocket:port: 80initialDelaySeconds: 2periodSeconds: 3

?隨后啟動pod,并且停掉其中的nginx服務

kubectl exec -it liveness-tcp -- /bin/bash
root@liveness-tcp:/# nginx -s stop
2024/06/24 05:44:54 [notice] 45#45: signal process started

發現pod重啟

kubectl get pods  -w
>
NAME                          READY   STATUS    RESTARTS      AGE
first                         1/1     Running   0             158m
liveness-http                 1/1     Running   1 (25m ago)   31m
liveness-tcp                  1/1     Running   0             57s
nginx-test-6cf9d87fbf-26h6m   1/1     Running   0             153m
nginx-test-6cf9d87fbf-wn94b   1/1     Running   0             7d17h
liveness-tcp                  0/1     Completed   0             2m
liveness-tcp                  1/1     Running     1 (1s ago)    2m1s
就緒探測

readiness probe探測容器是否可以正常接受請求,如果探測失敗,k8s立即停止將新的流量轉發到該容器。從SVC移除

先建立一個service,再建立一個nginx的pod,通過service來轉發流量

[root@master yam_files]# cat readiness-svc.yaml
apiVersion: v1
kind: Service
metadata:name: readinessnamespace:
spec:selector:app: my-podports:- port: 80targetPort: 80[root@master yam_files]# cat ready-http.yaml 
apiVersion: v1
kind: Pod
metadata:name: my-podlabels:app: my-podspec:containers:- name: nginx-containerimage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80readinessProbe:httpGet:path: /index.htmlport: 80initialDelaySeconds: 30periodSeconds: 10failureThreshold: 2successThreshold: 1

可以看到設置的就緒探測為30s之后, 且每10s探測一次

一開始的service并沒有連接到pod(endpoints為空)

kubectl describe svc readiness
>
Name:              readiness
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=my-pod
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.107.242.111
IPs:               10.107.242.111
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         
Session Affinity:  None
Events:            <none>

隨后就緒探測成功,service也成功連上

kubectl get pods -w
>
NAME                          READY   STATUS    RESTARTS   AGE
nginx-test-6cf9d87fbf-26h6m   1/1     Running   0          3h28m
nginx-test-6cf9d87fbf-wn94b   1/1     Running   0          7d18h
my-pod                        0/1     Pending   0          0s
my-pod                        0/1     Pending   0          0s
my-pod                        0/1     ContainerCreating   0          0s
my-pod                        0/1     ContainerCreating   0          2s
my-pod                        0/1     Running             0          3s
my-pod                        1/1     Running             0          40skubectl describe svc readiness
>
Name:              readiness
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=my-pod
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.107.242.111
IPs:               10.107.242.111
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.166.145:80
Session Affinity:  None
Events:            <none>

?查看my-pod的ip,10.244.166.145,和上面svc的endpoint相同。在生產環境中,一般會部署副本,那么所有pod的ip都會在endpoint中,而這些ip也會寫在防火墻中

kubectl get pods -owide
NAME                          READY   STATUS    RESTARTS   AGE     IP               NODE    NOMINATED NODE   READINESS GATES
my-pod                        1/1     Running   0          14m     10.244.166.145   node1   <none>           <none>
啟動探測

startup probe用于監測容器是否成功啟動并準備好接收流量,只會在啟動的時候執行一次。

設置initialDelaySeconds:啟動多久之后開始探測,避免容器初始化沒完成就開始探測

periodSeconds:探測周期。默認10s

timeoutSeconds:默認1s

如果沒有設置容器啟動探測,則默認狀態為成功success

apiVersion: v1
kind: Pod
metadata:name: startupprobe
spec:containers:- name: startupimage: xianchao/tomcat-8.5-jre8:v1imagePullPolicy: IfNotPresentports:- containerPort: 8080startupProbe:exec:command:- "/bin/bash"- "-c"- " ps aux | grep tomcat"initialDelaySeconds: 20 #容器啟動后多久開始探測periodSeconds: 20 #執行探測的時間間隔timeoutSeconds: 10 #探針執行檢測請求后,等待響應的超時時間successThreshold: 1 #成功多少次才算成功failureThreshold: 3 #失敗多少次才算失敗

?用exe做探針,執行后發現40s之后運行成功,探測到的時間=initialDelaySeconds + periodSeconds,第一次initialSelaySeconds沒有探測成功

kubectl get pods -w
>
NAME                          READY   STATUS    RESTARTS   AGE
nginx-test-6cf9d87fbf-26h6m   1/1     Running   0          11h
nginx-test-6cf9d87fbf-wn94b   1/1     Running   0          8d
startupprobe                  0/1     Running   0          23s
startupprobe                  0/1     Running   0          40s
startupprobe                  1/1     Running   0          40s

修改yaml文件,使得探測失敗,可以看到開始重啟

“aa ps aux | grep tomcat”

第一次重啟的時間:initialDelaySeconds + (periodSeconds + timeoutSeconds)* failureThreshold

kubectl get pods -w
>
NAME                          READY   STATUS    RESTARTS   AGE
startupprobe                  0/1     ContainerCreating   0          0s
startupprobe                  0/1     ContainerCreating   0          1s
startupprobe                  0/1     Running             0          2s
startupprobe                  0/1     Running             1 (0s ago)   80s
startupprobe                  0/1     Running             2 (1s ago)   2m21s

利用tcpSocket進行探測

apiVersion: v1
kind: Pod
metadata:name: startupprobe
spec:containers:- name: startupimage: xianchao/tomcat-8.5-jre8:v1imagePullPolicy: IfNotPresentports:- containerPort: 8080startupProbe:tcpSocket:port: 8080initialDelaySeconds: 20 #容器啟動后多久開始探測periodSeconds: 20 #執行探測的時間間隔timeoutSeconds: 10 #探針執行檢測請求后,等待響應的超時時間successThreshold: 1 #成功多少次才算成功failureThreshold: 3 #失敗多少次才算失敗
全生命周期健康監測

目前livenessProbe、ReadinessProbe和startupProbe都支持以下三種探針:

exec:如果執行成功,退出碼為0則探測成功。

TCPSocketAction:通過容器的ip地址和端口號執行TCP檢查,如果能夠建立TCP連接,則表明容器健康。

HTTPGetAction:通過容器的ip地址、端口號以及調用HTTP Get方法,如果響應的狀態碼大于200小于400,則認為容器健康。

apiVersion: v1
kind: Pod
metadata:name: life-demospec:containers:- name: lifecycle-demo-containerimage: docker.io/xianchao/nginx:v1imagePullPolicy: IfNotPresentlifecycle:postStart:exec:command: ["/bin/bash","-c","echo 'lifecycle hookshandler' > /usr/share/nginx/html/test.html"]preStop:exec:command:- "/bin/sh"- "-c"- "nginx -s stop"

postStart和preStop都是容器生命管理的鉤子,PostStart 鉤子在容器啟動后立即調用。這是在容器的主進程啟動之后,且在容器被視為就緒之前發生的。如果 PostStart 鉤子執行失敗,容器將被視為啟動失敗,Kubernetes 會根據容器的重啟策略處理這個失敗的容器。PreStop?鉤子是為了在容器終止前執行清理任務(如關閉連接、釋放資源等)而設計的。

apiVersion: v1
kind: Pod
metadata:name: checknamespace: defaultlabels:app: check
spec:containers:- name: checkimage: busybox:1.28imagePullPolicy: IfNotPresentcommand:- /bin/sh- -c- sleep 10;exit

啟動這個pod后,10s后容器就會退出,但是會一直重啟

kubectl get pods -w
>
NAME                          READY   STATUS    RESTARTS   AGE
nginx-test-6cf9d87fbf-26h6m   1/1     Running   0          11h
nginx-test-6cf9d87fbf-wn94b   1/1     Running   0          8d
check                         0/1     Pending   0          0s
check                         0/1     Pending   0          0s
check                         0/1     ContainerCreating   0          0s
check                         0/1     ContainerCreating   0          1s
check                         1/1     Running             0          2s
check                         0/1     Completed           0          12s
check                         1/1     Running             1 (2s ago)   13s
check                         0/1     Completed           1 (12s ago)   23s
check                         0/1     CrashLoopBackOff    1 (14s ago)   36s
check                         1/1     Running             2 (14s ago)   36s
check                         0/1     Completed           2 (24s ago)   46s
check                         0/1     CrashLoopBackOff    2 (12s ago)   58s
check                         1/1     Running             3 (24s ago)   70s
check                         0/1     Completed           3 (34s ago)   80s
check                         0/1     CrashLoopBackOff    3 (16s ago)   95s
check                         1/1     Running             4 (43s ago)   2m2s

一個包含三種探測的pod文件

apiVersion: v1
kind: Service
metadata:name: springboot-livelabels:app: springbootspec:type: NodePortports:- name: serverport: 8080targetPort: 8080nodePort: 31180- name: managementport: 8081targetPort: 8081nodePort: 31181selector:app: springboot---
apiVersion: v1
kind: Pod
metadata:name: springboot-livelabels:app: springbootspec:containers:- name: springbootimage: mydlqclub/springboot-helloworld:0.0.1imagePullPolicy: IfNotPresentports:- name: servercontainerPort: 8080- name: managementcontainerPort: 8081readinessProbe:initialDelaySeconds: 20periodSeconds: 5timeoutSeconds: 10httpGet:scheme: HTTPport: 8081path: /actuator/healthlivenessProbe:initialDelaySeconds: 20periodSeconds: 5timeoutSeconds: 10httpGet:scheme: HTTPport: 8081path: /actuator/healthstartupProbe:initialDelaySeconds: 20periodSeconds: 5timeoutSeconds: 10httpGet:scheme: HTTPport: 8081path: /actuator/health

啟動后發現svc的服務是正常的

kubectl describe svc springboot-live
Name:                     springboot-live
Namespace:                default
Labels:                   app=springboot
Annotations:              <none>
Selector:                 app=springboot
Type:                     NodePort
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       10.98.119.36
IPs:                      10.98.119.36
Port:                     server  8080/TCP
TargetPort:               8080/TCP
NodePort:                 server  31180/TCP
Endpoints:                10.244.166.156:8080
Port:                     management  8081/TCP
TargetPort:               8081/TCP
NodePort:                 management  31181/TCP
Endpoints:                10.244.166.156:8081
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

隨后進入pod,刪掉運行的程序

kubectl exec -it springboot-live -- /bin/sh
/ # ls
app.jar  dev      home     media    opt      root     sbin     sys      usr
bin      etc      lib      mnt      proc     run      srv      tmp      var
/ # ps -ef | grep springboot63 root      0:00 grep springboot
/ # ps -ef | grep hello65 root      0:00 grep hello
/ # kill  1
/ # command terminated with exit code 137

查看pod狀態,發現20s后重啟

kubectl get pods -w
NAME                          READY   STATUS    RESTARTS   AGE
springboot-live               1/1     Running   0          2m36s
springboot-live               0/1     Error     0          17m
springboot-live               0/1     Running   1 (1s ago)   17m
springboot-live               0/1     Running   1 (22s ago)   17m
springboot-live               1/1     Running   1 (22s ago)   17m

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/37886.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37886.shtml
英文地址,請注明出處:http://en.pswp.cn/web/37886.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Win測試】窗口捕獲的學習筆記

2 辨析筆記 2.1 mss&#xff1a;捕獲屏幕可見區域&#xff0c;不適合捕獲后臺應用 Claude-3.5-Sonnet: MSS庫可以用來捕獲屏幕上可見的內容&#xff1b;然而&#xff0c;如果游戲窗口被其他窗口完全遮擋或最小化&#xff0c;MSS將無法捕獲到被遮擋的游戲窗口內容&#xff0c;而…

天津惠靈頓:從心,致逐夢康橋|在這所天津國際學校從容不迫中走近夢想

在剛剛落下帷幕的申請季中&#xff0c;來自惠靈頓天津校區的Herman&#xff0c;陸續收到了劍橋大學、帝國理工學院、紐約大學、瓦薩學院等10余封錄取通知書。面對紛至沓來的名校肯定&#xff0c;經歷了短暫的塵埃落定的喜悅&#xff0c;Herman很快恢復了往日里的泰然自若。在他…

cv::Mat類的矩陣內容輸出的各種格式的例子

操作系統&#xff1a;ubuntu22.04OpenCV版本&#xff1a;OpenCV4.9IDE:Visual Studio Code編程語言&#xff1a;C11 功能描述 我們可以這樣使用&#xff1a;cv::Mat M(…); cout << M;&#xff0c;直接將矩陣內容輸出到控制臺。 輸出格式支持多種風格&#xff0c;包括O…

第5章:Electron加載與顯示內容(2)

5.4 加載和顯示不同類型的資源 Electron 支持加載和顯示多種類型的資源&#xff0c;包括圖片、視頻和其他靜態文件。 5.4.1 加載圖片的示例代碼 index.html&#xff1a; <!DOCTYPE html> <html> <head><title>Load Image</title> </head&…

字符串常量池StringTable

String s1 "a"; 從常量池中取符號a->運行時常量池 ->"a"放入字符串常量池 -> 給s1 String s2 "b"; String s3 s1s2; 創建 new StringBuilder().append("a").append("b").toString() String s4 "a"&q…

鴻蒙使用 @Builder擴展出來的布局數據更新沒法更新UI

由于業務的復雜&#xff0c;所以我們把相關UI抽離出來。但是數據變化了&#xff0c;沒法更新UI Builder MyGridLayout() { } 通過日志打印發現數據的確是更新了&#xff0c;但是UI就沒沒辦法&#xff0c;如何解決呢 Entry Component struct Page35 {// State sArray: bool…

【ajax實戰09】內容管理頁面——刪除功能

本文章目標&#xff1a;點擊刪除圖標實現對應數據刪除 實現步驟如下&#xff1a; 一&#xff1a;將服務器端獲取數據中數據id值綁定到刪除圖標&#xff08;重點&#xff09; 即在渲染時&#xff0c;利用自定義屬性&#xff0c;為td設置id值 <td data-id "${ele.id}…

CEPH client.admin key獲取

通過初始化完畢后&#xff0c;admin節點會在/etc/ceph目標下生成對應的配置文件和對應的key文件&#xff0c;通過ceph orch host add 增加的默認是沒有的 如果很不幸admin節點掛了&#xff0c;怎么在其它節點使用ceph -s 命令呢 啟蒙方法(比較實用) key可以通過ceph auth expor…

chunkers/maxent_ne_chunker/english_ace_multiclass.pickle 找不到

首先在這個nltk_data &#xff1a; NLTK Data官方下的數據集&#xff0c;找不到english_ace_multiclass.pic 說明缺少這個文件 : 那么在 nlp/resources/chunkers/maxent_ne_chunker/english_ace_multiclass.pickle at master teropa/nlp (github.com) 下載那兩個文件 : 然…

在Vue3項目中引入Vite進行熱更新

第一步&#xff1a;初始化一個Vue3項目&#xff0c;可以使用Vue CLI 在開始之前&#xff0c;我們需要確保已經安裝了Vue CLI。可以通過以下命令安裝Vue CLI&#xff1a; bash npm install -g vue/cli 接下來&#xff0c;使用Vue CLI初始化一個Vue3項目&#xff1a; bash vue …

基于SpringBoot的CSGO賽事管理系統

您好&#xff01;我是專注于計算機技術研究的碼農小野。如果您對CSGO賽事管理系統感興趣或有相關開發需求&#xff0c;歡迎隨時聯系我。 開發語言&#xff1a;Java 數據庫&#xff1a;MySQL 技術&#xff1a;SpringBoot框架&#xff0c;Java技術 工具&#xff1a;Eclipse&a…

邁阿密色主題學科 HTML5靜態導航源碼

源碼介紹 邁阿密色主題學科 HTML5靜態導航源碼&#xff0c;源碼直接上傳可用&#xff0c;有技術的可以拿去寫個后端搜索調用百度接口&#xff0c;也可用于做引導頁下面加你網址添加一個A標簽就行了&#xff0c;很簡單&#xff0c;需要的朋友就拿去吧 界面預覽 源碼下載 邁阿…

安裝Anaconda + tensorflow

安裝Anaconda tensorflow 下載Anaconda&#xff08;64位&#xff09; https://www.anaconda.com/download/ Anaconda3-xxxxxx-Windows-x86_64&#xff08;不要裝最新的版本&#xff0c;確保Python是3.7&#xff09; 各種Anaconda老版本&#xff1a; https://mirrors.tuna.ts…

跳轉的藝術:Batch文件中GOTO命令的深度解析

跳轉的藝術&#xff1a;Batch文件中GOTO命令的深度解析 在批處理文件&#xff08;Batch&#xff09;的編程世界中&#xff0c;GOTO命令是實現流程控制的重要工具之一。它允許程序跳轉到腳本中的特定標簽位置&#xff0c;從而實現循環、條件分支等復雜的邏輯結構。本文將深入探…

EtherCAT主站IGH-- 4 -- IGH之datagram_pair.h/c文件解析

EtherCAT主站IGH-- 4 -- IGH之datagram_pair.h/c文件解析 0 預覽一 該文件功能datagram_pair.c 文件功能函數預覽 二 函數功能介紹datagram_pair.c 中主要函數的作用1. ec_datagram_pair_init2. ec_datagram_pair_clear3. ec_datagram_pair_process 三 h文件翻譯四 c文件翻譯該…

專題五:Spring源碼之初始化容器上下文

上一篇我們通過如下一段基礎代碼作為切入點&#xff0c;最終找到核心的處理是refresh方法&#xff0c;從今天開始正式進入refresh方法的解讀。 public class Main {public static void main(String[] args) {ApplicationContext context new ClassPathXmlApplicationContext(…

鴻蒙本地簽名不匹配問題

連接鴻蒙手機運行項目報如下錯誤 這是由于本地簽名和鴻蒙設備簽名不匹配導致的&#xff0c;需要注釋掉如下代碼&#xff0c;選擇file project 自動簽名 勾選auto選項&#xff0c;會在build-profile.json5中生成一個簽名&#xff0c;然后運行就ok了~

【Lua】腳本入門

文章目錄 總述一、Lua概述二、Lua環境安裝三、Lua基本語法四、Lua的庫和擴展五、Lua的應用場景六、學習資源 語法1. Lua基本語法示例變量和數據類型控制結構函數 2. Lua標準庫示例字符串操作數學函數文件I/O 3. Lua作為腳本擴展示例&#xff08;假設Lua嵌入在某個應用程序中&am…

vscode python格式化

插件 Black Formatter Black 默認會遵循 PEP 8 的規范&#xff0c;可配置的參數很少&#xff0c;用的人很多。 setting.json 配置&#xff0c;更改插件的每行字符數限制 {"[python]": {"editor.defaultFormatter": "ms-python.black-formatter"…

Redis命令大全(基礎版)

一、基礎命令 redis-server --service-start # 開啟服務 redis-server --service-stop # 停止服務redis-cli # 進入redis界面redis界面操作&#xff1a; ping # 檢測狀態&#xff0c;返回pong證明連接正常set key value # 設置 key 字段的值為value&#xff0c;返回o…