什么是Pod
Pod是可以創(chuàng)建和管理Kubernetes計(jì)算的最小可部署單元昨登。一個(gè)Pod代表著集群中運(yùn)行的一個(gè)進(jìn)程嗽元。
Pod就像是豌豆莢一樣,它由一個(gè)或者多個(gè)容器組成(例如Docker容器),它們共享容器存儲(chǔ)彤避、網(wǎng)絡(luò)和容器運(yùn)行配置項(xiàng)。Pod中的容器總是被同時(shí)調(diào)度夯辖,有共同的運(yùn)行環(huán)境琉预。你可以把單個(gè)Pod想象成是運(yùn)行獨(dú)立應(yīng)用的“邏輯主機(jī)”——其中運(yùn)行著一個(gè)或者多個(gè)緊密耦合的應(yīng)用容器——在有容器之前,這些應(yīng)用都是運(yùn)行在幾個(gè)相同的物理機(jī)或者虛擬機(jī)上蒿褂。
盡管kubernetes支持多種容器運(yùn)行時(shí)圆米,但是Docker依然是最常用的運(yùn)行時(shí)環(huán)境,我們可以使用Docker的術(shù)語(yǔ)和規(guī)則來(lái)定義Pod啄栓。
Pod中共享的環(huán)境包括Linux的namespace娄帖,cgroup和其他可能的隔絕環(huán)境,這一點(diǎn)跟Docker容器一致昙楚。在Pod的環(huán)境中近速,每個(gè)容器中可能還有更小的子隔離環(huán)境。
Pod中的容器共享IP地址和端口號(hào)堪旧,它們之間可以通過(guò)localhost
互相發(fā)現(xiàn)削葱。它們之間可以通過(guò)進(jìn)程間通信,例如SystemV信號(hào)或者POSIX共享內(nèi)存淳梦。不同Pod之間的容器具有不同的IP地址析砸,不能直接通過(guò)IPC通信。
Pod中的容器也有訪問(wèn)共享volume的權(quán)限爆袍,這些volume會(huì)被定義成pod的一部分并掛載到應(yīng)用容器的文件系統(tǒng)中干厚。
就像每個(gè)應(yīng)用容器,pod被認(rèn)為是臨時(shí)實(shí)體螃宙。在Pod的生命周期中蛮瞄,pod被創(chuàng)建后,被分配一個(gè)唯一的ID(UID)谆扎,調(diào)度到節(jié)點(diǎn)上挂捅,并一致維持期望的狀態(tài)直到被終結(jié)(根據(jù)重啟策略)或者被刪除。如果node死掉了堂湖,分配到了這個(gè)node上的pod闲先,在經(jīng)過(guò)一個(gè)超時(shí)時(shí)間后會(huì)被重新調(diào)度到其他node節(jié)點(diǎn)上。一個(gè)給定的pod(如UID定義的)不會(huì)被“重新調(diào)度”到新的節(jié)點(diǎn)上无蜂,而是被一個(gè)同樣的pod取代伺糠,如果期望的話甚至可以是相同的名字,但是會(huì)有一個(gè)新的UID(查看replication controller獲取詳情)斥季。
Pod中如何管理多個(gè)容器
Pod中可以同時(shí)運(yùn)行多個(gè)進(jìn)程(作為容器運(yùn)行)協(xié)同工作训桶。同一個(gè)Pod中的容器會(huì)自動(dòng)的分配到同一個(gè) node 上累驮。同一個(gè)Pod中的容器共享資源、網(wǎng)絡(luò)環(huán)境和依賴舵揭,它們總是被同時(shí)調(diào)度谤专。
注意在一個(gè)Pod中同時(shí)運(yùn)行多個(gè)容器是一種比較高級(jí)的用法。只有當(dāng)你的容器需要緊密配合協(xié)作的時(shí)候才考慮用這種模式午绳。例如置侍,你有一個(gè)容器作為web服務(wù)器運(yùn)行,需要用到共享的volume拦焚,有另一個(gè)“sidecar”容器來(lái)從遠(yuǎn)端獲取資源更新這些文件蜡坊。如圖
Pod中可以共享兩種資源
- 網(wǎng)絡(luò) 每個(gè)Pod都會(huì)被分配一個(gè)唯一的IP地址漱受。Pod中的所有容器共享網(wǎng)絡(luò)空間憋槐,包括IP地址和端口。Pod內(nèi)部的容器可以使用
localhost
互相通信怎顾。Pod中的容器與外界通信時(shí)螟够,必須分配共享網(wǎng)絡(luò)資源(例如使用宿主機(jī)的端口映射)。 - 存儲(chǔ) 可以Pod指定多個(gè)共享的Volume峡钓。Pod中的所有容器都可以訪問(wèn)共享的volume妓笙。Volume也可以用來(lái)持久化Pod中的存儲(chǔ)資源,以防容器重啟后文件丟失能岩。
使用Pod
我通常把pod分為兩類:
- 自主式Pod:這種Pod本身是不能自我修復(fù)的寞宫,當(dāng)Pod被創(chuàng)建后(不論是由你直接創(chuàng)建還是被其他Controller),都會(huì)被Kuberentes調(diào)度到集群的Node上拉鹃。直到Pod的進(jìn)程終止辈赋、被刪掉、因?yàn)槿鄙儋Y源而被驅(qū)逐膏燕、或者Node故障之前這個(gè)Pod都會(huì)一直保持在那個(gè)Node上钥屈。Pod不會(huì)自愈。如果Pod運(yùn)行的Node故障坝辫,或者是調(diào)度器本身故障篷就,這個(gè)Pod就會(huì)被刪除。同樣的近忙,如果Pod所在Node缺少資源或者Pod處于維護(hù)狀態(tài)竭业,Pod也會(huì)被驅(qū)逐。
- 控制器管理的Pod:Kubernetes使用更高級(jí)的稱為Controller的抽象層及舍,來(lái)管理Pod實(shí)例未辆。Controller可以創(chuàng)建和管理多個(gè)Pod,提供副本管理锯玛、滾動(dòng)升級(jí)和集群級(jí)別的自愈能力咐柜。例如,如果一個(gè)Node故障,Controller就能自動(dòng)將該節(jié)點(diǎn)上的Pod調(diào)度到其他健康的Node上炕桨。雖然可以直接使用Pod饭尝,但是在Kubernetes中通常是使用Controller來(lái)管理Pod的。
上圖所示是Pod的組成示意圖献宫,我們看到每個(gè)Pod都有一個(gè)特殊的被稱為“根容器”的Pause 容器钥平。 Pause容器對(duì)應(yīng)的鏡像屬于Kubernetes平臺(tái)的一部分,除了Pause容器姊途,每個(gè)Pod還包含一個(gè)或者多個(gè)緊密相關(guān)的用戶業(yè)務(wù)容器涉瘾。
Pod控制器類型
ReplicationController(RC):用來(lái)確保容器應(yīng)用的副本數(shù)始終保持在用戶定義的副本數(shù),即如果有容器異常退出捷兰,會(huì)自動(dòng)創(chuàng)建新的Pod來(lái)替代立叛,而異常多出來(lái)的容器也會(huì)自動(dòng)回收,在新版本的Kubernetes中建議使用ReplicaSet來(lái)取代ReplicationController贡茅。
ReplicaSet(RS):代用戶創(chuàng)建指定數(shù)量的pod副本數(shù)量秘蛇,確保pod副本數(shù)量符合預(yù)期狀態(tài),并且支持滾動(dòng)式自動(dòng)擴(kuò)容和縮容功能顶考。和ReplicationController沒(méi)有本質(zhì)的不同赁还,只是名字不一樣,并且ReplicaSet支持集合式的selector驹沿,雖然ReplicaSet可以獨(dú)立使用艘策,但一般還是建議使用Deployment來(lái)自動(dòng)管理ReplicaSet,這樣就無(wú)須擔(dān)心跟其他機(jī)制的不兼容問(wèn)題(比如ReplicaSet不支持rolling-update但Deployment支持)
Deployment(重要):工作在ReplicaSet之上渊季,用于管理無(wú)狀態(tài)應(yīng)用朋蔫,目前來(lái)說(shuō)最好的控制器。支持滾動(dòng)更新和回滾功能却汉,還提供聲明式配置驯妄。
HPA(Horizontal Pod Autoscaling):僅適用于Deployment和ReplicaSet在V1版本中僅支持根據(jù)Pod的CPU利用率擴(kuò)縮容,在vlalpha版本中合砂,支持根據(jù)內(nèi)存和用戶自定義的metric擴(kuò)縮容富玷。
-
StatefulSet:是為了解決有狀態(tài)服務(wù)的問(wèn)題(對(duì)應(yīng)Deployment和ReplicaSet是為無(wú)狀態(tài)服務(wù)而設(shè)計(jì)),其應(yīng)用場(chǎng)景包括:
- 穩(wěn)定的持久化存儲(chǔ)既穆,即Pod重新調(diào)度后赎懦,還是能訪問(wèn)到相同的持久化數(shù)據(jù),基于PVC來(lái)實(shí)現(xiàn)
- 穩(wěn)定的網(wǎng)絡(luò)標(biāo)志幻工,即Pod重新調(diào)度后励两,其PodName和HostName不變,基于Headless Service(即沒(méi)有Cluster IP的Service)來(lái)實(shí)現(xiàn)
- 有序部署囊颅,有序擴(kuò)展当悔,即Pod是有順序的傅瞻,在部署或者擴(kuò)展的時(shí)候要依據(jù)定義的順序依次進(jìn)行(即從0到N-1,在下一個(gè)Pod運(yùn)行之前所有之前的Pod都必須是Running和Ready狀態(tài))盲憎,基于init containers來(lái)實(shí)現(xiàn)
- 有序收縮嗅骄,有序刪除(即從N-1到0)
-
DaemonSet:用于確保集群中的全部或者一些節(jié)點(diǎn)只運(yùn)行一個(gè)Pod副本,當(dāng)有Node加入集群時(shí)饼疙,也會(huì)為它們新增一個(gè)Pod溺森,當(dāng)有Node從集群移除時(shí),這些Pod也會(huì)被回收窑眯,刪除DaemonSet將會(huì)刪除它創(chuàng)建的所有Pod
使用DaemonSet的一些典型用法:- 運(yùn)行集群存儲(chǔ)daemon屏积,例如在每個(gè)Node上運(yùn)行g(shù)lusterd、ceph
- 在每個(gè)Node上運(yùn)行日志收集daemon磅甩,例如fluentd炊林、logstash
- 在每個(gè)Node上運(yùn)行監(jiān)控daemon,例如Prometheus Node Exporter
Job:負(fù)責(zé)批處理任務(wù)卷要,即僅執(zhí)行一次的任務(wù)渣聚,它保證批處理任務(wù)的一個(gè)或多個(gè)Pod成功與結(jié)束
-
Cron Job:管理基于時(shí)間的Job,即:
- 在給定時(shí)間點(diǎn)僅運(yùn)行一次
- 周期性的在給定時(shí)間點(diǎn)運(yùn)行
服務(wù)發(fā)現(xiàn)
未完待續(xù)僧叉。奕枝。。彪标。。掷豺。
參考:
https://www.cnblogs.com/xzkzzz/p/9507152.html
https://blog.csdn.net/weixin_33895695/article/details/93799801