Kubernetes中Pod的生命周期
Pod生命周期之Init容器
Init容器
Pod能夠具有多個(gè)容器,應(yīng)用運(yùn)行在容器里面,但是它可能有一個(gè)或多個(gè)先于應(yīng)用容器啟動(dòng)的Init容器
Init容器于普通的容器非常像,除了如下兩點(diǎn):
- Init容器總是運(yùn)行到成功完成為止
- 每個(gè)Init容器都必須在下一個(gè)Init容器啟動(dòng)之前成功完成
如果Pod 的Init容器失敗,Kubernetes會(huì)不斷地重啟該P(yáng)od,直到Init容器成功為止,然而,如果Pod對應(yīng)的restartPolicy為Nerver,它不會(huì)重新啟動(dòng)
因?yàn)镮nit容器具有與應(yīng)用程序容器分離的單獨(dú)鏡像,所以它們的啟動(dòng)相關(guān)代碼具有如下優(yōu)勢:
- 它們可以包含并運(yùn)行實(shí)用工具,但是出于安全考慮,是不建議在應(yīng)用程序容器中包含這些實(shí)用工具的
- 它們可以包含實(shí)用工具和定制化來安裝,但是不能出現(xiàn)在應(yīng)用程序鏡像中,例如,創(chuàng)建鏡像沒必要FROM另一個(gè)鏡像,只需要在安裝過程中使用類似sed、awk、python或dig這樣的工具
- 應(yīng)用程序鏡像可以分離出創(chuàng)建和部署的角色,而沒有必要聯(lián)合它們構(gòu)建一個(gè)單獨(dú)的鏡像
- Init容器使用Linux Namespace,所以相對應(yīng)用程序容器來說具有不同的文件系統(tǒng)視圖,因此,它們能夠具有訪問Secret的權(quán)限,而應(yīng)用程序容器則不能
- 它們必須在應(yīng)用程序容器啟動(dòng)之前運(yùn)行完成,而應(yīng)用程序容器是并行運(yùn)行的,所以Init容器能夠提供一中簡單的阻塞或延遲應(yīng)用程序容器的啟動(dòng)方法,直到滿足了一組先決條件
Init模板
apiVersion: v1 kind: Pod metadata:name: myapp-podlabels:app: myapp spec:containers:- name: myapp-containerimage: busyboxcommand: ['sh','-c', 'echo The app is runing! && sleep 3600']initContainers:- name: init-myserviceimage: busyboxcommand: ['sh','-c','until nslookup myservice; do echo waiting for myservice; sleep 2; done;']- name: init-mydbimage: busyboxcommand: ['sh','-c','until nslookup mydb; do echo waiting for mydb; sleep 2; done;'] kind: Service apiVersion: v1 metadata:name: myservice spec:ports:- protocol: TCPport: 80targetPort: 9376 --- kind: Service apiVersion: v1 metadata:name: mydb spec:ports:- protocol: TCPport: 80targetPort: 9377特殊說明
- 在Pod啟動(dòng)過程中,Init容器會(huì)按順序在網(wǎng)絡(luò)和數(shù)據(jù)卷初始化(pause)之后啟動(dòng),每個(gè)容器必須在下一個(gè)容器啟動(dòng)之前成功退出
- 如果由于運(yùn)行時(shí)或失敗退出,將導(dǎo)致容器啟動(dòng)事變,它會(huì)根據(jù)Pod的restartPolicy指定的策略進(jìn)行重啟,然而,如果Pod的restartPolicy設(shè)置為Always,Init容器失敗時(shí)會(huì)使用RestartPolicy策略
- 在所有的Init容器沒有成功之前,Pod將不會(huì)變成Ready狀態(tài),Init容器的端口將不會(huì)在Service中進(jìn)行聚集。正在初始化的Pode出于Pending狀態(tài),但應(yīng)該會(huì)將Initalizing狀態(tài)設(shè)置為true
- 如果Pod重啟,所有Init容器必須重新執(zhí)行
- 對Init容器spec的修改被限制在容器image字段,修改其他字段都不會(huì)生效,更改Init容器的image字段,等價(jià)于重啟該P(yáng)od
- Init容器具有應(yīng)用容器的所有字段,除了readinessProbe,因?yàn)镮nit容器無法定義不同于完成(completion)的就緒(readiness)之外的其他狀態(tài),這會(huì)在驗(yàn)證過程中強(qiáng)制執(zhí)行
- 在Pod中的每個(gè)app和Init容器的名稱必須唯一,與任何其他容器共享一個(gè)名稱,會(huì)在驗(yàn)證時(shí)拋出錯(cuò)誤
Pod生命周期之容器探針
探針時(shí)有kubelet對容器執(zhí)行的定期診斷,要執(zhí)行診斷,kubelet調(diào)用由容器實(shí)現(xiàn)的Handler。有三種類型的處理程序:
- ExecAction:在容器內(nèi)執(zhí)行指定命令,如果命令退出時(shí)返回碼為0,則認(rèn)為診斷成功
- TCPSocketAction:對指定端口上的容器的IP地址進(jìn)行TCP檢測,如果端口打開,則診斷被認(rèn)為時(shí)成功的
- HTTPGetAction:對指定的端口和路徑上的容器的IP地址執(zhí)行Get請求,如果響應(yīng)的狀態(tài)碼大于等于200且小于400,則診斷被認(rèn)為時(shí)成功的
每次探測都將獲得以下三種結(jié)果之一:
- 成功:容器通過了診斷
- 失敗:容器未通過診斷
- 未知:診斷失敗,因此不會(huì)采取任何行動(dòng)
livenessProbe探針
指示容器是否正在運(yùn)行,如果存活探測失敗,則kubelet會(huì)殺死容器,并且容器將受到重啟策略的影響,如果容器不提供存活探針,則默認(rèn)狀態(tài)為Success
存活檢測
livenessProbe-exec
apiVersion: v1 kind: Pod metadata:name: liveness-exec-podnamespace: dafault spec:containers:- name: liveness-exec-containerimage: busyboximagePullPolicy: IfNotPresentcommand: ['/bin/sh','-c',"touch /tmp/live; sleep 60; rm -rf /tmp/live; sleep 3600"]livenessProbe:exec:command: ["test","-c","/tmp/live"]initialDeyaySeconds: 1periodSeconds: 3livenessProbe-httpget
apiVersion: v1 kind: Pod metadata:name: liveness-httpget-podnamespace: default spec:containers:- name: liveness-httpget-containerimage: myapp:v1imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80livenessProbe:httpGet:port: httppath: /index.htmlinitialDelaySeconds: 1periodSenconds: 3timeoutSeconds: 10lienessProbe-tcp
apiVersion: v1 kind: Pod metadata:name: probe-tcp spec:containers:- name: nginximage: myapp:v1livenessProbe:initialDelaySeconds: 5timeoutSeconds: 1tcpSocket:port: 8080periodSeconds: 3readinessProbe
指示容器是否準(zhǔn)備好服務(wù)請求,如果就緒探針失敗,端點(diǎn)控制器將從與Pod匹配的所有Service的端點(diǎn)中刪除該P(yáng)od的IP地址,初始延遲之前的就緒狀態(tài)默認(rèn)為Failure,如果容器不提供就緒探針,則默認(rèn)狀態(tài)為Success
就緒檢測
readinessProbe-httpget
apiVersion: v1 kind: Pod metadata:name: readiness-httpget-podnamespace: default spec:containers:- name: readiness-httpget-containerimage: myapp:v1imagePullPolicy: IfNotPresentreadinessProbe:httpGet:port: httppath: /index1.htmlinitialDelaySeconds: 1periodSeconds: 3Pod生命周期之啟動(dòng)退出
apiVersion: v1 kind: Pod metadata:name: lifecycle-demo spec:containers:- name: lifecycle-demo-containerimage: myapp:v1lifecycle:postStart:exec:command: ["/bin/bash", "-c","echo Hello from the postStart handler > /usr/share/message"]preStop:exec:command: ["/usr/sbin/nginx","-s","quit"]Pod生命周期之Pod的狀態(tài)
- 掛起(Pending):Pod已被Kubernetes系統(tǒng)接受,但有一個(gè)或者多個(gè)容器鏡像尚未創(chuàng)建,等待時(shí)間包括調(diào)度Pod的時(shí)間和通過網(wǎng)絡(luò)下載鏡像的時(shí)間
- 運(yùn)行中(Runing):該P(yáng)od已經(jīng)綁定到一個(gè)節(jié)點(diǎn)上,Pod中所有的容器都已被創(chuàng)建,至少有一個(gè)容器正在運(yùn)行,或者正處于啟動(dòng)或重啟狀態(tài)
- 成功(Successed):Pod中的所有容器都被成功終止,并且不會(huì)重啟
- 失敗(Failed):Pod中的所有容器都已經(jīng)終止了,并且至少有一個(gè)容器是因?yàn)槭〗K止,也就是說容器已非0狀態(tài)退出或者被系統(tǒng)終止
- 未知(Unknown):因?yàn)槟承┰驘o法取得Pod的狀態(tài),通常因?yàn)榕cPod所在主機(jī)通信失敗
總結(jié)
以上是生活随笔為你收集整理的Kubernetes中Pod的生命周期的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: kubenetes中YAML的字段解释
- 下一篇: Kubernetes的控制器类型即使用案