Pod初始化容器

        Pod里面可以有一个或者多个容器,部署应用的容器可以称为主容器,在创建Pod时候,Pod中可以有一个或多个先于主容器启动的Init容器,这个init容器就可以成为初始化容器,初始化容器一旦执行完,它从启动开始到初始化代码执行完就退出了,它不会一直存在,所以在主容器启动之前执行初始化,初始化容器可以有多个,多个初始化容器是要串行执行的,先执行初始化容器1,在执行初始化容器2等,等初始化容器执行完初始化就退出了,然后再执行主容器,主容器一退出,pod就结束了,主容器退出的时间点就是pod的结束点,它俩时间轴是一致的。

        Init容器就是做初始化工作的容器。可以有一个或多个,如果多个按照定义的顺序依次执行,只有所有的初始化容器执行完后,主容器才启动。由于一个Pod里的存储卷是共享的,所以Init Container里产生的数据可以被主容器使用到,Init Container可以在多种K8S资源里被使用到,如Deployment、DaemonSet, StatefulSet、Job等,但都是在Pod启动时,在主容器启动前执行,做初始化工作。

        Init容器与普通的容器区别是:

Init 容器不支持 Readiness,因为它们必须在Pod就绪之前运行完成。

每个Init容器必须运行成功,下一个才能够运行。

如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止,然而,如果Pod对应的restartPolicy值为 Never,它不会重新启动。

[root@master ~]# cat nginx_init.yaml 
apiVersion: v1
kind: Pod
metadata: 
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: test-nginx
    ports:
    - containerPort: 80
    image: nginx
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: webdata
      mountPath: /usr/share/nginx/html
  initContainers:
  - name: init-html
    image: busybox:1.28
    imagePullPolicy: IfNotPresent
    volumeMounts:
    - name: webdata
      mountPath: /opt
    command: ["sh","-c","echo 'init' > /opt/index.html "]
  volumes:
  - name: webdata
    emptyDir: {}
[root@master ~]# kubectl apply -f nginx_init.yaml 
pod/nginx created

# 启动的时候先启动初始化容器
[root@master ~]# kubectl get pod
NAME    READY   STATUS     RESTARTS   AGE
nginx   0/1     Init:0/1   0          7s
[root@master ~]# kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          2m7s

# 查看容器里面index.html文件的内容就是初始化容器写入的
[root@master ~]# kubectl exec -it nginx -c test-nginx -- cat /usr/share/nginx/html/index.html
init

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值