深入解析 Kubernetes 中的 Init Container 和普通容器
1.執(zhí)行順序機(jī)制
Init Container是串行執(zhí)行的。每個(gè)Init Container必須在前一個(gè)成功完成后才能啟動(dòng),而普通容器是并行啟動(dòng)的。這種機(jī)制在處理復(fù)雜依賴(lài)時(shí)特別有用。
看個(gè)例子:一個(gè)需要等待Redis就緒的Web應(yīng)用。
apiVersion: v1
kind: Pod
metadata:
name: web-app
spec:
initContainers:
- name: wait-redis
image: redis:alpine
command: ['sh', '-c', 'until redis-cli -h redis-svc ping; do sleep 2; done;']
containers:
- name: web
image: nginx:alpine
2. 運(yùn)行特性
Init Container只運(yùn)行一次。完成任務(wù)就退出,不會(huì)重啟。普通容器則會(huì)一直運(yùn)行,必要時(shí)還會(huì)按策略重啟。
有個(gè)坑要注意:Init Container執(zhí)行失敗會(huì)導(dǎo)致Pod重啟,已完成的Init Container也會(huì)重新執(zhí)行。所以寫(xiě)代碼時(shí)要考慮重復(fù)執(zhí)行的情況。
3. 資源分配策略
Init Container的資源分配有個(gè)特殊規(guī)則:取所有Init Container中的最大值。
spec:
initContainers:
- name: init-cache
resources:
requests:
memory: "512Mi"
- name: init-db
resources:
requests:
memory: "256Mi"
這個(gè)配置中,Pod實(shí)際申請(qǐng)的內(nèi)存是512Mi,而不是兩個(gè)容器的總和。
4. 應(yīng)用場(chǎng)景
實(shí)戰(zhàn)中,Init Container主要用在這些地方:
- 前置準(zhǔn)備 配置文件生成、數(shù)據(jù)庫(kù)初始化、目錄權(quán)限設(shè)置
- 服務(wù)檢查 確認(rèn)依賴(lài)服務(wù)是否就緒,比如數(shù)據(jù)庫(kù)連接性檢查
- 安全配置 證書(shū)分發(fā)、密鑰初始化
5. 實(shí)戰(zhàn)經(jīng)驗(yàn)
- 保持專(zhuān)注:一個(gè)Init Container只做一件事
- 要可重試:設(shè)計(jì)時(shí)考慮重復(fù)執(zhí)行的情況
- 加超時(shí)限制:防止無(wú)限等待卡住整個(gè)Pod
- 資源預(yù)留:按實(shí)際需求設(shè)置,避免資源不足
說(shuō)個(gè)實(shí)戰(zhàn)案例:部署ElasticSearch集群時(shí),需要修改系統(tǒng)參數(shù)max_map_count。用Init Container來(lái)處理就很優(yōu)雅:
initContainers:
- name: sysctl
image: busybox
command: ["sysctl", "-w", "vm.max_map_count=262144"]
securityContext:
privileged: true