本活動(dòng)在微信公眾號(hào)【我的小碗湯】上舉行,有送書活動(dòng)白魂!這里參與答題不能參與到送書活動(dòng)哦汽纤!
昨日考題
提供一個(gè)pod的yaml,要求添加Init Container福荸,Init Container的作用是創(chuàng)建一個(gè)空文件蕴坪,pod的Containers判斷文件是否存在,不存在則退出
注意:附帶Pod完整yaml
昨日答案
apiVersion: v1
kind: Pod
metadata:
labels:
run: cka-1126
name: cka-1126
spec:
initContainers:
- image: busybox
name: init-c
command: ['sh', '-c', 'touch /tmp/cka-1126']
volumeMounts:
- name: workdir
mountPath: "/tmp"
containers:
- image: busybox
name: cka-1126
command: ['sh', '-c', 'ls /tmp/cka-1126 && sleep 3600 || exit 1']
volumeMounts:
- name: workdir
mountPath: "/tmp"
volumes:
- name: workdir
emptyDir: {}
主Container的command就是判斷文件是否存在敬锐,存在則不退出背传,不存在則退出;也可以用以下if判斷:
command: ['sh', '-c', 'if [ -e /tmp/cka-1126 ];then echo "file exits";else echo "file not exits" && exit 1;fi']
昨日解析
本題的關(guān)鍵點(diǎn)是init容器與主容器需要共同掛載一個(gè)名為workdir的目錄台夺,init容器在里面創(chuàng)建一個(gè)空文件径玖,主容器去檢驗(yàn)文件是否存在,檢驗(yàn)主要用的是shell的語(yǔ)法颤介;
command: ['sh', '-c', 'ls /tmp/cka-1126 && sleep 3600 || exit 1']
這句話意思是:如果ls /tmp/cka-1126
返回碼為0梳星,即文件存在,將sleep 3600秒滚朵;否則exit 1退出丰泊;
也可以用shell
的if
語(yǔ)法判斷。
官方文檔地址:
https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-initialization/
https://kubernetes.io/docs/concepts/workloads/pods/init-containers/
梳理概念
初始化容器始绍,顧名思義容器啟動(dòng)的時(shí)候瞳购,會(huì)先啟動(dòng)可一個(gè)或多個(gè)容器,如果有多個(gè)亏推,那么這幾個(gè)Init Container按照定義的順序依次執(zhí)行学赛,一個(gè)執(zhí)行成功年堆,才能執(zhí)行下一個(gè),只有所有的Init Container執(zhí)行完后盏浇,主容器才會(huì)啟動(dòng)变丧。由于一個(gè)Pod里的存儲(chǔ)卷是共享的,所以Init Container里產(chǎn)生的數(shù)據(jù)可以被主容器使用到绢掰。
Init Container可以在多種K8S資源里被使用到如Deployment痒蓬、Daemon Set、StatefulSet滴劲、Job等攻晒,但歸根結(jié)底都是在Pod啟動(dòng)時(shí),在主容器啟動(dòng)前執(zhí)行班挖,做初始化工作鲁捏。
Init 容器支持應(yīng)用容器的全部字段和特性,包括資源限制萧芙、數(shù)據(jù)卷和安全設(shè)置给梅。然而,Init 容器不支持 Readiness Probe双揪,因?yàn)樗鼈儽仨氃?Pod 就緒之前運(yùn)行完成动羽;在資源限制、調(diào)度方面也會(huì)略有不同渔期。
應(yīng)用場(chǎng)景
等待其它模塊Ready:比如有一個(gè)應(yīng)用里面有兩個(gè)容器化的服務(wù)曹质,一個(gè)是Web Server擎场,另一個(gè)是數(shù)據(jù)庫(kù)宅静。其中Web Server需要訪問(wèn)數(shù)據(jù)庫(kù)。但是當(dāng)我們啟動(dòng)這個(gè)應(yīng)用的時(shí)候磷账,并不能保證數(shù)據(jù)庫(kù)服務(wù)先啟動(dòng)起來(lái),所以可能出現(xiàn)在一段時(shí)間內(nèi)Web Server連接數(shù)據(jù)庫(kù)錯(cuò)誤绰咽。為了解決這個(gè)問(wèn)題琐谤,我們可以在運(yùn)行Web Server服務(wù)的Pod里使用一個(gè)InitContainer斗忌,去檢查數(shù)據(jù)庫(kù)是否準(zhǔn)備好,直到數(shù)據(jù)庫(kù)可以連接,Init Container才結(jié)束退出,然后Web Server容器被啟動(dòng)厘贼,發(fā)起正式的數(shù)據(jù)庫(kù)連接請(qǐng)求。
初始化配置:比如集群里檢測(cè)所有已經(jīng)存在的成員節(jié)點(diǎn)岳掐,為主容器準(zhǔn)備好集群的配置信息,這樣主容器起來(lái)后就能用這個(gè)配置信息加入集群;目前在容器化觅赊,初始化集群配置文件時(shí)經(jīng)常用到;
提供一種阻塞容器啟動(dòng)的方式:必須在initContainer容器啟動(dòng)成功后坯约,才會(huì)運(yùn)行下一個(gè)容器,保證了一組條件運(yùn)行成功的方式卿拴;
其它使用場(chǎng)景:將pod注冊(cè)到一個(gè)中央數(shù)據(jù)庫(kù)粥鞋、下載應(yīng)用依賴等壕曼。
Kubernetes 1.5 版本 開(kāi)始支持在annotations下用pod.beta.kubernetes.io/init-containers申明initContainer,像以下這樣。
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
annotations:
pod.beta.kubernetes.io/init-containers: '[
{
"name": "init-myservice",
"image": "busybox",
"command": ["sh", "-c", "until nslookup myservice; do echo waiting for myservice; sleep 2; done;"]
},
{
"name": "init-mydb",
"image": "busybox",
"command": ["sh", "-c", "until nslookup mydb; do echo waiting for mydb; sleep 2; done;"]
}
]'
spec:
containers:
- name: myapp-container
image: busybox
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
Kubernetes 1.6 版本的新語(yǔ)法將 Init 容器的聲明移到 spec 下制妄,但是老的 annotation 語(yǔ)法仍然可以使用。
今日考題
創(chuàng)建Secret名為cka1127-secret具篇,內(nèi)含有password字段,值為cka1127栓霜,然后在名為cka1127-01的Pod1里使用ENV進(jìn)行調(diào)用销凑,名為cka1127-02的Pod2里使用Volume掛載在/data 下仅炊;
注意:提交評(píng)論:包含命令和yaml斗幼,以及注意點(diǎn)「ⅲ可分多次評(píng)論蜕窿。
作者簡(jiǎn)介
作者:小碗湯,一位熱愛(ài)呆馁、認(rèn)真寫作的小伙桐经,目前維護(hù)原創(chuàng)公眾號(hào):『我的小碗湯』,專注于寫linux智哀、golang次询、docker荧恍、kubernetes等知識(shí)等提升硬實(shí)力的文章瓷叫,期待你的關(guān)注。轉(zhuǎn)載說(shuō)明:務(wù)必注明來(lái)源(注明:來(lái)源于公眾號(hào):我的小碗湯送巡, 作者:小碗湯)
作者簡(jiǎn)潔
作者:小碗湯摹菠,一位熱愛(ài)、認(rèn)真寫作的小伙骗爆,目前維護(hù)原創(chuàng)公眾號(hào):『我的小碗湯』次氨,專注于寫go語(yǔ)言、docker摘投、kubernetes煮寡、java等開(kāi)發(fā)、運(yùn)維知識(shí)等提升硬實(shí)力的文章,期待你的關(guān)注。轉(zhuǎn)載說(shuō)明:務(wù)必注明來(lái)源(注明:來(lái)源于公眾號(hào):我的小碗湯胁出,作者:小碗湯)