Kubernetes 設(shè)計(jì)模式筆記 —— Init Container

Init Container 為初始化相關(guān)的任務(wù)提供了區(qū)別于主應(yīng)用程序的獨(dú)立的生命周期,從而實(shí)現(xiàn)關(guān)注點(diǎn)分離争群。

初始化在很多編程語(yǔ)言中都備受關(guān)注课梳。比如在 Java 中,為了初始化某個(gè)需要配置的對(duì)象翘紊,我們使用 constructor蔽氨。
Constructor 會(huì)保證在對(duì)象中是第一個(gè)運(yùn)行的,且只被 runtime 運(yùn)行一次帆疟。此外鹉究,還可以使用構(gòu)造函數(shù)驗(yàn)證強(qiáng)制參數(shù)之類(lèi)的先決條件,傳入?yún)?shù)或默認(rèn)值以初始化實(shí)例字段踪宠。

Init Container 與構(gòu)造函數(shù)是類(lèi)似的自赔,只不過(guò)是在 Pod 級(jí)別而不是類(lèi)級(jí)別。
假如 Pod 中有一個(gè)或多個(gè)容器代表主應(yīng)用程序柳琢,這些容器可能需要一些啟動(dòng)前的先決條件绍妨。比如為文件系統(tǒng)設(shè)置特殊的權(quán)限,設(shè)置數(shù)據(jù)庫(kù) schema柬脸,應(yīng)用程序種子數(shù)據(jù)的安裝等他去。同時(shí),這些初始化邏輯可能需要主容器鏡像中不包含的工具和庫(kù)倒堕。
又或者孤页,用戶想要延遲應(yīng)用的啟動(dòng),直到可以確認(rèn)某個(gè)外部的依賴(lài)滿足條件涩馆。
所有上述需求都可以通過(guò) Kubernetes 提供的 Init Container 實(shí)現(xiàn)行施。

Kubernetes 中的 Init Container 屬于 Pod 定義的一部分,可以將容器劃分成兩組:init containers 和 application containers魂那。
所有的 init container 會(huì)以串行的順序一個(gè)接一個(gè)地執(zhí)行蛾号,在應(yīng)用容器開(kāi)始啟動(dòng)之前,所有 init container 的執(zhí)行必須成功完成涯雅。
而應(yīng)用容器是可以并行運(yùn)行的鲜结,啟動(dòng)順序也是任意的。


Init and application containers

通常情況下,init container 應(yīng)該是小型快速且能成功完成的精刷,除非它是用來(lái)延遲 Pod 的啟動(dòng)以等待某個(gè)依賴(lài)符合要求拗胜。
當(dāng) init container 失敗時(shí),整個(gè) Pod 會(huì)重新啟動(dòng)(除非配置了 RestartNever)怒允,導(dǎo)致所有 init container 重新執(zhí)行一遍埂软。因而令它們符合冪等原則可以避免副作用。
一方面纫事,init container 有著和應(yīng)用容器一樣的能力:位于同一個(gè) Pod 中勘畔,共享資源限制、存儲(chǔ)卷和安全設(shè)置丽惶。另一方面炫七,它們的健康檢查和資源處理在語(yǔ)義上有些許不同。它們不存在 rediness check钾唬,因?yàn)橹挥挟?dāng)所有的 init container 成功結(jié)束之后應(yīng)用容器才會(huì)繼續(xù)啟動(dòng)万哪。

在容器調(diào)度、自動(dòng)伸縮抡秆、配額管理方面奕巍,Init container 會(huì)影響 Pod 請(qǐng)求和計(jì)算資源的方式。由于所有的 init container 會(huì)先串行執(zhí)行到終止琅轧,接著應(yīng)用容器并行運(yùn)行伍绳。因而高效的 Pod 級(jí)別的資源分配取決于以下兩組值中較大的那個(gè):

  • 所有 init container 中資源請(qǐng)求或限制值最大的那個(gè)
  • 所有應(yīng)用容器資源請(qǐng)求或限制的總和

上述行為的限制在于踊挠,當(dāng) init container 的資源需求非常高而應(yīng)用容器相對(duì)很低時(shí)乍桂,這種配置對(duì)于資源的利用就很低效。因?yàn)?init container 一般只運(yùn)行很短的一段時(shí)間效床,其他 Pod 無(wú)法使用 init container 運(yùn)行結(jié)束后空閑下來(lái)的資源睹酌。

Init container 能夠?qū)崿F(xiàn)關(guān)注點(diǎn)分離,從而使容器保持 single-purposed剩檀。應(yīng)用容器可以由只關(guān)注應(yīng)用邏輯的開(kāi)發(fā)工程師創(chuàng)建憋沿,而部署工程師可以為其添加 init container 并只關(guān)注配置和初始化任務(wù)。比如下面的例子沪猴。

apiVersion: v1
kind: Pod
metadata:
  name: www
  labels:
    app: www
spec:
  initContainers:
  - name: download
    image: axeclbr/git
    command:
    - git
    - clone
    - https://github.com/mdn/beginner-html-site-scripted
    - /var/lib/data
    volumeMounts:
    - mountPath: /var/lib/data
      name: source
  containers:
  - name: run
    image: docker.io/centos/httpd
    ports:
    - containerPort: 80
    volumeMounts:
    - mountPath: /var/www/html
      name: source
  volumes:
  - emptyDir: {}
    name: source

Init container 克隆外部 Git repo 到掛載的路徑辐啄,該路徑通過(guò) emptyDir 掛載卷實(shí)現(xiàn) init 容器和應(yīng)用容器間的數(shù)據(jù)共享。

總結(jié)

Init container 將 Pod 中的容器分成兩組运嗜,擁有不同的生命周期壶辜、目的甚至作者。
Init 容器分階段地執(zhí)行担租,且只有當(dāng)前容器成功完成后才繼續(xù)進(jìn)行下一階段砸民,意味著我們可以確保應(yīng)用初始化的每一個(gè)階段都是有保障的。
應(yīng)用容器則可以并行運(yùn)行,沒(méi)有提供 init 容器那樣的保證岭参。我們可以根據(jù)目的在 Pod 中合理地組織關(guān)注初始化的 init 容器和關(guān)注應(yīng)用本身的應(yīng)用容器反惕。

參考資料

Kubernetes Patterns

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市演侯,隨后出現(xiàn)的幾起案子姿染,更是在濱河造成了極大的恐慌,老刑警劉巖蚌本,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盔粹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡程癌,警方通過(guò)查閱死者的電腦和手機(jī)舷嗡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嵌莉,“玉大人进萄,你說(shuō)我怎么就攤上這事∪袂停” “怎么了中鼠?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)沿癞。 經(jīng)常有香客問(wèn)我援雇,道長(zhǎng),這世上最難降的妖魔是什么椎扬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任惫搏,我火速辦了婚禮,結(jié)果婚禮上蚕涤,老公的妹妹穿的比我還像新娘筐赔。我一直安慰自己,他們只是感情好揖铜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布茴丰。 她就那樣靜靜地躺著,像睡著了一般天吓。 火紅的嫁衣襯著肌膚如雪贿肩。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,115評(píng)論 1 296
  • 那天龄寞,我揣著相機(jī)與錄音汰规,去河邊找鬼。 笑死萄焦,一個(gè)胖子當(dāng)著我的面吹牛控轿,可吹牛的內(nèi)容都是我干的冤竹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼茬射,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鹦蠕!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起在抛,我...
    開(kāi)封第一講書(shū)人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤钟病,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后刚梭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體肠阱,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年朴读,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衅金。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡噪伊,死狀恐怖氮唯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惩琉,我是刑警寧澤豆励,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布速梗,位于F島的核電站,受9級(jí)特大地震影響篙议,放射性物質(zhì)發(fā)生泄漏在孝。R本人自食惡果不足惜淮摔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一私沮、第九天 我趴在偏房一處隱蔽的房頂上張望和橙。 院中可真熱鬧,春花似錦魔招、人聲如沸晰搀。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)外恕。三九已至杆逗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鳞疲,已是汗流浹背罪郊。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尚洽,地道東北人悔橄。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像腺毫,于是被迫代替她去往敵國(guó)和親癣疟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容