目錄
一、概述
二、Pod機(jī)制
2.1、共享網(wǎng)絡(luò)
2.2、共享存儲(chǔ)
三、Pod資源清單
四、 Pod 的分類
五、Pod階段
六、Pod 鏡像拉取策略
ImagePullBackOff
七、Pod 資源限制
八、容器重啟策略
一、概述
Pod 是可以在 Kubernetes 中創(chuàng)建和管理的、最小的可部署的計(jì)算單元。Pod 里面是由一個(gè)或多個(gè)容器組成【一組容器的集合】,這些容器共享存儲(chǔ)、網(wǎng)絡(luò)、以及怎樣運(yùn)行這些容器的聲明。
Pod 是 Kubernetes 的最重要概念,每一個(gè) Pod 都有一個(gè)特殊的被稱為”根容器“的Pause容器。Pause 容器對(duì)應(yīng)的鏡像屬于 Kubernetes 平臺(tái)的一部分,除了Pause 容器,每個(gè)Pod還包含一個(gè)或多個(gè)緊密相關(guān)的用戶業(yè)務(wù)容器。
Pod有以下一些特性:
- 資源共享
一個(gè) Pod 里的多個(gè)容器可以共享存儲(chǔ)和網(wǎng)絡(luò),可以看作一個(gè)邏輯的主機(jī)。共享namespace,cgroups 或者其他的隔離資源。
一個(gè) Pod 里的多個(gè)容器可以共享存儲(chǔ)卷,這個(gè)存儲(chǔ)卷會(huì)被定義為 Pod 的一部分,并且可以掛載到該 Pod 里的所有容器的文件系統(tǒng)上 。
- 生命周期短暫
Pod 屬于生命周期比較短暫的組件,比如,當(dāng) Pod 所在節(jié)點(diǎn)發(fā)生故障,那么該節(jié)點(diǎn)上的Pod會(huì)被調(diào)度到其他節(jié)點(diǎn),但需要注意的是,被重新調(diào)度的 Pod 是一個(gè)全新的Pod,跟之前的Pod 沒有任何關(guān)系。
- 平坦的網(wǎng)絡(luò)
k8s 集群中的所有 Pod 都在同一個(gè)共享網(wǎng)絡(luò)地址空間中,也就是說每個(gè)Pod 都可以通過其他 Pod 的 IP 地址來實(shí)現(xiàn)訪問。
二、Pod機(jī)制
Pod 主要有以下兩大機(jī)制:共享網(wǎng)絡(luò) 和 共享存儲(chǔ)。
2.1、共享網(wǎng)絡(luò)
容器通過 namespace 和 group 進(jìn)行隔離。通過Pause容器,把其它業(yè)務(wù)容器加入到Pause容器中,讓所有業(yè)務(wù)容器在同一個(gè)名稱空間中,可以實(shí)現(xiàn)網(wǎng)絡(luò)共享。在同一個(gè) Pod 內(nèi),所有容器共享一個(gè) IP 地址和端口空間,并且可以通過 localhost 發(fā)現(xiàn)對(duì)方。
2.2、共享存儲(chǔ)
一個(gè) Pod 可以設(shè)置一組共享的存儲(chǔ)卷。 Pod 中的所有容器都可以訪問該共享卷,從而允許這些容器共享數(shù)據(jù)。 卷還允許 Pod 中的持久數(shù)據(jù)保留下來,即使其中的容器需要重新啟動(dòng)。
三、Pod資源清單
下面給出yaml文件定義的nginx Pod 的示例內(nèi)容:
$ kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-748c667d99-mp4d6 0/1 ContainerCreating 0 5s
// 查看pod的yaml資源清單
$ kubectl get pods nginx-748c667d99-mp4d6 -o yaml
apiVersion: v1 //版本號(hào)
kind: Pod //資源類型,這里是Pod
metadata: //元數(shù)據(jù)
annotations: //pod注解信息
cni.projectcalico.org/containerID: 8190e79f9ce4ebc75058013e14bd247a8a92210b28b613f9f80bcc761975117b
cni.projectcalico.org/podIP: 192.168.1.3/32
cni.projectcalico.org/podIPs: 192.168.1.3/32
creationTimestamp: "2022-12-29T06:27:33Z"
generateName: nginx-748c667d99- //名稱前綴
labels: //pod標(biāo)簽列表
app: nginx
pod-template-hash: 748c667d99
name: nginx-748c667d99-mp4d6 //pod名稱
namespace: default //pod所在的命名空間,默認(rèn)為default
ownerReferences:
- apiVersion: apps/v1
blockOwnerDeletion: true
controller: true
kind: ReplicaSet
name: nginx-748c667d99
uid: f09e2cff-2983-4af9-98e3-71e0d470eaa2
resourceVersion: "2873"
uid: 28f22749-7343-428e-a20a-d7973e4c5a94
spec: // 資源特征
containers: //pod 中的容器列表,可以有多個(gè)容器
- image: nginx //鏡像地址,默認(rèn)從docker hub拉取nginx鏡像
imagePullPolicy: Always //獲取鏡像的策略,默認(rèn)值為Always,每次都嘗試重新下載鏡像. 有三種取值:[Always|Never|IfNotPresent]
name: nginx //容器的名稱
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts: //掛載到到容器內(nèi)部的存儲(chǔ)卷設(shè)置
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount //存儲(chǔ)卷在容器內(nèi)部 Mount的絕對(duì)路徑
name: kube-api-access-78n9q //引用的是kube-api-access-78n9這個(gè)容器卷,在下邊有定義這個(gè)volume
readOnly: true //只讀,默認(rèn)值為讀寫
dnsPolicy: ClusterFirst
enableServiceLinks: true
nodeName: node01 //pod所在的節(jié)點(diǎn)名稱,由調(diào)度器scheduler進(jìn)行調(diào)度
preemptionPolicy: PreemptLowerPriority
priority: 0
restartPolicy: Always //重啟策略
schedulerName: default-scheduler //使用默認(rèn)的調(diào)度器,通常情況下使用默認(rèn)的即可
securityContext: {}
serviceAccount: default
serviceAccountName: default
terminationGracePeriodSeconds: 30
tolerations: //污點(diǎn)容忍
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
volumes: //定義volume容器卷列表
- name: kube-api-access-78n9q
projected:
defaultMode: 420
sources:
- serviceAccountToken:
expirationSeconds: 3607
path: token
- configMap:
items:
- key: ca.crt
path: ca.crt
name: kube-root-ca.crt
- downwardAPI:
items:
- fieldRef:
apiVersion: v1
fieldPath: metadata.namespace
path: namespace
status:
conditions: //pod的狀況
- lastProbeTime: null
lastTransitionTime: "2022-12-29T06:27:35Z"
status: "True"
type: Initialized
- lastProbeTime: null
lastTransitionTime: "2022-12-29T06:27:51Z"
status: "True"
type: Ready
- lastProbeTime: null
lastTransitionTime: "2022-12-29T06:27:51Z"
status: "True"
type: ContainersReady
- lastProbeTime: null
lastTransitionTime: "2022-12-29T06:27:35Z"
status: "True"
type: PodScheduled
containerStatuses:
- containerID: containerd://1c7e903816a0de4192f3ffe4b3026d59bee259aa75b15a036d48aa3250574ad2
image: docker.io/library/nginx:latest
imageID: docker.io/library/nginx@sha256:0047b729188a15da49380d9506d65959cce6d40291ccfb4e039f5dc7efd33286
lastState: {}
name: nginx
ready: true
restartCount: 0
started: true
state:
running:
startedAt: "2022-12-29T06:27:50Z"
hostIP: 172.30.2.2
phase: Running
podIP: 192.168.1.3
podIPs:
- ip: 192.168.1.3
qosClass: BestEffort
startTime: "2022-12-29T06:27:35Z"
四、 Pod 的分類
Pod 有兩種類型:
- (1)普通 Pod
普通 Pod 一旦被創(chuàng)建,就會(huì)被放入到 etcd 中存儲(chǔ),隨后會(huì)被 Kubernetes Master 調(diào)度到某個(gè)具體的 Node 上并進(jìn)行綁定,隨后該 Pod 對(duì)應(yīng)的 Node 上的 kubelet 進(jìn)程實(shí)例化成一組相關(guān)的 Docker 容器并啟動(dòng)起來。在默認(rèn)情 況下,當(dāng) Pod 里某個(gè)容器停止時(shí),Kubernetes 會(huì)自動(dòng)檢測到這個(gè)問題并且重新啟動(dòng)這個(gè) Pod 里某所有容器, 如果 Pod 所在的Node 宕機(jī),則會(huì)將這個(gè) Node 上的所有 Pod 重新調(diào)度到其它節(jié)點(diǎn)上。
- (2)靜態(tài) Pod
靜態(tài) Pod 是由 kubelet 進(jìn)行管理的僅存在于特定 Node 上的 Pod,它們不能通過API Server進(jìn)行管理,無法與 ReplicationController、Deployment 或 DaemonSet 進(jìn)行關(guān)聯(lián),并且kubelet 也無法對(duì)它們進(jìn)行健康檢查。
五、Pod階段
Pod 的 status 字段是一個(gè) PodStatus 對(duì)象,其中包含一個(gè) phase 字段。Pod 的階段(Phase)是 Pod 在其生命周期中所處位置的簡單宏觀概述。
下面是 phase 可能的值:
狀態(tài) |
說明 |
Pending(懸決) |
api server已經(jīng)創(chuàng)建了該pod,但pod中的一個(gè)或者多個(gè)容器的鏡像還沒有創(chuàng)建,包括鏡像下載過程 |
Running(運(yùn)行中) |
pod內(nèi)所有容器已經(jīng)創(chuàng)建,且至少一個(gè)容器處于運(yùn)行狀態(tài)、正在啟動(dòng)或者正在重啟狀態(tài) |
Succeeded(成功) |
pod內(nèi)所有容器均成功退出,且不會(huì)再重啟 |
Failed(失?。?/p> |
pod內(nèi)所有容器均已退出,但至少一個(gè)容器退出失敗 |
Unknown(未知) |
由于某種原因無法獲取pod狀態(tài),例如網(wǎng)絡(luò)通信不暢 |
當(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ù)來強(qiáng)制終止 Pod。
六、Pod 鏡像拉取策略
容器的 imagePullPolicy 和鏡像的標(biāo)簽會(huì)影響 kubelet 嘗試?yán)。ㄏ螺d)指定的鏡像。
以下列表包含了 imagePullPolicy 可以設(shè)置的值,以及這些值的效果:
- IfNotPresent
只有當(dāng)鏡像在本地不存在時(shí)才會(huì)拉取。
- Always
每當(dāng) kubelet 啟動(dòng)一個(gè)容器時(shí),kubelet 會(huì)查詢?nèi)萜鞯溺R像倉庫, 將名稱解析為一個(gè)鏡像摘要。 如果 kubelet 有一個(gè)容器鏡像,并且對(duì)應(yīng)的摘要已在本地緩存,kubelet 就會(huì)使用其緩存的鏡像; 否則,kubelet 就會(huì)使用解析后的摘要拉取鏡像,并使用該鏡像來啟動(dòng)容器。
- Never
Kubelet 不會(huì)嘗試獲取鏡像。如果鏡像已經(jīng)以某種方式存在本地, kubelet 會(huì)嘗試啟動(dòng)容器;否則,會(huì)啟動(dòng)失敗。
在生產(chǎn)環(huán)境中部署容器時(shí),你應(yīng)該避免使用 :latest 標(biāo)簽,因?yàn)檫@使得正在運(yùn)行的鏡像的版本難以追蹤,并且難以正確地回滾。
相反,應(yīng)指定一個(gè)有意義的標(biāo)簽,如 v1.42.0。
ImagePullBackOff
當(dāng) kubelet 使用容器運(yùn)行時(shí)創(chuàng)建 Pod 時(shí),容器可能因?yàn)?ImagePullBackOff 導(dǎo)致狀態(tài)為 Waiting。
ImagePullBackOff 狀態(tài)意味著容器無法啟動(dòng), 因?yàn)?Kubernetes 無法拉取容器鏡像(原因包括無效的鏡像名稱,或從私有倉庫拉取而沒有 imagePullSecret)。 BackOff 部分表示 Kubernetes 將繼續(xù)嘗試?yán)$R像,并增加回退延遲。
Kubernetes 會(huì)增加每次嘗試之間的延遲,直到達(dá)到編譯限制,即 300 秒(5 分鐘)。
七、Pod 資源限制
每個(gè) Pod 都可以對(duì)其能使用的服務(wù)器上的計(jì)算資源設(shè)置限額,Kubernetes 中可以設(shè)置限額的計(jì)算資源有 CPU 與 Memory 兩種,其中 CPU 的資源單位為 CPU 數(shù)量,是一個(gè)絕對(duì)值而非相對(duì)值。Memory 配額也是一個(gè)絕對(duì)值,它的單位是內(nèi)存字節(jié)數(shù)。 Kubernetes 里,一個(gè)計(jì)算資源進(jìn)行配額限定需要設(shè)定以下兩個(gè)參數(shù):
- Requests :該資源最小申請(qǐng)數(shù)量,系統(tǒng)必須滿足要求【表示調(diào)度所需的資源】 ;
- Limits :該資源最大允許使用的量,不能突破,當(dāng)容器試圖使用超過這個(gè)量的資源時(shí),可能會(huì)被 Kubernetes Kill 并重啟 【表示最大所占用的資源】;
spec:
containers:
- name: mysql
image: mysql
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
上述代碼表明 mysql 容器申請(qǐng)最少 0.25 個(gè) CPU 以及 64MiB 內(nèi)存,在運(yùn)行過程中容器所能使用的資源配額為 0.5 個(gè) CPU 以及 128MiB 內(nèi)存。
八、容器重啟策略
Pod 的 spec 中包含一個(gè) restartPolicy 字段,其可能取值包括 Always、OnFailure 和 Never。默認(rèn)值是 Always。
restartPolicy 適用于 Pod 中的所有容器,restartPolicy 僅針對(duì)同一節(jié)點(diǎn)上 kubelet 的容器重啟動(dòng)作。當(dāng) Pod 中的容器退出時(shí),kubelet 會(huì)按指數(shù)回退方式計(jì)算重啟的延遲(10s、20s、40s、...),其最長延遲為 5 分鐘。 一旦某容器執(zhí)行了 10 分鐘并且沒有出現(xiàn)問題,kubelet 對(duì)該容器的重啟回退計(jì)時(shí)器執(zhí)行重置操作。文章來源:http://www.zghlxwxcb.cn/news/detail-616092.html
重啟策略(restartPolicy)主要分為以下三種:文章來源地址http://www.zghlxwxcb.cn/news/detail-616092.html
- Always:當(dāng)容器終止退出后,總是重啟容器,默認(rèn)策略 ;
- OnFailure:當(dāng)容器異常退出且退出狀態(tài)碼非0時(shí),才重啟容器;
- Never:當(dāng)容器終止退出,都不重啟容器 ;
到了這里,關(guān)于6、Kubernetes核心技術(shù) - Pod的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!