InitContainers
一、认识
在 Kubernetes
中,InitContainers
是一种特殊类型的容器,它在主应用容器(通常称为Containers
)启动之前运行。InitContainers
的主要目的是执行初始化任务,确保主应用容器在一个已准备好或已配置的环境中运行。它们有以下几个特点和应用场景:
InitContainers
特点
-
串行运行:
InitContainers
在主容器启动之前按顺序运行。只有当所有InitContainers
成功执行后,主容器才会启动。 -
与主容器隔离: 每个
InitContainer
都可以有与主容器不同的镜像、资源请求/限制、环境变量和其他配置。InitContainers
具有独立的文件系统,与主容器的文件系统隔离,除非通过卷共享。 -
执行初始化任务:
InitContainers
通常用于执行一些初始化任务,如:-
等待资源的准备: 等待一个依赖的服务或资源(如数据库、缓存等)变为可用。
-
配置文件的生成: 在主容器启动之前,生成或下载配置文件。
-
数据迁移或检查: 进行数据迁移或一致性检查,确保主容器的运行环境是合适的。
-
预拉取依赖: 下载主容器需要的依赖,避免在主容器启动后占用其启动时间。
-
-
重试机制: 如果某个
InitContainer
失败,Kubernetes
会重试运行它,直到成功或达到预定义的重启策略上限。这种机制确保了主容器只在适当的条件下启动。 -
不支持
lifecycle
、livenessProbe
、readinessProbe
和startupProbe
: 因为它们必须在Pod
就绪之前运行完成。
InitContainers
场景
-
服务依赖等待: 在微服务架构中,确保一个服务只有在它依赖的其他服务准备就绪后才启动。
-
安全性: 执行一些安全检查或验证操作,防止主容器在不安全的条件下启动。
-
配置初始化: 为主容器生成所需的配置文件,或根据运行环境动态调整配置。
通过将初始化任务分离到 InitContainers
中,主容器的启动逻辑可以简化,减少在主容器代码中处理复杂初始化逻辑的需求。
二、语法
apiVersion: v1
kind: Pod
metadata:
name: my-pod
labels:
name: my-pod
spec:
containers:
- name: my-container-1
image: docker.io/library/xx:yy
command: [xx,yy]
ports:
- containerPort: 80
initContainers:
- name: my-init-container-1
image: docker.io/library/xx:yy
command: [xx,yy]
三、场景
3.1 busybox
apiVersion: v1
kind: Pod
metadata:
name: busybox-pod
labels:
name: busybox-pod
spec:
containers:
- name: busybox-container
image: registry.cn-hangzhou.aliyuncs.com/bolawen/busybox:1.36.1-linux-arm64-v8
command: ['sh','-c','date && sleep 3600']
ports:
- containerPort: 80
initContainers:
- name: busybox-init-container
image: registry.cn-hangzhou.aliyuncs.com/bolawen/busybox:1.36.1-linux-arm64-v8
command: ['sh','-c','date && sleep 10']