k8s中的最小調(diào)度單位---pod
之前的文章中,我們對(duì)k8s能夠解決的問題做了簡單介紹,簡單來說,它解決的問題是容器的編排與調(diào)度,它的核心價(jià)值在于:運(yùn)行在大規(guī)模集群的任務(wù)之間,實(shí)際上存在著各種各樣的關(guān)系,這些關(guān)系的處理,才是任務(wù)編排和系統(tǒng)管理最困難的地方,k8s就是為了這個(gè)問題而生的。
這句話比較難理解,我們從已有的知識(shí)入手,抽絲剝繭,慢慢理解它。我們已經(jīng)知道,容器的本質(zhì)是一個(gè)進(jìn)程,它包含三個(gè)部分:
如果說容器是云環(huán)境的一個(gè)進(jìn)程,那么你可以將k8s理解成云環(huán)境中的一個(gè)操作系統(tǒng)。
在一個(gè)操作系統(tǒng)當(dāng)中,進(jìn)程并不總是孤立運(yùn)行的,往往是通過一個(gè)進(jìn)程組的方式運(yùn)行的。實(shí)際部署應(yīng)用的時(shí)候,我們的應(yīng)用往往不是以孤立的形式跑在docker容器中的,應(yīng)用之間存在這樣那樣的關(guān)系,有的時(shí)候,他們必須跑在同一臺(tái)機(jī)器上,并且相互訪問,類似于捆綁式的,例如:如果兩個(gè)容器之間要發(fā)生之間的文件交換、需要共享某些Linux Namespace等場景。這種關(guān)系我們稱之為"超親密關(guān)系"。
基于上面的這個(gè)前提,k8s在設(shè)計(jì)之初,就考慮了這一點(diǎn),所以它在設(shè)計(jì)的時(shí)候,并不是以容器為最小的調(diào)度單位的,而是以pod這個(gè)新的概念作為k8s的最小調(diào)度單位,而每一個(gè)pod中可以包含多個(gè)容器,這樣,就實(shí)現(xiàn)了部署在容器中的應(yīng)用程序之間就實(shí)現(xiàn)了捆綁,也就是他們永遠(yuǎn)只能被部署在一臺(tái)機(jī)器上,要么部署成功,要么失敗,不可能出現(xiàn)一種中間狀態(tài)。
Pod和容器的關(guān)系?
需要注意的是,Pod是一個(gè)邏輯上的概念,它的本質(zhì)是一組共享了某些資源的容器。確切的說,同一個(gè)pod里面的容器,共享了相同的network namespace,當(dāng)然,還可以共享掛載卷等資源。
所謂的共享,并不是依賴,而是對(duì)等。
假如我們有A、B兩個(gè)容器,如果A依賴B,那么A的啟動(dòng)順序一定在B之后。如果A、B的地位對(duì)等,那么A、B的啟動(dòng)順序?qū)]有嚴(yán)格要求,這才是真正的共享。那么誰來預(yù)先創(chuàng)建被共享的network資源呢?
在Pod中,如果包含了多個(gè)應(yīng)用容器,是需要一個(gè)infra容器,將這些應(yīng)用容器給關(guān)聯(lián)起來的。類似于下面這樣:
在K8S中,infra容器占用了極少的資源,它只運(yùn)行了一個(gè)叫pause的鏡像,所以也被稱為pause容器,它占用的磁盤大小在100~200kb之間。infra的存在是為了創(chuàng)建network namespace,然后應(yīng)用容器A和應(yīng)用容器B就可以加入到這個(gè) network namespace中了。
對(duì)于 Pod 里的容器 A 和容器 B 來說:
1、它們可以直接使用 localhost 進(jìn)行通信;
2、它們看到的網(wǎng)絡(luò)設(shè)備跟 Infra 容器看到的完全一樣;
3、一個(gè) Pod 只有一個(gè) IP 地址,也就是這個(gè) Pod 的 Network Namespace 對(duì)應(yīng)的 IP 地址;
4、當(dāng)然,其他的所有網(wǎng)絡(luò)資源,都是一個(gè) Pod 一份,并且被該 Pod 中的所有容器共享;
5、Pod 的生命周期只跟 Infra 容器一致,而與容器 A 和 B 無關(guān)
6、對(duì)于同一個(gè) Pod 里面的所有用戶容器來說,它們的進(jìn)出流量,也可以認(rèn)為都是通過 Infra 容器完成的
在這種設(shè)計(jì)模式下,掛載相同的Volume卷就很容易了,只需要在Pod的初始化yaml文件中配置volume參數(shù)即可,具體內(nèi)容后續(xù)會(huì)專門分享。
對(duì)于容器來說,一個(gè)容器只能管理一個(gè)進(jìn)程,而不是一個(gè)應(yīng)用。我們?cè)谶M(jìn)行應(yīng)用上云遷移的時(shí)候,需要將應(yīng)用若干個(gè)進(jìn)程,然后去考慮應(yīng)用模塊之間是否具有"超親密關(guān)系",擁有超親密關(guān)系的進(jìn)程可以部署在一個(gè)Pod中,其他的進(jìn)程部署在另外的Pod中,用這個(gè)思路去拆分應(yīng)用,才符合容器設(shè)計(jì)的初衷。
以上就是云原生技術(shù)kubernetes調(diào)度單位pod的使用詳解的詳細(xì)內(nèi)容,更多關(guān)于kubernetes調(diào)度單位pod的使用的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!