一、前言

本文主要以下几方面介绍k8s中的初始化容器:

  • 为什么会出现初始化容器
  • 初始化容器是做什么的
  • 初始化容器和普通容器及PostStart有啥区别
  • 初始化容器配置示例

本文主要以下几方面介绍k8s中的临时容器:

  • 为什么会出现临时容器
  • 什么是临时容器
  • 临时容器是做什么的
  • 临时容器如何使用
  • 不同安装方式如何开启临时容器功能
  • 不同版本如何使用临时容器
  • 临时容器怎么删除

二、为什么会出现初始化容器

在Kubernetes(K8s)中,初始化容器(Init Container)是一种特殊类型的容器,用于在应用容器运行之前执行一些预处理任务或初始化操作。通过使用初始化容器,可以确保应用容器在正常运行之前,其依赖项和预处理任务已经完成。这有助于提高应用程序的可靠性和可用性,并简化了应用部署和管理的复杂性。

以下是一些常见的使用场景,解释了为什么会在Kubernetes中使用初始化容器:

  • 数据库初始化:在启动数据库应用程序之前,可能需要先创建数据库架构或执行某些初始化脚本。通过使用初始化容器,可以确保数据库在应用程序启动之前已经准备好了。
  • 资源准备:某些应用程序可能需要一些额外的资源或文件,例如配置文件、SSL证书、密钥等。初始化容器可以负责从配置存储或其他位置获取这些资源,并将它们复制到应用容器可以访问的位置。
  • 同步/等待:有时,应用程序可能需要等待其他外部依赖项就绪,例如数据库服务或消息队列。初始化容器可以负责检查依赖项的可用性,并在其就绪后再启动应用容器。
  • 数据预处理:某些应用程序可能需要在启动之前对数据进行预处理,例如解压缩文件、验证数据完整性等。初始化容器可以在应用容器之前执行这些任务,确保应用容器运行时所需的数据已准备就绪。

三、初始化容器是做什么的

在主应用启动之前,做一些初始化的操作,比如创建文件、修改内核参数、等待 依赖程序启动或其他需要在主程序启动之前需要做的工作:

  • Init 容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码;
  • Init 容器可以安全地运行这些工具,避免这些工具导致应用镜像的安全性降低;
  • Init容器可以以root身份运行,执行一些高权限命令;
  • Init容器相关操作执行完成以后即退出,不会给业务容器带来安全隐患

四、初始化容器和普通容器及PostStart有啥区别

初始化容器和PostStart区别如下:

  • PostStart:依赖主应用的环境,而且并不一定先于Command运行

  • InitContainer:不依赖主应用的环境,可以有更高的权限和更多的工具,一定会在主应用启动之前完成

初始化容器和普通容器的区别如下:

  • 初始化容器总是运行到完成
  • 初始化容器每个都必须在下一个启动之前成功完成
  • 如果 Pod 的 Init 容器失败,Kubernetes 会不断地 重启该 Pod,直到 Init 容器成功为止,但是Pod 对应的 restartPolicy 值为 Never,Kubernetes 不会重新启动 Pod
  • 初始化容器不支持 lifecyclelivenessProbereadinessProbestartupProbe, 因为它们必须在 Pod 就绪之前运行完成

五、初始化容器配置示例

初始化容器创建文件,然后主容器运行后可以看到此文件

1.定义一个名为init.yaml的yaml文件

[root@k8s-master01 containers]# vim init.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: test-init
  name: test-init
  namespace: kube-public
spec:
  replicas: 3
  selector:
    matchLabels :
      app: test-init
  template:
    metadata:
      labels:
        app: test-init
    spec:
      volumes:
      - name: data
        emptyDir: {}
      initContainers :
      - command:
        - sh
        - -c
        - touch /mnt/test-init.txt
        image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
        imagePullPolicy: IfNotPresent
        name: init-touch
        volumeMounts :
        - name: data
          mountPath: /mnt
      - command:
        - sh
        - -c
        - for i in `seq 1 100`; do echo $i; sleep 1; done
        image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
        imagePullPolicy: IfNotPresent
        name: echo
      containers:
      - image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
        imagePullPolicy: IfNotPresent
        name: test-init
        volumeMounts :
        - name: data
          mountPath: /mnt

2.开始部署

[root@k8s-master01 containers]# kubectl create  -f init.yaml
deployment.apps/test-init created

3.查看pod状态

[root@k8s-master01 containers]# kubectl get po -n kube-public
NAME                         READY   STATUS        RESTARTS   AGE
test-init-54c575d8db-2wh9p   0/1     Terminating   0          60s
test-init-54c575d8db-bh26l   0/1     Init:1/2      0          9s
test-init-54c575d8db-jhwpp   0/1     Init:1/2      0          9s
test-init-54c575d8db-rvzn8   0/1     Init:1/2      0          9s

4.详细查看podtest-init-54c575d8db-rvzn8,观察到已开始创建初始容器以及开始运行初始容器

[root@k8s-master01 containers]# kubectl describe po test-init-54c575d8db-rvzn8  -n kube-public
...
...
...
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  33s   default-scheduler  Successfully assigned kube-public/test-init-54c575d8db-rvzn8 to k8s-node02
  Normal  Pulled     31s   kubelet            Container image "nginx" already present on machine
  Normal  Created    31s   kubelet            Created container init-touch
  Normal  Started    30s   kubelet            Started container init-touch
  Normal  Pulled     29s   kubelet            Container image "nginx" already present on machine
  Normal  Created    29s   kubelet            Created container echo
  Normal  Started    28s   kubelet            Started container echo

5.查看podtest-init-54c575d8db-rvzn8的日志信息,观察到已开始运行初始化容器echo

[root@k8s-master01 containers]# kubectl logs -f  test-init-54c575d8db-rvzn8 -c echo -n kube-public
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
^C

6.最后查看pod状态,观察到,初始化容器执行完成后,开始运行主程序

[root@k8s-master01 containers]# kubectl get po -n kube-public
NAME                         READY   STATUS    RESTARTS   AGE
test-init-54c575d8db-bh26l   1/1     Running   0          10m
test-init-54c575d8db-jhwpp   1/1     Running   0          10m
test-init-54c575d8db-rvzn8   1/1     Running   0          10m