初始化容器是在pod的主容器启动之前要运行的容器,主要是做一些 主容器的前置工作,它具有两大特征:
1、初始化容器必须运行完成直至结束,若某初始化容器运行失败,那么kubernetes需要重启它直到成功完成;
2、初始化容器必须按照定义的顺序执行,当且仅当前一个成功之后,后面的一个才能运行,一旦失败,如果 Pod 对应的 restartPolicy 值为 Never,它不会重新启动;
初始化容器有很多的应用场景,下面列出的是最常见的几个:
提供主容器镜像中不具备的工具程序或自定义代码;
初始化容器要先于应用容器串行启动并运行完成,因此可用于延后应用容器的启动直至其依赖的条件得到满足;
二、initConatiner数据共享
需求:假设要以主容器来运行nginx,但是要求在运行nginx之前需要拿到最新的index主页;
创建pod-initcontainer.yaml,内容如下:
apiVersion:v1 kind:Pod metadata: name:php-updated spec: containers: -name:php image:php:7-fpm volumeMounts: -name:dir mountPath:/var/www/html/ initContainers: -name:install image:busybox volumeMounts: -name:dir mountPath:/var/www/html/ command: -wget -"-O" -"/var/www/html/index.php" -https://gitee.com volumes: -name:dir emptyDir: {}
启动成功后,登陆进PHP容器,可以查看到/var/www/html/目录下的index.html文件为init container所生成。
三、initConatiner前置数据操作
初始化容器和PortStart的区别:
PostStart:依赖主应用的环境,而且并不一定先于Command运行
InitContainer:不依赖主应用的环境,可以有更高的权限和更多的工具,一定会在主应用启动之前完成。
Init 容器不支持 lifecycle、livenessProbe、readinessProbe 和 startupProbe。
需求:
假设 主容器在运行前,需要依赖一个B应用,只有B应用成功启动后此容器才可以正常运行;
创建pod-initcontainer22.yaml,内容如下:
apiVersion: apps/v1 kind: Deployment metadata: labels: run: my-app name: my-app spec: replicas: 2 selector: matchLabels: run: my-app template: metadata: labels: run: my-app spec: restartPolicy: Always containers: - name: myapp-container image: busybox:1.28 command: ['sh', '-c', 'echo The app is running! && sleep 3600'] initContainers: - name: init-myappb image: busybox:1.28 command: ['sh', '-c', "until nslookup myappb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myappb; sleep 2; done"]
创建测试所用的svc:
apiVersion: v1 kind: Service metadata: name: myappb spec: ports: - protocol: TCP port: 80 targetPort: 9377
为创建svc前,initcontainer一直处于等待,可以从console端输出日志看到其状态,一旦创建svc,initcontainer探测到svc正常后,即启动后续的mainContainer。
-
容器
+关注
关注
0文章
495浏览量
22060 -
代码
+关注
关注
30文章
4780浏览量
68539 -
镜像
+关注
关注
0文章
164浏览量
10707
原文标题:initContainer多场景应用
文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论