跳到主要内容

InitContainers

2024年09月02日
柏拉文
越努力,越幸运

一、认识


Kubernetes 中,InitContainers 是一种特殊类型的容器,它在主应用容器(通常称为Containers)启动之前运行。InitContainers 的主要目的是执行初始化任务,确保主应用容器在一个已准备好或已配置的环境中运行。它们有以下几个特点和应用场景:

InitContainers 特点

  1. 串行运行: InitContainers 在主容器启动之前按顺序运行。只有当所有 InitContainers 成功执行后,主容器才会启动。

  2. 与主容器隔离: 每个 InitContainer 都可以有与主容器不同的镜像、资源请求/限制、环境变量和其他配置。InitContainers 具有独立的文件系统,与主容器的文件系统隔离,除非通过卷共享。

  3. 执行初始化任务: InitContainers 通常用于执行一些初始化任务,如:

    • 等待资源的准备: 等待一个依赖的服务或资源(如数据库、缓存等)变为可用。

    • 配置文件的生成: 在主容器启动之前,生成或下载配置文件。

    • 数据迁移或检查: 进行数据迁移或一致性检查,确保主容器的运行环境是合适的。

    • 预拉取依赖: 下载主容器需要的依赖,避免在主容器启动后占用其启动时间。

  4. 重试机制: 如果某个 InitContainer 失败,Kubernetes 会重试运行它,直到成功或达到预定义的重启策略上限。这种机制确保了主容器只在适当的条件下启动。

  5. 不支持 lifecyclelivenessProbereadinessProbestartupProbe: 因为它们必须在 Pod 就绪之前运行完成。

InitContainers 场景

  1. 服务依赖等待: 在微服务架构中,确保一个服务只有在它依赖的其他服务准备就绪后才启动。

  2. 安全性: 执行一些安全检查或验证操作,防止主容器在不安全的条件下启动。

  3. 配置初始化: 为主容器生成所需的配置文件,或根据运行环境动态调整配置。

通过将初始化任务分离到 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']