此文为学习《Kubernetes权威指南》的相关笔记
学习笔记:
初始化容器Init Container(后称IC)用于在启动应用容器前进行初始化,完成应用容器所需的预置条件。
主要应用场景如:
- 等待其他关联组件正确运行(如数据库或后台某个服务)
- 基于环境变量或配置模板生成配置文件
- 从远程数据库获取本地所需配置,或者将自身注册到某个中央数据库中
- 下载相关依赖包,或者对系统进行一些预配置操作
作为初始化的工具, IC容器仅运行一次就结束,且不能设置readinessProbe探针,多个IC容器将依次执行,系统要求必需在所有IC执行成功后才能继续执行下一个容器。
在IC容器中也可以设置资源限制,但与应用容器存在如下不同:
- 如果多个IC容器都定义了资源请求/限制,则取最大值作为所有IC容器的资源请求值/限制值
- Pod的有效资源请求值/限制值则取(应用容器值之和/IC容器最大值)中的较大值
- Pod的有效资源请求值/限制值是调度算法、真实资源配额和cgroup设置真正使用的值,也就是说,IC容器可以为初始化操作预留系统资源
当Pod被重启时,IC容器将会重新执行,常见的Pod重启场景如下:
- IC容器被更新时,整个Pod将会重启(应用容器被更新时,只有该应用容器会被重启)
- Pod的infrustructure容器更新时,Pod将会被重启
- Pod中所有容器都终止,且RestartPolicy=Always,Pod将会被重启。
阿里云大学云原生公开课对于IC容器作如下介绍:
在下面的实例中,新建Pod运行一个nginx应用容器
在启动nginx前,通过初始化容器创建一个Nginx启动主页
不难想到的是,大多数初始化操作都需要对应用容器文件进行修改,势必要给IC容器与应用容器设置共享Volume
apiVersion: v1
kind: Pod
metadata:
name: nginx
annotations:
spec:
initContainers:
- name: install
image: busybox
imagePullPolicy: IfNotPresent
command: #拉取一个网页到共享的Volume下
- wget
- "-O"
- "/work-dir/index.html"
- http://kubernetes.io
volumeMounts:
- name: workdir
mountPath: "/work-dir"
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts: #把共享的workdir挂载到nginx容器的默认web页面存储文件夹下
- name: workdir
mountPath: /usr/share/nginx/html
dnsPolicy: Default
volumes:
- name: workdir
emptyDir: {}
启动该Pod
# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 87s
查看Pod信息,可以看到配置的IC信息也存在于Pod详情中
# kubectl describe pod nginx
Name: nginx......
Init Containers:
install:
Container ID: docker://2f245864a6823fc943eaa03ee2d8935b21bf1874e11c095225a690d3b9ea0d8f
Image: busybox
Image ID: docker-pullable://busybox@sha256:1828edd60c5efd34b2bf5dd3282ec0cc04d47b2ff9caa0b6d4f07a21d1c08084
Port: <none>
Host Port: <none>
Command:
wget
-O
/work-dir/index.html
http://kubernetes.io......
使用kubectl describe命令可以看到Pod事件中先创建并运行了IC容器(名为install)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled <unknown> default-scheduler Successfully assigned default/nginx to xu.node1
Normal Pulled 2m10s kubelet, xu.node1 Container image "busybox" already present on machine
Normal Created 2m10s kubelet, xu.node1 Created container install
Normal Started 2m9s kubelet, xu.node1 Started container install
Normal Pulling 2m7s kubelet, xu.node1 Pulling image "nginx"
Normal Pulled 2m5s kubelet, xu.node1 Successfully pulled image "nginx"
Normal Created 2m5s kubelet, xu.node1 Created container nginx
Normal Started 2m5s kubelet, xu.node1 Started container nginx
不出意外,在nginx容器的挂载目录中,我们可以找到IC容器为它初始化好的index.html
# kubectl exec -it nginx -c nginx /bin/sh
$ cat /usr/share/nginx/html/index.html
<!doctype html><html id=home lang=en><head><meta name=generator content="Hugo 0.59.1"><script async src="https://www.googletagmanager.com/gtag/js?id=......