POD的意義
我們知道, pod是k8s是項(xiàng)目的原子調(diào)度單位.?
那么為什么是pod, 而不能是container呢? 回答這個(gè)問(wèn)題, 首先要明確container的本質(zhì)是進(jìn)程, 那么k8s是什么呢可帽? 當(dāng)然是操作系統(tǒng), 負(fù)責(zé)整個(gè)云服務(wù)的調(diào)度。而pod在container和k8s之間, 可以被定義為進(jìn)程組觉吭。
pod的定義來(lái)自于 Borg 項(xiàng)目, google工程師發(fā)現(xiàn), 他們部署的應(yīng)用往往存在類(lèi)似進(jìn)程和進(jìn)程組的關(guān)系, 他們之間要求必須部署在同一臺(tái)機(jī)器, 而沒(méi)有組的概念, 這個(gè)要求就會(huì)變得很難實(shí)現(xiàn)糠惫。也就是典型的成組調(diào)度問(wèn)題陨倡。
在云環(huán)境下, 比較有名的是mesos的資源囤積思路, 這會(huì)帶來(lái)調(diào)度效率損失和死鎖的可能性, 即使google提出樂(lè)觀鎖解決方案, 但是復(fù)雜的回滾和沖突解決方案也不是一般團(tuán)隊(duì)可以駕馭芥牌。
pod作為一組容器, 將多個(gè)容器的調(diào)度變?yōu)樵硬僮鳌?可以?xún)?yōu)雅的避免成組調(diào)度問(wèn)題
pod當(dāng)然不止上面一個(gè)優(yōu)勢(shì)祭陷。 pod是一個(gè)邏輯概念, pod是一組共享了某些資源的容器座哩。例如Network NameSpace 或者 Volume徒扶。 當(dāng)然這也可以通過(guò)docker去實(shí)現(xiàn), 但是這一實(shí)現(xiàn)會(huì)產(chǎn)生一組容器中先后啟動(dòng)的順序。? pod 通過(guò)中間容器(Infra容器) “hold”資源后, 用戶(hù)容器就可以加入到network中了根穷。 有了這個(gè)設(shè)計(jì),? Volume姜骡、Network、Namespce等都設(shè)計(jì)到pod層級(jí)就好屿良。
pod的第三個(gè)優(yōu)勢(shì)則是容器設(shè)計(jì)模式,? 具體可見(jiàn) Design Patterns for Container-based Distributed Systems
解析Pod對(duì)象
可以參考kubernetes/vendor/k8s.io/api/core/v1/types.go: type pod struce 中的內(nèi)容
1. 哪些屬性屬于pod, 哪些屬性屬于container圈澈?
首先pod扮演的是部署環(huán)境中的“虛擬機(jī)”, container是虛擬機(jī)中的一個(gè)字段。 所以在定義的時(shí)候, 很容易想到, 調(diào)度尘惧、網(wǎng)絡(luò)康栈、存儲(chǔ)、安全等描述整體的字段, 都是屬于pod的喷橙。
Pod的設(shè)計(jì)就是要讓其中的容器更多的共享Linux Namespace, 僅保留必要的隔離和限制能力啥么。 這樣, Pod模擬出的效果就跟虛擬機(jī)里的程序間關(guān)系更相似了
2. 幾個(gè)重要字段的含義和用法
NodeSelector: 一個(gè)用戶(hù)將pod與node進(jìn)行綁定的字段。
NodeName: 由調(diào)度器設(shè)置, 一旦我們配置, k8s會(huì)認(rèn)為pod已調(diào)度, 常用語(yǔ)測(cè)試或者調(diào)試
HostAliases: 定義了pod的hosts文件里的內(nèi)容
shareProcessNamespace: true 意味著container要共享PID Namespace
hostNetwork/hostIPC/hostPID: pod里的容器會(huì)直接使用宿主機(jī)的網(wǎng)絡(luò), 直接與宿主機(jī)進(jìn)行IPC通信, 看到宿主機(jī)的所有進(jìn)程贰逾。
Container: 除了docker中常見(jiàn)的字段外, 還有幾個(gè)額外的屬性: ImagePullPolicy/Lifecycle
3. Pod對(duì)象在k8s中的生命周期
1. Pending:? Pod YAML文件已經(jīng)提交給K8S, API對(duì)象已經(jīng)被創(chuàng)建并保存到etcd中悬荣。因?yàn)槟承┰驔](méi)有被創(chuàng)建, 例如調(diào)度失敗。
2. Running: Pod已經(jīng)調(diào)度成功,? 跟一個(gè)具體的node綁定, 他包含的容器都已經(jīng)創(chuàng)建成功, 且至少一個(gè)在運(yùn)行疙剑。
3. Successded: Pod里的所有容器都正常運(yùn)行完畢, 并且已經(jīng)退出了氯迂。 這種情況在運(yùn)行一次性任務(wù)時(shí)最為常見(jiàn)。
4. Failed: Pod里至少一個(gè)處于不正常狀態(tài)退出(非0返回碼)核芽。 出現(xiàn)這個(gè)狀態(tài)可以考慮查看下日志和events
5. Unknown: Pod狀態(tài)不能持續(xù)的被kubelet匯報(bào)給kube-apiserver, 可能主從節(jié)點(diǎn)(Master/kubelet)間的通信出現(xiàn)問(wèn)題囚戚。
status字段還可以細(xì)分出一組conditions, 細(xì)分的狀態(tài)值包括: PodScheduled、Ready轧简、Initialized以及Unschedulable