初始化容器
在运行容器C前,需要做一些准备工作,容器C才能正常工作,则做准备工作的容器A和容器B等,可以设置为容器C的初始化容器,只有所有的初始化容器全部正确运行完毕,容器C才能运行。
如果任一初始化容器运行失败,则容器C不会运行,该初始化容器之后的初始化容器也不会运行(按yaml文件中定义的顺序)。
例子一(修改物理机内核参数)
- 该yaml文件中定义了两个容器,一个为初始化容器c2,另一个为普通容器c1,初始化容器使用的镜像是alpine,它运行起来后要修改内核参数vm.swappiness=0。在docker部分,容器直接访问的是物理机的CPU和内存,初始化容器实际上修改的是此pod所在物理机上的内核参数。因为安全机制,容器不允许修改物理机内核参数,所以加上了securityContext允许了特权模式。
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: podinit
name: podinit
spec:
terminationGracePeriodSeconds: 300
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: c1
resources: {}
initContainers:
- image: docker.io/alpine:latest
imagePullPolicy: IfNotPresent
name: c2
command: ["/bin/sh","-c","sysctl -w vm.swappiness=0"]
securityContext:
privileged: true
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
- 确定物理机上swappiness的值
cat /proc/sys/vm/swappiness
- 创建初始化pod并查看状态
kubectl apply -f podinit.yaml
kubectl get pod
- 查看pod在哪个机器上运行
kubectl get pod -o wide
- 在该机器上查看系统参数,可以看到内核参数被成功修改为0
cat /proc/sys/vm/swappiness
例子二(初始化容器和普通容器共享数据)
- 该yaml文件中定义了名字为podinit2的pod,在pod里创建了一个名字为workdir的存储卷,c2为初始化容器,它把存储卷workdir挂载到本容器的/work-dir目录里,然后在挂载点/work-dir里创建aa.txt,其实这个文件创建在存储卷workdir中。在普通容器c1中,会把存储卷挂载到本容器的/mnt中,访问/mnt的时候实际上访问的就是存储卷workdir,这样在普通容器c1中就能在/mnt里看到aa.txt。
apiVersion: v1
kind: Pod
metadata:
name: podinit2
labels:
app: podinit2
spec:
volumes:
- name: workdir
emptyDir: {}
containers:
- name: c1
image: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- name: workdir
mountPath: "/mnt"
initContainers:
- name: c2
image: busybox
imagePullPolicy: IfNotPresent
command: ['sh', '-c', 'touch /work-dir/aa.txt']
volumeMounts:
- name: workdir
mountPath: "/work-dir"
- 创建pod并查看运行状态
kubectl apply -f podinit2.yaml
kubectl get pod
- 查看容器内挂载目录
kubectl exec podinit2 -c c1 -- ls /mnt