五、k8s資源清單與容器生命周期

1、集群資源分類

名稱空間級別:名稱空間(Namespace)是用于隔離和組織資源的一種機(jī)制。每個資源都屬于一個特定的名稱空間,并且可以通過名稱空間來對資源進(jìn)行分組和管理。

. 工作負(fù)載型資源:pod 、各種控制器

. 服務(wù)發(fā)現(xiàn)及負(fù)載型資源:Service、Ingress

. 配置與存儲型資源:Volume、CSI

. 特殊類型的存儲卷:ConfigMap、Secret、DownwardAPI

集群級別:有一些資源是在整個集群范圍內(nèi)創(chuàng)建和管理的,而不是在特定的名稱空間中??梢员欢鄠€名稱空間中的資源共享和使用。通過集群級別資源,可以管理和配置整個集群的行為和屬性。

. Node(節(jié)點(diǎn)):Node 是 Kubernetes 集群中的工作節(jié)點(diǎn),它可以運(yùn)行容器化的應(yīng)用程序。Node 代表集群中的物理或虛擬機(jī)器,并提供計(jì)算和存儲資源。

.??Namespace(名稱空間):雖然名稱空間通常是在特定的名稱空間級別創(chuàng)建和管理的,但集群級別也有一個默認(rèn)的名稱空間(default),用于存放沒有明確指定名稱空間的資源。

.?Cluster(集群):Cluster 是整個 Kubernetes 系統(tǒng)的頂層概念,它由一組相互連接的節(jié)點(diǎn)組成。Cluster 用于管理和協(xié)調(diào)集群中的各種資源。

.?StorageClass(存儲類):StorageClass 定義了用于創(chuàng)建 PersistentVolume 的存儲配置。它描述了存儲系統(tǒng)的屬性和參數(shù),并允許在集群級別定義不同的存儲類。

.?ClusterRole(集群角色)和 ClusterRoleBinding(集群角色綁定):ClusterRole 定義了一組權(quán)限,可以在整個集群范圍內(nèi)使用。ClusterRoleBinding 將 ClusterRole 授予用戶、組或服務(wù)賬戶,以控制其對集群級別資源的訪問權(quán)限。

.?CustomResourceDefinition(自定義資源定義):CustomResourceDefinition 允許用戶定義自己的自定義資源類型,這些資源類型可以在整個集群范圍內(nèi)使用。

元數(shù)據(jù)類型:根據(jù)指標(biāo)進(jìn)行對應(yīng)操作。如:HPA、PodTemplate、LimitRange

2、YAML文件

http://www.itdecent.cn/p/a2df63b7a901?v=1702538513542

3、pod生命周期

4、InitC

(1)說明

InitC容器與普通容器非常像,除了如下兩點(diǎn):

(1)Init容器總是運(yùn)行到成功為止;即如果沒有啟動成功,k8s會不斷重啟該pod(除非pod對應(yīng)的restarPolicy為Never,它不會重啟)

(2)每個Init容器必須在下一個Inti容器啟動之前完成

(2)? 測試如下

apiVersion: v1

kind: Pod

metadata:

? name: myapp-pod

? labels:

? ? app: myapp

spec:

? containers:

? ? ? - name: myapp-container

? ? ? image: busybox

? ? command: ['sh','-c','echo The app is running! && sleep 3600']

? initContainers:

? ? ? - name: init-myservice

? ? ? image: busybox

? ? command: ['sh','-c',' until nslookup myservice; do echo waiting for myservice; sleep 2;done;']

? ? -name: init-mydb

? ? image: busybox

? command: ['sh','-c','until nslookup mydb; do echo waiting for mydb; sleep 2; done;']

kind: Service

apiVersion: v1

metadata:

? ? name: myservice

spec:

? ports:

? - protocol: TCP

? ? ? ? port: 80

? ? targetPort: 9376

---

kind: Service

apiVersion: v1

metadata:

? ? name: mydb

spec:

? ports:

? ? -protocol: TCP

? ? ? ? port: 80

? ? targetPort: 9377

kubectl?create -f??myservice.yaml? ?# 以yaml形式創(chuàng)建service

kubectl?create -f??mydb.yaml? ?# 以yaml形式創(chuàng)建service

kubectl?create -f??init-pod.yaml? ?# 以yaml形式創(chuàng)建Pod

kubectl? get pod -n kube-system #獲取位于?kube-system?命名空間中的 Pod 列表

kubectl describe pod myapp-pod #查看myapp-pod信息(名稱、運(yùn)行狀態(tài)、事件等)

kubectl log myapp-pod -c test? ?#查看myapp-pod中容器為test 的日志(只有一個容器,無需-c)

(3)特殊說明

1、在Pod啟動過程中,Init容器會按順序在網(wǎng)絡(luò)和數(shù)據(jù)卷初始化之后啟動。每個容器必須在下一個容器啟動之前成功退出;

2、如果由于運(yùn)行時或失敗退出,將導(dǎo)致容器啟動失敗,它會根據(jù)Pod的restartPolicy指定的策略進(jìn)行重試。然而,如果Pod的 restartPolicy 設(shè)置為 Always,Init 容器失敗時會使用 RestartPolicy策略

3、在所有的Init容器沒有成功之前,Pod將不會變成Ready狀態(tài)。Init容器的端口將不會在 Service中進(jìn)行聚集。 正在初始化中的Pod處于Pending狀態(tài),但應(yīng)該會將Initializing狀態(tài)設(shè)置為 true

4、如果Pod重啟,所有Init容器必須重新執(zhí)行

5、對Init容器spec的修改被限制在容器image字段,修改其他字段都不會生效。更改Init容器的 image字段,等價于重啟該P(yáng)od;

6、Init容器具有應(yīng)用容器的所有字段。除了readinessProbe,因?yàn)镮nit容器無法定義不同于完成(completion)的就緒(readiness)之外的其他狀態(tài)。這會在驗(yàn)證過程中強(qiáng)制執(zhí)行。readinessProbe?用于確定容器是否已準(zhǔn)備好接收流量,而 Init 容器的主要目的是在應(yīng)用容器啟動之前執(zhí)行一些初始化任務(wù),因此沒有必要進(jìn)行 readiness 探針的檢測。

7、在Pod中的每個app和Init容器的名稱必須唯一;與任何其它容器共享同一個名稱,會在驗(yàn)證時拋出錯誤

5、探針

init C 有一個很明顯的缺點(diǎn)就是,如果init C 容器去探測某個容器(主容器依賴的容器)已經(jīng)啟動,等待init C容器結(jié)束之后,主容器再去訪問該依賴容器,此時那個依賴容器掛了,就出現(xiàn)問題了,這個時候就需要探針來完成。探針可以通過主容器訪問依賴容器,即在主容器內(nèi)對依賴容器進(jìn)行訪問,比較合理。

探針是由kubelet對容器執(zhí)行的定期診斷。要執(zhí)行診斷,kubelet調(diào)用由容器實(shí)現(xiàn)的 Handler。

有三種類型的處理程序:

ExecAction: 在容器內(nèi)執(zhí)行指定命令。如果命令退出時返回碼為0則認(rèn)為診斷成功。

TCPSocketAction: 對指定端口上的容器的IP地址進(jìn)行TCP檢查。如果端口打開,則診斷被認(rèn)為是成功的。

HTTPGetAction: 對指定的端口和路徑上的容器的IP地址執(zhí)行 HTTP Get 請求。如果響應(yīng)的狀態(tài)碼大于等于200且小于400,則診斷被認(rèn)為是成功的

每次探測都將獲得以下三種結(jié)果之一:

成功:容器通過了診斷。

失敗:容器未通過診斷。

未知:診斷失敗,因此不會采取任何行動

如下有兩種探針

livenessProbe:存活檢測,不存活,直接重啟pod

readlinessProbe:就緒檢測,不就緒,不將pod狀態(tài)改為ready

(1)readinessProbe; (就緒探測)?

readinessProbe; (就緒探測) 指示容器是否準(zhǔn)備好服務(wù)請求。如果就緒探測失敗,端點(diǎn)控制器將從與Pod 匹配的所有Service的端點(diǎn)中刪除該P(yáng)od的IP地址。初始延遲之前的就緒狀態(tài)默認(rèn)為Failure。如果容器不提供就緒探針,則默認(rèn)狀態(tài)為 Success。

如下:容器在啟動時,1s后進(jìn)行就緒檢測,檢測index1.html是否存在,不存在,3s后再檢測,有的話,狀態(tài)改為ready

apiVersion: v1

kind: Pod

metadata:

? name: readiness-httpget-pod

? namespace: default

spec:

? containers:

? ? - name: readiness-httpget-container

? ? image: wangyanglinux/myapp:v1

? ? imagePullPolicy: IfNotPresent

?readinessProbe:

?httpGet:

? ? ? ? ? port: 80

? ? ? ? ? path: /index1.html

? ? ? ? initialDelaySeconds: 1? ? ##容器啟動后等待 1 秒后開始執(zhí)行第一次探測。

? ? ? ? periodSeconds: 3? ? ??##每隔 3 秒執(zhí)行一次探測。

創(chuàng)建完之后,比如 readiness-httpget-pod沒同時出現(xiàn)read和running,則說明存在問題。

這里用到一個命令 ,進(jìn)入pod的內(nèi)的某個容器內(nèi)查看明細(xì)

kubectlexecpod名 -c 容器 -it -- /bin/sh

(2)?livenessProbe:(存活探測)

livenessProbe:(存活探測) 指示容器是否正在運(yùn)行。如果存活探測失敗,則kubelet會殺死容器,并且容器將受到其重啟策略的影響。如果容器不提供存活探針,則默認(rèn)狀態(tài)為 Success。

如下:這個存活探針,在容器啟動后的第一秒開始,每隔 3 秒執(zhí)行一次探測命令?test -e /tmp/live,如果?/tmp/live?文件存在,探測成功,容器被認(rèn)為是存活的;如果文件不存在,探測失敗,容器被認(rèn)為出現(xiàn)了故障。

apiVersion: v1

kind: Pod

metadata:

? ? name: liveness-exec-pod

? ? namespace: default

spec:

? containers:

? - name: liveness-exec-container

? ? image: hub.atguigu.com/library/busybox

? ? imagePullPolicy: IfNotPresent

? ? command: ["/bin/sh","-c","touch /tmp/live; sleep 60; rm - rf /tmp/live; sleep 3600"]? ? ? ? ##容器啟動時執(zhí)行的命令,其中包括創(chuàng)建?/tmp/live?文件、等待 60 秒、刪除?/tmp/live?文件、再等待 3600 秒。

?livenessProbe:

? ? ? exec:

? ? ? ? command: ["test","-e","/tmp/live"]? ? ?##探測命令,用于檢測?/tmp/live?文件是否存在。

? ? ? initialDelaySeconds: 1? ? ##容器啟動后等待 1 秒后開始執(zhí)行第一次探測。

? ? ? periodSeconds: 3? ?##每隔 3 秒執(zhí)行一次探測。

如下:這個存活探針,在容器啟動后的第一秒開始,每隔 3 秒發(fā)送一個 HTTP GET 請求到容器的 "http" 端口的 "/index.html" 路徑。如果探測請求返回成功的狀態(tài)碼(2xx 或 3xx),探測成功,容器被認(rèn)為是存活的;如果返回失敗的狀態(tài)碼(4xx 或 5xx)或超時,探測失敗,容器被認(rèn)為出現(xiàn)了故障。

apiVersion: v1

kind: Pod

metadata:

? name: liveness-httpget-pod

? namespace: default

spec:

? containers:

? ? - name: liveness-httpget-container

? ? image: wangyanglinux/myapp:v1

? ? imagePullPolicy: IfNotPresent

? ? ports:? #定義容器暴露的端口列表。

? ? ? - name: http

? ? ? ? containerPort: 80

?????livenessProbe:

?????????httpGet:

? ? ? ? ? ????port: http? ?##指定探測請求發(fā)送到容器暴露的名為 "http" 的端口。改為80亦可

? ? ? ? ????? path: /index1.html

? ? ? ????initialDelaySeconds: 1

? ? ? ????periodSeconds: 3

? ? ????? timeoutSeconds: 10? ? ##探測請求的超時時間為 10 秒。

apiVersion: v1

kind: Pod

metadata:

? name: probe-tcp

? namespace: default

spec:

? containers:

? - name : nginx

? ? image: myapp:v1

?livenessProbe:

? ? ? ? initialDelaySeconds: 5

? ? ? ? timeoutSeconds: 1

?tcpSocket:

? ? ? ? ? ? port : 80

? ? periodSeconds: 3

6、stop 、start

Pod hook(鉤子) 是由Kubernetes 管理的kubelet 發(fā)起的,當(dāng)容器中的進(jìn)程啟動前或者容器中的進(jìn)程終止之前運(yùn)行,這是包含在容器的生命周期之中??梢酝瑫r為pod 中的所有容器都配置 hook

Hook的類型包括兩種:

exec : 執(zhí)行一段命令

HTTP: 發(fā)送HTTP請求

apiVersion: v1

kind: Pod

metadata:

? name: lifecycle-demo

spec:

? containers:

? ? ? - name: lifecycle-demo-container

? ? ? image: nginx

? ? ? lifecycle:

?postStart:? ? ? ? ? ? ? ? ? ? ? ? ? #在容器啟動后執(zhí)行的鉤子。

? ? ? ? ? ? exec:

? ? ? ? ? ? ? command: ["/bin/sh","-c","echo Hello from the postStart handler"]

?preStop:? ? ? ? ? ? ? ? ? ? ? ? ? ? #在容器終止之前執(zhí)行的鉤子。

? ? ? ? ? ? exec:

? ? ? ? ? ? ? command: ["/bin/sh","-c","echo Hello from the preStop handler"]

?Pod 中PodStatus的phase 可能存在的值

1、掛起(Pending): Pod已被Kubernetes系統(tǒng)接受,但有一個或者多個容器鏡像尚未創(chuàng)建。等待時間包括調(diào)度Pod的時間和通過網(wǎng)絡(luò)下載鏡像的時間,這可能需要花點(diǎn)時間

2、運(yùn)行中(Running):該P(yáng)od已經(jīng)綁定到了一個節(jié)點(diǎn)上,Pod中所有的容器都已被創(chuàng)建。至少有一個容器正在運(yùn)行,或者正處于啟動或重啟狀態(tài)

3、成功(Succeeded):Pod中的所有容器都被成功終止,并且不會再重啟

4、失敗(Failed):Pod中的所有容器都已終止了,并且至少有一個容器是因?yàn)?b>失敗終止。也就是說,容器以非0狀態(tài)退出或者被系統(tǒng)終止

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容