初始化容器

在运行容器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

k8s 初始化从本地读取镜像_kubernetes


k8s 初始化从本地读取镜像_k8s 初始化从本地读取镜像_02


k8s 初始化从本地读取镜像_docker_03

  • 创建初始化pod并查看状态
kubectl apply -f podinit.yaml
kubectl get pod

k8s 初始化从本地读取镜像_k8s 初始化从本地读取镜像_04

  • 查看pod在哪个机器上运行
kubectl get pod -o wide

k8s 初始化从本地读取镜像_k8s 初始化从本地读取镜像_05

  • 在该机器上查看系统参数,可以看到内核参数被成功修改为0
cat /proc/sys/vm/swappiness

k8s 初始化从本地读取镜像_容器_06

例子二(初始化容器和普通容器共享数据)
  • 该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

k8s 初始化从本地读取镜像_容器_07

  • 查看容器内挂载目录
kubectl exec podinit2 -c c1 -- ls /mnt

k8s 初始化从本地读取镜像_k8s 初始化从本地读取镜像_08