概念

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-serviceredis-service 替换为你实际使用的 MySQL 和 Redis 服务的服务名或地址