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