Pod和容器设计模式
生活随笔
收集整理的這篇文章主要介紹了
Pod和容器设计模式
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
為什么需要Pod?
Pod是K8S的調(diào)度單位。
回顧容器和K8S的關(guān)系
- 容器的本質(zhì)?
- 一個(gè)視圖被隔離,資源受限的進(jìn)程
- 容器里PID=1的進(jìn)程就是應(yīng)用本身
- 管理虛擬機(jī)=管理基礎(chǔ)設(shè)施
- 管理容器=直接管理應(yīng)用
- K8S?
- K8s是云時(shí)代的操作系統(tǒng)
- 容器鏡像是K8S這個(gè)操作系統(tǒng)的軟件安裝包
真實(shí)操作系統(tǒng)的例子
- 一個(gè)Helloworld程序由多個(gè)進(jìn)程組成
- 四個(gè)進(jìn)程共享helloworld的資源,相互協(xié)作,完成helloworld的工作
兩者對(duì)比
- k8s=操作系統(tǒng)
- 容器=進(jìn)程
- pod=進(jìn)程組
進(jìn)程組
- 對(duì)于上面擁有4個(gè)進(jìn)程的helloworld程序,怎么用容器跑起來?
- 方法一:在一個(gè)docker里面啟動(dòng)4個(gè)進(jìn)程
- 問題:容器是單進(jìn)程模型,PID=1的進(jìn)程比如說是main進(jìn)程,其他三個(gè)進(jìn)程怎么管理?
- 解決方法:
- 應(yīng)用程序本身具有進(jìn)程管理的能力,helloworld程序具備systemd的能力。
- 或者,PID=1的進(jìn)程改為systemd
- 這樣,管理容器=管理systemd!=直接管理應(yīng)用本身。
Pod=進(jìn)程組
來自Borg的思考
Borg部署的應(yīng)用,往往存在著類似進(jìn)程與進(jìn)程組的關(guān)系,必須部署在同一臺(tái)機(jī)器上,共享一些信息。
為什么Pod是原子調(diào)度單位?
- 舉例:兩個(gè)容器緊密合作
- App,業(yè)務(wù)容器,寫日志
- Log,轉(zhuǎn)發(fā)日志到ES
- 內(nèi)存要求
- APP:1G
- Log:0.5G
- 可用內(nèi)存
- Node_A : 1.25G
- Node_B : 2G
- 如果App被調(diào)度到了Node_A上,Log資源不足就調(diào)度不過來了
- Task co-scheduling問題的解決方案
- Mesos:資源囤積(reource hoarding)
- 所有設(shè)置了Afinity約束的任務(wù)都達(dá)到了,才開始統(tǒng)一調(diào)度
- 問題:調(diào)度效率損失、死鎖
- Google Omega:樂觀調(diào)度處理沖突
- 先不管沖突,在沖突發(fā)生時(shí)會(huì)有機(jī)制進(jìn)行回滾來處理問題
- 問題:負(fù)載
- K8S:Pod打包部署
- Mesos:資源囤積(reource hoarding)
再次理解Pod
- 親密關(guān)系-調(diào)度解決
- 兩個(gè)應(yīng)用需要部署在同一個(gè)宿主機(jī)上
- 超親密關(guān)系-pod解決
- 會(huì)直接發(fā)生文件交換
- 會(huì)使用localhost或socket文件進(jìn)行本地通信
- 會(huì)頻繁的RPC調(diào)用
- 會(huì)共享某些Linux namespace(一個(gè)容器加入另一個(gè)容器的network namespace,這樣就可以看到對(duì)方的網(wǎng)絡(luò)設(shè)備)
Pod的實(shí)現(xiàn)機(jī)制
Pod要解決的問題
- 如何讓一個(gè)Pod里的容器之間最高效地共享某些資源和數(shù)據(jù)?
- 容器之間是被Linux Namespace和cgroups隔離開的
1 共享網(wǎng)絡(luò)
- 容器A和B
- 通過Infra Container的方式共享同一個(gè)Network Namespace
- 鏡像:k8s.gcr.io/pause;匯編語(yǔ)言編寫的,永遠(yuǎn)處于暫停狀態(tài),大小100-200KB
- 直接使用localhost通信
- 看到的網(wǎng)絡(luò)設(shè)備和Infra容器看到的完全一樣
- 一個(gè)Pod只有一個(gè)IP地址,也就是這個(gè)pod的Network Namespace對(duì)應(yīng)的IP地址
- 所有網(wǎng)絡(luò)資源,都是一個(gè)Pod一份,被該P(yáng)od中的所有容器共享
- 整個(gè)Pod的生命周期和Infra容器一致,而與容器A和B無(wú)關(guān)
- 通過Infra Container的方式共享同一個(gè)Network Namespace
2 共享存儲(chǔ)
- 設(shè)置一個(gè)Pod級(jí)別的Volumn
- 各個(gè)容器去掛載這個(gè)Volumn,然后就可以看到(/opt/tiger/...)
詳解容器設(shè)計(jì)模式
舉例:WAR包+Tomcat的容器化
- 方法一:把WAR包和Tomcat打包進(jìn)一個(gè)鏡像
- 無(wú)論是WAR更新和Tomcat更新都需要重新制作鏡像
- 方法二:鏡像里只打包Tomcat,用數(shù)據(jù)卷容宿主機(jī)上將WAR包掛載進(jìn)Tomcat容器
- 需要分布式存儲(chǔ)系統(tǒng)
- 更通用的做法?
InitContainer
- InitContainer會(huì)比spec.containers定義的用戶容器先執(zhí)行,并且嚴(yán)格按照定義的順序依次執(zhí)行
- /app是個(gè)Volumn
- Tomcat容器同樣掛載了該Volumn到自己的webapps目錄下
- 當(dāng)Tomcat容器啟動(dòng)是,它的webapp目錄下就一定會(huì)有sample.war
容器設(shè)計(jì)模式:Sidecar
- 通過在Pod里定義專門容器,來執(zhí)行主業(yè)務(wù)容器需要的輔助功能
- 比如:
- Init Container把war包復(fù)制到Volumn里面
- 需要SSH進(jìn)去執(zhí)行的腳本
- 日志收集
- Debug應(yīng)用
- 應(yīng)用監(jiān)控
- 優(yōu)勢(shì):
- 將輔助功能和祝業(yè)務(wù)容器解耦,實(shí)現(xiàn)獨(dú)立發(fā)布和能力重用
Sidecar:應(yīng)用與日志收集
- 業(yè)務(wù)容器將日志寫在Volumn里
- 日志容器共享該Volumn從而將日志轉(zhuǎn)發(fā)到遠(yuǎn)程存儲(chǔ)當(dāng)中
- Fluentd等
Sidecar:代理容器
- 代理容器對(duì)業(yè)務(wù)容器屏蔽被代理的服務(wù)集群(consul、服務(wù)發(fā)現(xiàn)?),簡(jiǎn)化業(yè)務(wù)代碼的實(shí)現(xiàn)邏輯
- 提示:
- 容器之間通過localhost直接通信
- 代理容器的代碼可以被全公司重用
Sidecar:適配器模式
- 適配器模式將業(yè)務(wù)暴露出來的接口轉(zhuǎn)化為另一種格式
- 舉例:
- 業(yè)務(wù)暴露出來的監(jiān)控接口是/metrics
- 監(jiān)控系統(tǒng)需要的接口是/healthz
- monitoring adapter將/metrics轉(zhuǎn)化為/healthz以適配新的監(jiān)控系統(tǒng)
- 提示:
- 容器之間通過localhost通信
- 代理容器的代碼可以被全公司重用
總結(jié)
- Pod是K8s項(xiàng)目里實(shí)現(xiàn)容器設(shè)計(jì)模式的核心機(jī)制
- 容器設(shè)計(jì)模式是K8s進(jìn)行復(fù)雜應(yīng)用編排的基礎(chǔ)依賴
- 所有設(shè)計(jì)模式的本質(zhì)都是:解耦和重用
總結(jié)
以上是生活随笔為你收集整理的Pod和容器设计模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 监理人员是否知道的电源设备安装及设备接地
- 下一篇: java 依赖倒置_设计模式之三依赖倒置