K8s基本單元Pod解讀
什么是Pod?
Pod是Kubernetes中的最小調(diào)度單元,k8s是通過定義一個Pod的資源,Pod資源里運行一組、一個或多個容器,每個Pod還包含一個Pause容器。
Pause容器是Pod的父容器,它主要負責全局進程的回收管理,同時通過Pause容器可以使用一個Pod里面的不同容器共享存儲、網(wǎng)絡、PID、IPC等,容器之間可以使用localhost:port相互訪問,可以使用volume等實現(xiàn)數(shù)據(jù)共享。根據(jù)Docker的構造,Pod可被建模為一組具有共享命令空間、卷、IP地址和Port端口的容器。Pod對外提供一個IP讓其它Pod訪問到Pod資源里面的指定容器的端口。
提示:Kubernetes官方Pod說明文檔 https://kubernetes.io/docs/concepts/workloads/pods/
如下圖所示,可以通俗理解Pod,可以把Pod看做一個豌豆莢,而豌豆莢里的每個豆子都是Pod中的容器。

一、Pod運行方式
1、查詢Pod
### 查詢Pod kubectl get pods -A kubectl get pods -n kube-system ### 查詢Containerd鏡像與容器信息 crictl images crictl ps ### 查詢有關Pod官方說明 kubectl explain pod
2、命令方式創(chuàng)建Pod
### kubectl run命令參數(shù)說明: # nginx自定義Pod名稱 # --image指定nginx鏡像下載地址 # --port指定nginx容器運行端口 # --namespace 指定Pod的命名空間 ### 創(chuàng)建Pod kubectl run nginx --image=registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.24 --port 80 --namespace=default ### 查看Pod信息 kubectl get pods -n default kubectl get pods -n default -owide kubectl logs -f nginx -n default kubectl logs -f nginx -n default ### 刪除Pod kubectl delete pods nginx
3、命令方式僅打印創(chuàng)建Pod的yaml文件但不創(chuàng)建Pod
提示:使用命令方式添加參數(shù)–dry-run=client僅運行打印創(chuàng)建Pod信息但不創(chuàng)建Pod,適用于快速創(chuàng)建一個Pod的yaml文件模`
mkdir -p /data/yaml/pod kubectl run nginx --image=registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.24 --port 80 --namespace=default --dry-run=client -oyaml > /data/yaml/pod/nginx.yaml
4、使用yaml文件創(chuàng)建Pod
提示:yaml文件是一種輕量級的數(shù)據(jù)序列化標準,易于閱讀和編寫,非常適合用來定義Kubernetes的資源對象,如Pod、Service、Deployment等
### yaml文件參數(shù)說明:
apiversion: v1 # 填寫API資源版本號,通過kubectl api-resources | grep pods命令查詢API資源版本號
kind: Pod # 類型Pod,可選 Deployment、StatefuSet、Service等,根據(jù)需要選擇
metadata: # 資源的元數(shù)據(jù)或屬性
labels: # 設置Pod標簽
app: nginx-app # 自定義Pod標簽名稱
name: nginx-pod # 自定義Pod名稱
namespace: default # 設置Pod所屬命名空間,默認default命名空間
spec: # 定義Pod的資源行為
containers: # 定義容器規(guī)格,包含一個或多個容器規(guī)格
- image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.24 # 指定容器拉取鏡像地址
imagePullPolicy: IfNotPresent # 鏡像拉取策略,Always每次啟動都通過--image參數(shù)拉取鏡像(默認值);IfNotPresent本地有鏡像就使用本地的,沒有再通過--image參數(shù)拉??;Never 不拉取--image參數(shù)的鏡像
name: nginx01 # 自定義容器名稱,用于區(qū)分Pod資源的多個容器
ports: # 指定容器端口列表,可以定義一個或多個端口
- containerPort:80 # 指定容器需要暴露的端口
restartPolicy: Always # 容器重啟策略,Always容器失效時,自動重啟容器(默認值),OnFailure容器不為0狀態(tài)碼終止時,自動重啟容器;Never無論容器任何狀態(tài)都不會重啟
### 編寫創(chuàng)建Pod的yaml文件
cat > /data/yaml/pod/nginx.yaml << 'EOF'
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
app: nginx-app
name: nginx-pod
namespace: default
spec:
containers:
- image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.24
imagePullPolicy: IfNotPresent
name: nginx01
ports:
- containerPort: 80
restartPolicy: Always
EOF
### 創(chuàng)建Pod并查詢Pod信息
kubectl create -f /data/yaml/pod/nginx.yaml
kubectl get pods -n default
kubectl get pods -n default –owide
### 刪除Pod
kubectl delete -f /data/yaml/pod/nginx.yaml
二、Pod Phase變化階段
- 提示:根據(jù)Pod狀態(tài)字段Phase的不同取值對容器狀態(tài)進行排查
- 提示:Pod的Phase字段只有Pending、Running、Successed、Failed、Unknow,其余的為處于上述狀態(tài)的原因,可以通過kubectl get pods xxx -oyaml查看
- 提示:Kubernetes官方Pod Phase說明:https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle
| Value | Description |
|---|---|
| Pending(掛起) | Pod已被Kubnetes系統(tǒng)接受,但是一個或多個容器還沒有設置好并準備好運行。這包括Pod等待調(diào)度的時間,以及通過網(wǎng)絡下載容器映像所花費的時間,可以通過kubectl describe pods查看處于Pending狀態(tài)的原因。 |
| Running(運行中) | Pod已經(jīng)被綁定到一個節(jié)點上,并且所有的容器都已經(jīng)被創(chuàng)建,而且至少有一個是運行狀態(tài),或者是正在啟動或重啟,可以通過kubectl logs查看Pod的日志。 |
| Successed(成功) | Pod中的所有容器都已成功終止,并且不會重新啟動,可以通過kubectl logs查看Pod日志。 |
| Failed(失?。?/td> | Pod中的所有容器都已終止,并且至少有一個容器因失敗而終止。也就是說,容器要么以非零狀態(tài)退出,要么被系統(tǒng)終止,并且沒有設置為自動重新啟動,可以通過kubectl logs和kubectl describe查看Pod日志和狀態(tài)。 |
| Unknown(未知) | 由于某些原因,無法獲得Pod的狀態(tài)。此階段通常是由于與運行Pod的節(jié)點通信時出現(xiàn)錯誤而發(fā)生的。 |
| Unknown(未知)包含以下狀態(tài) | Description |
|---|---|
| InagePullBackOff(ErrImagePulll) | 鏡像拉取失敗,一般由于鏡像不存在、網(wǎng)絡不通或者需要登錄認證引起的,可以使用kubectl describe pods 命令或者kubectl logs命令查看具體原因。 |
| CrashLoopBackOff | 容器啟動失敗,可以通過logs命令查看具體原因,一般為啟動命令不正確,健康檢查不通過等。 |
| OOMKilled | 容器內(nèi)存溢出,一般是容器的內(nèi)存Limit設置過小或者程序本身有內(nèi)存溢出,可以通過kubectl logs查看程序啟動日志。 |
| Teminating | Pod正在被刪除,可以通過kubectl escribe查看狀態(tài)。 |
| SysctlForbidden | Pod自定義了內(nèi)核配置,但kubelet沒有添加內(nèi)核配置或配置的內(nèi)核參數(shù)不支持,可以通過kubectl describe pods 查看具體原因。 |
| Completed | 容器內(nèi)部主進程退出,一般計劃任務執(zhí)行結束會顯示該狀態(tài),此時可以通過kubectl logs查看容器日志。 |
| ContainnerCreating | Pod正在創(chuàng)建,一般為正在下載鏡像或有配置不當?shù)牡胤?,可以通過kubectl describe pods查看具體原因。 |
三、Pod三種探針
1、什么是探針
Kubernetes(K8s)中的探針(Probe)主要用于檢測和管理容器的健康狀態(tài),確保服務的穩(wěn)定性和高可用性。
探針主要有三種類型:存活探針(Liveness Probe)、就緒探針(Readiness Probe)和啟動探針(Startup Probe),每種探針都有其特定的作用和應用場景。
存活探針(Liveness Probe)
- 存活探針用于判斷容器服務是否仍然處于運行狀態(tài)。
- 如果存活探針失敗,Kubernetes將殺死容器并重新啟動它。
- 這通常用于檢測應用是否因為某些錯誤或掛起而無法繼續(xù)運行。
就緒探針(Readiness Probe)
- 就緒探針用于判斷容器是否準備好接收流量。
- 如果探針檢測失敗,Kubernetes會將該Pod從服務的負載均衡池中移除,防止流量發(fā)送到未準備好的Pod。
- 就緒探針適用于需要初始化的應用程序,例如在啟動時連接數(shù)據(jù)庫或加載緩存。
啟動探針(Startup Probe)
- 啟動探針用于檢測容器的啟動過程是否完成,特別適用于啟動時間較長的容器。
- 當啟動探針配置存在時,kubelet不會執(zhí)行存活和就緒探針,直到啟動探針成功為止。
- 這可以有效避免在應用還未完全啟動時就被誤判為不健康或就緒,進而被錯誤地重啟或流量過早涌入。
- 啟動探針適用于慢啟動服務,例如需要長時間初始化的應用。
2、Pod啟動過程
創(chuàng)建Pod — Pending — ContainerCreate — Running — InitContainer — Container — StartupProbe(執(zhí)行第一個探針) — LivenessProbe(執(zhí)行第二個探針)/ReadinessProbe(執(zhí)行第三個探針) — Endpoin 添加Pod IP
3、Pod退出過程
刪除Pod — Dead(30s寬限期內(nèi)) — Terminating — PreStop(寬限期結束PreStop未結束,再次獲得2秒的寬限期,寬限期結束,Pod收到SIGKILL信息) — EndPoints 刪除Pod IP(kubelet請求APIServer,將寬限期設置為0,然后進行刪除操作)
4、Pod 探針四鐘檢查機制
提示:Kubernetes官方關掉探針檢查機制說明 https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#container-probes
exec:在容器內(nèi)執(zhí)行一個命令,如果命令返回值為0,則認為容器健康,否則反之tcpSocket:通過TCP連接檢查容器指定的端口,如果端口打開,則認為容器健康,否則反之httpGet:對指定端口和路徑上Pod的IP地址執(zhí)行HTTP GET請求,如果狀態(tài)碼大于等于200且小于400,則認為容器健康,否則反之grpc:使用gRPC執(zhí)行遠程過程調(diào)用。目標應執(zhí)行gRPC運行狀況檢查。如果響應的狀態(tài)為SERVING,則認為容器健康,否則反之
5、創(chuàng)建Pod 包含就緒探針Readiness Probe并測試
(1)、就緒探針Readiness Probe參數(shù)說明
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
app: nginx-app
name: nginx-pod
namespace: default
spec:
containers:
- image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.24
imagePullPolicy: IfNotPresent
name: nginx01
readinessProbe: # 選擇就緒探針Readiness Probe類型
httpGet: # 選擇探針httpGet檢查機制,HTTP GET請求方式
path: /index.html # 請求路徑
port: 8080 # 請求端口
scheme: HTTP # 請求的協(xié)議,HTTP協(xié)議或HTTPS協(xié)議
initialDelaySeconds: 10 # 容器啟動后等待多少秒開始進行首次探測,默認值0秒
timeoutSeconds: 2 # 探測請求超時時間,默認值1秒
periodSeconds: 5 # 執(zhí)行探測的頻率,表示每5秒探測一次。對于Liveness Probe和Readiness Probe,默認值都是10秒。對于Startup Probe默認值沒有設置,必須顯式指定
successThreshold: 1 # 在探測成功前需要連續(xù)探測多少次才算成功。默認值為1。這通常在Startup Probe中使用以避免過早的成功判斷
failureThreshold: 2 # 在探測失敗后需要連續(xù)探測多少次才算失敗。對于Liveness Probe,默認值為3;對于Readiness Probe,默認值為3;對于Startup Probe,默認值沒有設置,必須顯式指定
ports:
- containerPort: 80
restartPolicy: Always
(2)、創(chuàng)建一個診斷成功的Pod包含就緒探針Readiness Proe(httpGet檢查規(guī)則)
### 編寫Pod 包含就緒探針Readiness Probe的yaml文件(指定一個容器真實存在的端口,例如80端口)
cat > /data/yaml/pod/nginx-ReadinessProbe.yaml << 'EOF'
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
app: nginx-app
name: nginx-pod
namespace: default
spec:
containers:
- image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.24
imagePullPolicy: IfNotPresent
name: nginx01
readinessProbe:
httpGet:
path: /index.html
port: 80
scheme: HTTP
initialDelaySeconds: 10
timeoutSeconds: 2
periodSeconds: 5
successThreshold: 1
failureThreshold: 2
ports:
- containerPort: 80
restartPolicy: Always
EOF
### 創(chuàng)建Pod 包含就緒探針Readiness Probe并檢查
kubectl create -f /data/yaml/pod/nginx-ReadinessProbe.yaml
kubectl get pods -n default -owide
### 查看創(chuàng)建的Pod是否已生成探針配置
root@k8s-master01:~# kubectl get pods -n default -oyaml | grep -A 9 "readinessProbe"
readinessProbe:
failureThreshold: 2
httpGet:
path: /index.html
port: 80
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 2
### 刪除Pod
kubectl delete -f /data/yaml/pod/nginx-ReadinessProbe.yaml
(3)、創(chuàng)建一個診斷失敗的Pod包含就緒探針Readiness Proe(httpGet檢查規(guī)則)
### 編寫Pod 包含就緒探針Readiness Probe的yaml文件(指定一個容器不存在的端口,例如8080端口)
cat > /data/yaml/pod/nginx-ReadinessProbe.yaml << 'EOF'
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
app: nginx-app
name: nginx-pod
namespace: default
spec:
containers:
- image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.24
imagePullPolicy: IfNotPresent
name: nginx01
readinessProbe:
httpGet:
path: /index.html
port: 8080
scheme: HTTP
initialDelaySeconds: 10
timeoutSeconds: 2
periodSeconds: 5
successThreshold: 1
failureThreshold: 2
ports:
- containerPort: 80
restartPolicy: Always
EOF
### 創(chuàng)建Pod 包含就緒探針Readiness Probe
kubectl create -f /data/yaml/pod/nginx-ReadinessProbe.yaml
### 查看已創(chuàng)建的Pod,雖然Pod顯示SATUS顯示Running,但READY顯示0/1是代表容器運行失敗的
root@k8s-master01:~# kubectl get pods -n default -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-pod 0/1 Running 0 64s 172.30.135.135 k8s-node03 <none> <none>
### 就緒探針(Readiness Probe)如果檢查失敗,容器Service流量就會被切斷,但K8s集群內(nèi)所有節(jié)點仍可以訪問nginx服務
root@k8s-master01:~# kubectl describe pods nginx-pod -n default
………………………..
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 7m42s default-scheduler Successfully assigned default/nginx-pod to k8s-node03
Normal Pulled 7m41s kubelet Container image "registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.24" already present on machine
Normal Created 7m41s kubelet Created container: nginx01
Normal Started 7m41s kubelet Started container nginx01
Warning Unhealthy 2m36s (x64 over 7m31s) kubelet Readiness probe failed: Get "http://172.30.135.135:8080/index.html": dial tcp 172.30.135.135:8080: connect: connection refused
root@k8s-master01:~# curl -I 172.30.135.135
HTTP/1.1 200 OK
Server: nginx/1.24.0
Date: Mon, 21 Apr 2025 09:30:26 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 11 Apr 2023 01:45:34 GMT
Connection: keep-alive
ETag: "6434bbbe-267"
Accept-Ranges: bytes
### 刪除Pod
kubectl delete -f /data/yaml/pod/nginx-ReadinessProbe.yaml
6、創(chuàng)建Pod 包含存活探針Liveness Probe并測試
(1)、存活探針Liveness Probe參數(shù)說明
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
app: nginx-app
name: nginx-pod
namespace: default
spec:
containers:
- image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.24
imagePullPolicy: IfNotPresent
name: nginx01
livenessProbe: # 選擇存活探針Liveness Probe類型
tcpSocket: # 選擇探針tcpSocket檢查機制,檢查端口是否存活
port: 80 # 設置檢查的存活端口80
initialDelaySeconds: 10 # 容器啟動后等待多少秒開始進行首次探測,默認值0秒
timeoutSeconds: 2 # 探測請求超時時間,默認值1秒
periodSeconds: 5 # 執(zhí)行探測的頻率,表示每5秒探測一次。對于Liveness Probe和Readiness Probe,默認值都是10秒。對于Startup Probe默認值沒有設置,必須顯式指定
successThreshold: 1 # 在探測成功前需要連續(xù)探測多少次才算成功。默認值為1。這通常在Startup Probe中使用以避免過早的成功判斷
failureThreshold: 2 # 在探測失敗后需要連續(xù)探測多少次才算失敗。默認值依賴于探針類型。對于Liveness Probe,默認值為3;對于Readiness Probe,默認值為3;對于Startup Probe,默認值沒有設置,必須顯式指定
ports:
- containerPort: 80
restartPolicy: Always
(2)、創(chuàng)建一個診斷成功的Pod包含存放探針Liveness Proe(tcpSocket檢查規(guī)則)
### 編寫Pod 包含就緒探針Readiness Probe的yaml文件(指定一個容器真實存在的端口,例如80端口)
cat > /data/yaml/pod/nginx-LivenessProbe.yaml << 'EOF'
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
app: nginx-app
name: nginx-pod
namespace: default
spec:
containers:
- image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.24
imagePullPolicy: IfNotPresent
name: nginx01
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 10
timeoutSeconds: 2
periodSeconds: 5
successThreshold: 1
failureThreshold: 2
ports:
- containerPort: 80
restartPolicy: Always
EOF
### 創(chuàng)建Pod 包含存活探針Liveness Probe并檢查
kubectl create -f /data/yaml/pod/nginx-LivenessProbe.yaml
kubectl get pods -n default -owide
### 查看創(chuàng)建的Pod是否已生成探針配置
root@k8s-master01:~# kubectl get pods -n default -oyaml | grep -A 7 "livenessProbe"
livenessProbe:
failureThreshold: 2
initialDelaySeconds: 10
periodSeconds: 5
successThreshold: 1
tcpSocket:
port: 80
timeoutSeconds: 2
### 刪除Pod
kubectl delete -f /data/yaml/pod/nginx-LivenessProbe.yaml
(3)、創(chuàng)建一個診斷失敗的Pod包含存活探針Liveness Proe(tcpSocket檢查規(guī)則)
### 編寫Pod 包含存活探針Liveness Probe的yaml文件(指定一個容器不存在的端口,例如8080端口)
cat > /data/yaml/pod/nginx-LivenessProbe.yaml << 'EOF'
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
app: nginx-app
name: nginx-pod
namespace: default
spec:
containers:
- image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.24
imagePullPolicy: IfNotPresent
name: nginx01
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 10
timeoutSeconds: 2
periodSeconds: 5
successThreshold: 1
failureThreshold: 2
ports:
- containerPort: 80
restartPolicy: Always
EOF
### 創(chuàng)建Pod 包含存活探針Liveness Probe
kubectl create -f /data/yaml/pod/nginx-ReadinessProbe.yaml
### 查看Pod自動重啟次數(shù)RESTARTS顯示為3次,存活探針Liveness Probe只要探測失敗就會重啟Pod的容器
root@k8s-master01:~# kubectl get pod -n default
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 3 (2s ago) 62s
### 查看Pod運行詳細描述,存活探針Liveness Probe診斷失敗,容器發(fā)生重啟
root@k8s-master01:~# kubectl describe pod nginx-pod -n default
…………………
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 93s default-scheduler Successfully assigned default/nginx-pod to k8s-node01
Normal Created 32s (x4 over 92s) kubelet Created container: nginx01
Normal Started 32s (x4 over 92s) kubelet Started container nginx01
Warning Unhealthy 13s (x8 over 78s) kubelet Liveness probe failed: dial tcp 172.30.85.203:8080: connect: connection refused
Normal Killing 13s (x4 over 73s) kubelet Container nginx01 failed liveness probe, will be restarted
Normal Pulled 12s (x5 over 92s) kubelet Container image "registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.24" already present on machine
### 刪除Pod
kubectl delete -f /data/yaml/pod/nginx-LivenessProbe.yaml
7、創(chuàng)建Pod 包含啟動探針Startup Probe并測試
(1)、啟動探針Startup Probe參數(shù)說明
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
app: nginx-app
name: nginx-pod
namespace: default
spec:
containers:
- image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.24
imagePullPolicy: IfNotPresent
name: nginx01
startupProbe: # 選擇啟動探針Startup Probe類型
exec: # 選擇探針exec檢查機制,檢查該文件是否存在容器中
command: # 指令方式運行,需要確認容器中有該指令,否則容器會被啟動探針判定成失敗
- ls
- /etc/nginx/nginx.conf
initialDelaySeconds: 10 # 容器啟動后等待多少秒開始進行首次探測,默認值0秒,根據(jù)實際情況設置,如果該容器啟動非常緩慢,時間設置長些
timeoutSeconds: 2 # 探測請求超時時間,默認值1秒
periodSeconds: 5 # 執(zhí)行探測的頻率,表示每5秒探測一次。對于Liveness Probe和Readiness Probe,默認值都是10秒。對于Startup Probe默認值沒有設置,必須顯式指定
successThreshold: 1 # 在探測成功前需要連續(xù)探測多少次才算成功。默認值為1。這通常在Startup Probe中使用以避免過早的成功判斷
failureThreshold: 2 # 在探測失敗后需要連續(xù)探測多少次才算失敗。默認值依賴于探針類型。對于Liveness Probe,默認值為3;對于Readiness Probe,默認值為3;對于Startup Probe,默認值沒有設置,必須顯式指定
ports:
- containerPort: 80
restartPolicy: Always
(2)、創(chuàng)建一個診斷成功的Pod包含啟動探針Startup Probe(exec檢查規(guī)則)
### 編寫Pod 包含啟動探針Startup Probe的yaml文件(ls命令和/etc/nginx/nginx.conf文件已存在該容器中)
cat > /data/yaml/pod/nginx-StartupProbe.yaml << 'EOF'
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
app: nginx-app
name: nginx-pod
namespace: default
spec:
containers:
- image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.24
imagePullPolicy: IfNotPresent
name: nginx01
startupProbe:
exec:
command:
- ls
- /etc/nginx/nginx.conf
initialDelaySeconds: 60
timeoutSeconds: 2
periodSeconds: 5
successThreshold: 1
failureThreshold: 2
ports:
- containerPort: 80
restartPolicy: Always
EOF
### 創(chuàng)建Pod 包含啟動探針Startup Probe并檢查
kubectl create -f /data/yaml/pod/nginx-StartupProbe.yaml
kubectl get pods -n default -owide
### 查看創(chuàng)建的Pod是否已生成探針配置
root@k8s-master01:~# kubectl get pods -n default -oyaml | grep -A 9 "startupProbe"
startupProbe:
exec:
command:
- ls
- /etc/nginx/nginx.conf
failureThreshold: 2
initialDelaySeconds: 60
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 2
### 刪除Pod
kubectl delete -f /data/yaml/pod/nginx-StartupProbe.yaml
(3)、創(chuàng)建一個診斷失敗的Pod包含啟動探針Startup Probe(exec檢查規(guī)則)
### 編寫Pod 包含啟動探針Startup Probe的yaml文件(ls命令已存在該容器中,但指定的/usr/local/nginx.conf不存在該容器中)
cat > /data/yaml/pod/nginx-StartupProbe.yaml << 'EOF'
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
app: nginx-app
name: nginx-pod
namespace: default
spec:
containers:
- image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.24
imagePullPolicy: IfNotPresent
name: nginx01
startupProbe:
exec:
command:
- ls
- /usr/local/nginx.conf
initialDelaySeconds: 60
timeoutSeconds: 2
periodSeconds: 5
successThreshold: 1
failureThreshold: 2
ports:
- containerPort: 80
restartPolicy: Always
EOF
### 創(chuàng)建Pod 包含啟動探針Startup Probe
kubectl create -f /data/yaml/pod/nginx-StartupProbel.yaml
### 查看Pod自動重啟次數(shù)RESTARTS顯示為3次,啟動探針Startup Probe只要探測失敗就會重啟Pod的容器
root@k8s-master01:~# kubectl get pods -n default
NAME READY STATUS RESTARTS AGE
nginx-pod 0/1 Running 3 (29s ago) 3m59s
### 查看Pod運行詳細描述,啟動探針Startup Probe診斷失敗,容器發(fā)生重啟
root@k8s-master01:~# kubectl describe pods nginx-pod -n default
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 4m14s default-scheduler Successfully assigned default/nginx-pod to k8s-node03
Normal Pulled 44s (x4 over 4m13s) kubelet Container image "registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.24" already present on machine
Normal Created 44s (x4 over 4m13s) kubelet Created container: nginx01
Warning Unhealthy 44s (x6 over 3m9s) kubelet Startup probe failed: ls: cannot access '/usr/local/nginx.conf': No such file or directory
Normal Killing 44s (x3 over 3m4s) kubelet Container nginx01 failed startup probe, will be restarted
Normal Started 43s (x4 over 4m13s) kubelet Started container nginx01
### 刪除Pod
kubectl delete -f /data/yaml/pod/nginx-StartupProbel.yaml
8、Pod平滑退出
### 參數(shù)說明
lifecycle:
postStart: ### 容器創(chuàng)建完成后執(zhí)行指令(要保證容器內(nèi)必須有mkdir命令,否則容器創(chuàng)建失?。?,可以是exec httpGet TCPSocket
exec:
command:
- sh
- -c
- 'mkdir /data'
preStop: ### 設置容器停止前的寬限時間或者執(zhí)行退出服務命令
exec:
command:
- sh
- -c
- sleep 10
### yam文件方式
cat > /data/yaml/pod/nginx.yaml << 'EOF'
apiVersion: v1
kind: Pod
metadata:
labels:
run: nginx
name: nginx
spec:
containers:
- image: registry.cn-shenzhen.aliyuncs.com/dockerghost/nginx:1.24
name: nginx
lifecycle:
postStart:
exec:
command:
- sh
- -c
- 'mkdir /data'
preStop:
exec:
command:
- sh
- -c
- sleep 10
startupProbe:
tcpSocket:
port: 80
initialDelaySeconds: 5
timeoutSeconds: 2
periodSeconds: 10
successThreshold: 1
failureThreshold: 5
readinessProbe:
httpGet:
path: /index.html
port: 80
scheme: HTTP
initialDelaySeconds: 2
timeoutSeconds: 2
periodSeconds: 5
successThreshold: 1
failureThreshold: 2
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 2
timeoutSeconds: 2
periodSeconds: 5
successThreshold: 1
failureThreshold: 2
command:
- sh
- -c
- nginx -g "daemon off;"
restartPolicy: OnFailure
EOF
cd /data/yaml/
kubectl delete -f nginx.yaml
kubectl create -f nginx.yaml
kubectl get pods
kubectl describe pods nginx
kubectl exec -it nginx -- sh
kubectl delete -f nginx.yaml
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Kubernetes中crictl的詳細用法教程與應用實戰(zhàn)記錄
crictl作為Kubernetes的容器運行時接口(CRI)的命令行工具,為Kubernetes的調(diào)試和管理提供了強大的支持,通過本文的詳細介紹,你應該已經(jīng)掌握了crictl的基本安裝、配置、常用命令以及高級用法,需要的朋友可以參考下2024-07-07
Windows下安裝并使用kubectl查看K8S日志的操作方法
本文給大家介紹Windows下安裝并使用kubectl查看K8S日志的操作方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友安康下吧2025-06-06

