網站首頁 編程語言 正文
文章目錄
- Pod 生命周期
- Pod 的創建過程
- pod的終止過程
- 初始化容器
- 鉤子函數
- 重啟策略

Pod 生命周期
Pod 的創建過程
1、用戶通過kubectl或其他api客戶端提交需要創建的pod信息給apiServer。
2、apiServer開始生成pod對象的信息,并將信息存入etcd,然后返回確認信息至客戶端。
3、apiServer開始反映etcd中的pod對象的變化,其它組件使用watch機制來跟蹤檢查apiServer上的變動。
4、scheduler發現有新的pod對象要創建,開始為Pod分配主機并將結果信息更新至apiServer。
5、node節點上的kubelet發現有pod調度過來,嘗試調用docker啟動容器,并將結果回送至apiServer。
6、apiServer將接收到的pod狀態信息存入etcd中。
pod的終止過程
1、用戶向apiServer發送刪除pod對象的命令。
2、apiServcer中的pod對象信息會隨著時間的推移而更新,在寬限期內(默認30s),pod被視為dead。
3、將pod標記為terminating狀態。
4、kubelet在監控到pod對象轉為terminating狀態的同時啟動pod關閉過程。
5、端點控制器監控到pod對象的關閉行為時將其從所有匹配到此端點的service資源的端點列表中移除。
6、如果當前pod對象定義了preStop鉤子處理器,則在其標記為terminating后即會以同步的方式啟動執行。
7、pod對象中的容器進程收到停止信號。
8、寬限期結束后,若pod中還存在仍在運行的進程,那么pod對象會收到立即終止的信號。
9、kubelet請求apiServer將此pod資源的寬限期設置為0從而完成刪除操作,此時pod對于用戶已不可見。
初始化容器
初始化容器是在pod的主容器啟動之前要運行的容器,主要是做一些主容器的前置工作,它具有兩大特征:
- 初始化容器必須運行完成直至結束,若某初始化容器運行失敗,那么kubernetes需要重啟它直到成功完成。
- 初始化容器必須按照定義的順序執行,當且僅當前一個成功之后,后面的一個才能運行。
初始化容器有很多的應用場景,下面列出的是最常見的幾個:
- 提供主容器鏡像中不具備的工具程序或自定義代碼。
- 初始化容器要先于應用容器串行啟動并運行完成,因此可用于延后應用容器的啟動直至其依賴的條件得到滿足。
示例:
apiVersion: v1
kind: Pod
metadata:
name: pod-initcontainer
namespace: dev
spec:
containers:
- name: main-container
image: nginx:1.17.1
ports:
- name: nginx-port
containerPort: 80
initContainers:
- name: test-mysql
image: busybox:1.30
command: ['sh', '-c', 'until ping 192.168.90.14 -c 1 ; do echo waiting for mysql...; sleep 2; done;']
- name: test-redis
image: busybox:1.30
command: ['sh', '-c', 'until ping 192.168.90.15 -c 1 ; do echo waiting for reids...; sleep 2; done;']
鉤子函數
鉤子函數能夠感知自身生命周期中的事件,并在相應的時刻到來時運行用戶指定的程序代碼。
kubernetes在主容器的啟動之后和停止之前提供了兩個鉤子函數:
postStart:容器創建之后執行,如果失敗了會重啟容器
preStop :容器終止之前執行,執行完成之后容器將成功終止,在其完成之前會阻塞刪除容器的操作
鉤子處理器支持使用下面三種方式定義動作:
- Exec命令:在容器內執行一次命令
……
lifecycle:
postStart:
exec:
command:
- cat
- /tmp/healthy
……
- TCPSocket:在當前容器嘗試訪問指定的socket
……
lifecycle:
postStart:
tcpSocket:
port: 8080
……
- HTTPGet:在當前容器中向某url發起http請求
……
lifecycle:
postStart:
httpGet:
path: / #URI地址
port: 80 #端口號
host: 192.168.5.3 #主機地址
scheme: HTTP #支持的協議,http或者https
……
接下來,以exec方式為例,演示下鉤子函數的使用,創建pod-hook-exec.yaml文件,內容如下:
apiVersion: v1
kind: Pod
metadata:
name: pod-hook-exec
namespace: dev
spec:
containers:
- name: main-container
image: nginx:1.17.1
ports:
- name: nginx-port
containerPort: 80
lifecycle:
postStart:
exec: # 在容器啟動的時候執行一個命令,修改掉nginx的默認首頁內容
command: ["/bin/sh", "-c", "echo postStart... > /usr/share/nginx/html/index.html"]
preStop:
exec: # 在容器停止之前停止nginx服務
command: ["/usr/sbin/nginx","-s","quit"]
容器探測用于檢測容器中的應用實例是否正常工作,是保障業務可用性的一種傳統機制。如果經過探測,實例的狀態不符合預期,那么kubernetes就會把該問題實例" 摘除 ",不承擔業務流量。kubernetes提供了兩種探針來實現容器探測,分別是:
liveness probes:存活性探針,用于檢測應用實例當前是否處于正常運行狀態,如果不是,k8s會重啟容器
readiness probes:就緒性探針,用于檢測應用實例當前是否可以接收請求,如果不能,k8s不會轉發流量
livenessProbe 決定是否重啟容器,readinessProbe 決定是否將請求轉發給容器。
上面兩種探針目前均支持三種探測方式:
- Exec命令:在容器內執行一次命令,如果命令執行的退出碼為0,則認為程序正常,否則不正常
……
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
……
- 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-exec
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- name: nginx-port
containerPort: 80
livenessProbe:
exec:
command: ["/bin/cat","/tmp/hello.txt"] # 執行一個查看文件的命令
方式二:TCPSocket
創建pod-liveness-tcpsocket.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-liveness-tcpsocket
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- name: nginx-port
containerPort: 80
livenessProbe:
tcpSocket:
port: 8080 # 嘗試訪問8080端口
方式三:HTTPGet
創建pod-liveness-httpget.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-liveness-httpget
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- name: nginx-port
containerPort: 80
livenessProbe:
httpGet: # 其實就是訪問http://127.0.0.1:80/hello
scheme: HTTP #支持的協議,http或者https
port: 80 #端口號
path: /hello #URI地址
重啟策略
一旦容器探測出現了問題,kubernetes就會對容器所在的Pod進行重啟,其實這是由pod的重啟策略決定的,pod的重啟策略有 3 種,分別如下:
Always :容器失效時,自動重啟該容器,這也是默認值。
OnFailure : 容器終止運行且退出碼不為0時重啟
Never : 不論狀態為何,都不重啟該容器
重啟策略適用于pod對象中的所有容器,首次需要重啟的容器,將在其需要時立即進行重啟,隨后再次需要重啟的操作將由kubelet延遲一段時間后進行,且反復的重啟操作的延遲時長以此為10s、20s、40s、80s、160s和300s,300s是最大延遲時長。
示例:
apiVersion: v1
kind: Pod
metadata:
name: pod-restartpolicy
namespace: dev
spec:
containers:
- name: nginx
image: nginx:1.17.1
ports:
- name: nginx-port
containerPort: 80
livenessProbe:
httpGet:
scheme: HTTP
port: 80
path: /hello
restartPolicy: Never # 設置重啟策略為Never
原文鏈接:https://lion-wu.blog.csdn.net/article/details/125770660
相關推薦
- 2021-12-23 使用go?net實現簡單的redis通信協議_Golang
- 2023-11-18 Python list寫入txt文件
- 2022-06-16 原生實現C#與Lua相互調用方法(Unity3D可用)_C#教程
- 2022-08-26 詳解WPF雙滑塊控件的使用和強制捕獲鼠標事件焦點_C#教程
- 2022-11-18 React?Immutable使用方法詳細介紹_React
- 2022-11-17 Go語言學習教程之反射的示例詳解_Golang
- 2023-06-17 C語言中#define在多行宏定義出錯的原因及分析_C 語言
- 2022-04-23 創建uniapp空項目并引入uViewUI
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支