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