?
?
個(gè)人主頁(yè):征服bug-CSDN博客
kubernetes專(zhuān)欄:kubernetes_征服bug的博客-CSDN博客?
目錄
1 什么是 Pod
2 Pod 基本操作
3 Pod 運(yùn)行多個(gè)容器
4 Pod 的 Labels(標(biāo)簽)
5 Pod 的生命周期
1 什么是 Pod
摘取官網(wǎng): Pod | Kubernetes
1.1 簡(jiǎn)介
????????Pod 是可以在 Kubernetes 中創(chuàng)建和管理的、最小的可部署的計(jì)算單元。Pod(就像在鯨魚(yú)莢或者豌豆莢中)是一組(一個(gè)或多個(gè))容器; 這些容器共享存儲(chǔ)、網(wǎng)絡(luò)、以及怎樣運(yùn)行這些容器的聲明。 Pod 中的內(nèi)容總是并置(colocated)的并且一同調(diào)度,在共享的上下文中運(yùn)行。簡(jiǎn)言之如果用 Docker 的術(shù)語(yǔ)來(lái)描述,Pod 類(lèi)似于共享名字空間并共享文件系統(tǒng)卷的一組容器。
定義: Pod 就是用來(lái)管理一組(一個(gè)|多個(gè))容器的集合 特點(diǎn): 共享網(wǎng)絡(luò) 共享存儲(chǔ) 共享上下文環(huán)境
1.2 Pod 怎樣管理多個(gè)容器?
????????Pod 中的容器被自動(dòng)安排到集群中的同一物理機(jī)或虛擬機(jī)上,并可以一起進(jìn)行調(diào)度。 容器之間可以共享資源和依賴(lài)、彼此通信、協(xié)調(diào)何時(shí)以及何種方式終止自身。例如,你可能有一個(gè)容器,為共享卷中的文件提供 Web 服務(wù)器支持,以及一個(gè)單獨(dú)的 "邊車(chē) (sidercar)" 容器負(fù)責(zé)從遠(yuǎn)端更新這些文件,如下圖所示:
?
1.3 如何使用 Pod?
????????通常你不需要直接創(chuàng)建 Pod,甚至單實(shí)例 Pod。 相反,你會(huì)使用諸如 Deployment 或 Job 這類(lèi)工作負(fù)載資源來(lái)創(chuàng)建 Pod。 如果 Pod 需要跟蹤狀態(tài),可以考慮 StatefulSet 資源。
Kubernetes 集群中的 Pod 主要有兩種用法:
-
運(yùn)行單個(gè)容器的 Pod。"每個(gè) Pod 一個(gè)容器" 模型是最常見(jiàn)的 Kubernetes 用例; 在這種情況下,可以將 Pod 看作單個(gè)容器的包裝器,并且 Kubernetes 直接管理 Pod,而不是容器。
-
運(yùn)行多個(gè)協(xié)同工作的容器 的 Pod。 Pod 可能封裝由多個(gè)緊密耦合且需要共享資源的共處容器組成的應(yīng)用程序。 這些位于同一位置的容器可能形成單個(gè)內(nèi)聚的服務(wù)單元 —— 一個(gè)容器將文件從共享卷提供給公眾, 而另一個(gè)單獨(dú)的 “邊車(chē)”(sidecar)容器則刷新或更新這些文件。 Pod 將這些容器和存儲(chǔ)資源打包為一個(gè)可管理的實(shí)體。
說(shuō)明:
-
將多個(gè)并置、同管的容器組織到一個(gè) Pod 中是一種相對(duì)高級(jí)的使用場(chǎng)景。 只有在一些場(chǎng)景中,容器之間緊密關(guān)聯(lián)時(shí)你才應(yīng)該使用這種模式。
-
每個(gè) Pod 都旨在運(yùn)行給定應(yīng)用程序的單個(gè)實(shí)例。如果希望橫向擴(kuò)展應(yīng)用程序 (例如,運(yùn)行多個(gè)實(shí)例以提供更多的資源),則應(yīng)該使用多個(gè) Pod,每個(gè)實(shí)例使用一個(gè) Pod。 在 Kubernetes 中,這通常被稱(chēng)為副本(Replication)。 通常使用一種工作負(fù)載資源及其控制器來(lái)創(chuàng)建和管理一組 Pod 副本。
2 Pod 基本操作
2.1 查看 pod
# 查看默認(rèn)命名空間的 pod
$ kubectl get pods|pod|po
?
# 查看所有命名空間的 pod
$ kubectl get pods|pod -A
$ kubectl get pods|pod|po -n 命名空間名稱(chēng)
?
# 查看默認(rèn)命名空間下 pod 的詳細(xì)信息
$ kubectl get pods -o wide
?
# 查看所有命名空間下 pod 的詳細(xì)信息
$ kubectl get pods -o wide -A
?
# 實(shí)時(shí)監(jiān)控 pod 的狀態(tài)
$ kubectl get pod -w
2.2 創(chuàng)建 pod
pod : kubectl run nginx(pod名稱(chēng)) --image=nginx:1.19
container: docker run --name nginx nginx:1.19
官網(wǎng)參考地址: Pod | Kubernetes
# nginx-pod.yml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
? - name: nginx
? ? image: nginx:1.19
? ? ports:
? - containerPort: 80
# 使用 kubectl apply/create -f 創(chuàng)建 pod
$ kubectl create -f nginx-pod.yml
$ kubectl apply -f nginx-pod.yml
注意: create 僅僅是不存在時(shí)創(chuàng)建,如果已經(jīng)存在則報(bào)錯(cuò)!apply 不存在創(chuàng)建,存在更新配置。推薦使用 apply!
2.3 刪除 pod
$ kubectl delete pod pod名稱(chēng)
$ kubectl delete -f pod.yml
2.4 進(jìn)入 pod 中容器
# 注意: 這種方式進(jìn)入容器默認(rèn)只會(huì)進(jìn)入 pod 中第一個(gè)容器
$ kubectl exec -it nginx(pod名稱(chēng)) --(固定寫(xiě)死) bash(執(zhí)行命令)
# 注意: 進(jìn)入指定 pod 中指定容器
$ kubectl exec -it pod名稱(chēng) -c 容器名稱(chēng) --(固定寫(xiě)死) bash(執(zhí)行命令)
2.5 查看 pod 日志
# 注意: 查看 pod 中第一個(gè)容器日志
$ kubectl logs -f(可選,實(shí)時(shí)) nginx(pod 名稱(chēng))
# 注意: 查看 pod 中指定容器的日志
$ kubect logs -f pod名稱(chēng) -c 容器名稱(chēng)
2.6 查看 pod 描述信息
$ kubectl describe pod nginx(pod名稱(chēng))
3 Pod 運(yùn)行多個(gè)容器
3.1 創(chuàng)建 pod
# myapp-pod.yml
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
containers:
? - name: nginx
? ? image: nginx:1.19
? ? ports:
? - containerPort: 80
? ? imagePullPolicy: IfNotPresent
?
? - name: redis
? ? image: redis:5.0.10
? ? ports:
? - containerPort: 6379
? ? imagePullPolicy: IfNotPresent
? ? ? ? 創(chuàng)建運(yùn)行
$ kubectl apply -f myapp-pod.yml
3.2 查看指定容器日志
# 查看日志 (默認(rèn)只查看第一個(gè)容器日志,這里是展示 nginx 日志)
$ kubectl logs -f myapp
?
# 查看 pod 中指定容器的日志
$ kubectl logs -f myapp -c nginx(容器名稱(chēng))
$ kubectl logs -f myapp -c redis(容器名稱(chēng))
3.3 進(jìn)入容器
# 進(jìn)入 pod 的容器 (默認(rèn)進(jìn)入第一個(gè)容器內(nèi)部,這里會(huì)進(jìn)入 nginx 容器內(nèi)部)
$ kubectl exec -it myapp -- sh
?
# 進(jìn)入 pod 中指定容器內(nèi)部
$ kubectl exec -it myapp -c nginx -- sh
$ kubectl exec -it myapp -c redis -- sh
4 Pod 的 Labels(標(biāo)簽)
??標(biāo)簽(Labels)
是附加到 Kubernetes 對(duì)象(比如 Pod)上的鍵值對(duì)。 標(biāo)簽旨在用于指定對(duì)用戶(hù)有意義且相關(guān)的對(duì)象的標(biāo)識(shí)屬性。標(biāo)簽可以在創(chuàng)建時(shí)附加到對(duì)象,隨后可以隨時(shí)添加和修改。每個(gè)對(duì)象都可以定義一組鍵(key)/值(value)標(biāo)簽,但是每個(gè)鍵(key)對(duì)于給定對(duì)象必須是唯一的。
標(biāo)簽作用: 就是用來(lái)給 k8s 中對(duì)象起別名, 有了別名可以過(guò)濾和篩選
4.1 語(yǔ)法
標(biāo)簽由鍵值對(duì)組成
,其有效標(biāo)簽值:
-
必須為 63 個(gè)字符或更少(可以為空)
-
除非標(biāo)簽值為空,必須以字母數(shù)字字符(
[a-z0-9A-Z]
)開(kāi)頭和結(jié)尾 -
包含破折號(hào)(
-
)、下劃線(xiàn)(_
)、點(diǎn)(.
)和字母或數(shù)字
4.2 示例
apiVersion: v1
kind: Pod
metadata:
name: myapp
labels:
? name: myapp #創(chuàng)建時(shí)添加
spec:
containers:
? - name: nginx
? ? image: nginx:1.21
? ? imagePullPolicy: IfNotPresent
?
? - name: redis
? ? image: redis:5.0.10
? ? imagePullPolicy: IfNotPresent
restartPolicy: Always
4.3 標(biāo)簽基本操作
# 查看標(biāo)簽
$ kubectl get pods --show-labels
?
# kubectl label pod pod名稱(chēng) 標(biāo)簽鍵值對(duì)
$ kubectl label pod myapp env=prod
?
# 覆蓋標(biāo)簽 --overwrite
$ kubectl label --overwrite pod myapp env=test
?
# 刪除標(biāo)簽 -號(hào)代表刪除標(biāo)簽
$ kubectl label pod myapp env-
?
# 根據(jù)標(biāo)簽篩選 env=test/env > = <
$ kubectl get po -l env=test
$ kubectl get po -l env
$ kubectl get po -l '!env' # 不包含的 pod
$ kubectl get po -l 'env in (test,prod)' #選擇含有指定值的 pod
$ kubectl get po -l 'env notin (test,prod)' #選擇含有指定值的 pod
5 Pod 的生命周期
摘自官網(wǎng): Pod 的生命周期 | Kubernetes
????????Pod 遵循預(yù)定義的生命周期,起始于 Pending
階段, 如果至少其中有一個(gè)主要容器正常啟動(dòng),則進(jìn)入 Running
,之后取決于 Pod 中是否有容器以失敗狀態(tài)結(jié)束而進(jìn)入 Succeeded
或者 Failed
階段。與此同時(shí)Pod 在其生命周期中只會(huì)被調(diào)度一次。 一旦 Pod 被調(diào)度(分派)到某個(gè)節(jié)點(diǎn),Pod 會(huì)一直在該節(jié)點(diǎn)運(yùn)行,直到 Pod 停止或者被終止。
5.1 生命周期
????????和一個(gè)個(gè)獨(dú)立的應(yīng)用容器一樣,Pod 也被認(rèn)為是相對(duì)臨時(shí)性(而不是長(zhǎng)期存在)的實(shí)體。 Pod 會(huì)被創(chuàng)建、賦予一個(gè)唯一的 ID(UID), 并被調(diào)度到節(jié)點(diǎn),并在終止(根據(jù)重啟策略)或刪除之前一直運(yùn)行在該節(jié)點(diǎn)。如果一個(gè)節(jié)點(diǎn)死掉了,調(diào)度到該節(jié)點(diǎn)的 Pod 也被計(jì)劃在給定超時(shí)期限結(jié)束后刪除。
????????Pod 自身不具有自愈能力。如果 Pod 被調(diào)度到某節(jié)點(diǎn)而該節(jié)點(diǎn)之后失效, Pod 會(huì)被刪除;類(lèi)似地,Pod 無(wú)法在因節(jié)點(diǎn)資源耗盡或者節(jié)點(diǎn)維護(hù)而被驅(qū)逐期間繼續(xù)存活。 Kubernetes 使用一種高級(jí)抽象來(lái)管理這些相對(duì)而言可隨時(shí)丟棄的 Pod 實(shí)例, 稱(chēng)作控制器。
????????任何給定的 Pod (由 UID 定義)從不會(huì)被“重新調(diào)度(rescheduled)”到不同的節(jié)點(diǎn); 相反,這一 Pod 可以被一個(gè)新的、幾乎完全相同的 Pod 替換掉。 如果需要,新 Pod 的名字可以不變,但是其 UID 會(huì)不同。
????????如果某物聲稱(chēng)其生命期與某 Pod 相同,例如存儲(chǔ)卷, 這就意味著該對(duì)象在此 Pod (UID 亦相同)存在期間也一直存在。 如果 Pod 因?yàn)槿魏卧虮粍h除,甚至完全相同的替代 Pod 被創(chuàng)建時(shí), 這個(gè)相關(guān)的對(duì)象(例如這里的卷)也會(huì)被刪除并重建。
5.2 pod 階段
Pod 階段的數(shù)量和含義是嚴(yán)格定義的。 除了本文檔中列舉的內(nèi)容外,不應(yīng)該再假定 Pod 有其他的 phase
值。
取值 | 描述 |
---|---|
Pending (懸決) |
Pod 已被 Kubernetes 系統(tǒng)接受,但有一個(gè)或者多個(gè)容器尚未創(chuàng)建亦未運(yùn)行。此階段包括等待 Pod 被調(diào)度的時(shí)間和通過(guò)網(wǎng)絡(luò)下載鏡像的時(shí)間。 |
Running (運(yùn)行中) |
Pod 已經(jīng)綁定到了某個(gè)節(jié)點(diǎn),Pod 中所有的容器都已被創(chuàng)建。至少有一個(gè)容器仍在運(yùn)行,或者正處于啟動(dòng)或重啟狀態(tài)。 |
Succeeded (成功) |
Pod 中的所有容器都已成功終止,并且不會(huì)再重啟。 |
Failed (失?。?/td>
| Pod 中的所有容器都已終止,并且至少有一個(gè)容器是因?yàn)槭〗K止。也就是說(shuō),容器以非 0 狀態(tài)退出或者被系統(tǒng)終止。 |
Unknown (未知) |
因?yàn)槟承┰驘o(wú)法取得 Pod 的狀態(tài)。這種情況通常是因?yàn)榕c Pod 所在主機(jī)通信失敗。 |
說(shuō)明:
當(dāng)一個(gè) Pod 被刪除時(shí),執(zhí)行一些 kubectl 命令會(huì)展示這個(gè) Pod 的狀態(tài)為
Terminating
(終止)。 這個(gè)Terminating
狀態(tài)并不是 Pod 階段之一。 Pod 被賦予一個(gè)可以體面終止的期限,默認(rèn)為 30 秒。 你可以使用--force
參數(shù)來(lái)強(qiáng)制終止 Pod。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-630743.html如果某節(jié)點(diǎn)死掉或者與集群中其他節(jié)點(diǎn)失聯(lián),Kubernetes 會(huì)實(shí)施一種策略,將失去的節(jié)點(diǎn)上運(yùn)行的所有 Pod 的
phase
設(shè)置為Failed
。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-630743.html
到了這里,關(guān)于【云原生】深入掌握k8s中Pod和生命周期的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!