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