概念
Kubernetes 中的 Pod 资源初始化容器(Init Container)是一种特殊类型的容器,用于在 Pod 中的其他容器启动之前运行特定的任务或初始化操作。Init Container 可以用于执行一些预处理任务,如加载配置、初始化数据库、准备文件等。
初始化容器应用常用:
- 提供主容器镜像中不具备的工具程序或自定义代码
- 初始化容器要先于主应用容器串行启动并运行完成,因此可以用于延后应用容器的启动直至其依赖条件得到满足,比如nginx容器
- 要求mysql、redis等容器先启动后才能启动nginx容器,这时候就需要做两个初始化容器探测mysql、redis容器是否运行
- 为主容器修改一些目录权限
重点
当初始化容器要执行的命令执行结束后,pod会自动将初始化容器删除
初始化容器一般应用于替主容器准备前提环境工作,可以将初始化容器启动会运行的命令写成死循环,当环境没问题就结束循环,初始化容器删除,主容器启动,当环境有问题,就一直循环,初始化容器一直探测,直到环境没问题,主容器启动
注:初始化容器的命令设置一定是为真,只有命令成功运行结束,初始化容器才会删除,主容器才会启动
配置参数
# kubectl explain pod.spec.initContainers
KIND: Pod
VERSION: v1
RESOURCE: initContainers <[]Object>
DESCRIPTION:
FIELDS:
args <[]string> //设置容器启动参数
command <[]string> //设置容器启动命令
env <[]Object> //设置容器的环境变量
image <string> //容器的镜像
imagePullPolicy <string> //容器镜像的拉取策略
name <string> -required- //初始化容器的名称
ports <[]Object> //端口号设置
案例
下面是一个示例的 Pod YAML 配置文件,其中包含一个初始化容器来探测 MySQL 和 Redis 是否启动,如果它们没有启动,则不会启动 Nginx 容器:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: nginx
image: nginx:latest
# Nginx 容器的配置
initContainers:
- name: mysql-check
image: mysql:latest
command: ["sh", "-c", "until nc -z mysql-service 3306; do sleep 1; done"]
# 使用 nc 命令检测 MySQL 是否启动,mysql-service 是 MySQL 服务的服务名
- name: redis-check
image: redis:latest
command: ["sh", "-c", "until nc -z redis-service 6379; do sleep 1; done"]
# 使用 nc 命令检测 Redis 是否启动,redis-service 是 Redis 服务的服务名
在上面的示例中,我们定义了一个名为 mysql-check
的初始化容器,它使用 nc
命令检测 MySQL 服务是否启动。如果 MySQL 服务没有启动,该容器将等待 1 秒钟,然后再次检测,直到 MySQL 服务启动为止。类似地,我们也定义了一个名为 redis-check
的初始化容器来检测 Redis 服务是否启动。
只有当 MySQL 和 Redis 两个服务都启动后,Kubernetes 才会继续启动 Nginx 容器。这样可以确保在 Nginx 容器启动之前,必要的后端服务已经可用。
请注意,上述示例中使用了 nc
命令来进行连接检测,你可能需要根据实际情况修改命令以适应你的环境和需求。另外,确保将 mysql-service
和 redis-service
替换为你实际使用的 MySQL 和 Redis 服务的服务名或地址