概述
初始化是很多编程语言普遍关注的问题,甚至有些编程语言直接支持模式构造来生成初始化程序,这些用于进行初始化的程序结构称为初始化器或初始化列表。初始化代码要首先运行,且只能运行一次,它们常用于验证前提条件、基于默认值或传入的参数初始化对象实例的字段等。Pod中的初始化容器(Init Container)功能与此类似,它们为那些有先决条件的应用容器完成必要的初始设置,例如设置特殊权限、生成必要的iptables规则、设置数据库模式,以及获取最新的必要数据等。有很多场景都需要在应用容器启动之前进行部分初始化操作,例如等待其他关联组件服务可用、基于环境变量或配置模板为应用程序生成配置文件、从配置中心获取配置等。初始化容器的典型应用需求有如下几种。
-
• 用于运行需要管理权限的工具程序,例如iptables命令等,出于安全等方面的原因,应用容器不适合拥有运行这类程序的权限。
-
• 提供主容器镜像中不具备的工具程序或自定义代码。
-
• 为容器镜像的构建和部署人员提供了分离、独立工作的途径,部署人员使用专用的初始化容器完成特殊的部署逻辑,从而使得他们不必协同起来制作单个镜像文件。
-
• 初始化容器和应用容器处于不同的文件系统视图中,因此可分别安全地使用敏感数据,例如Secrets资源等。
-
• 初始化容器要先于应用容器串行启动并运行完成,因此可用于延后应用容器的启动直至其依赖的条件得以满足。
Pod对象中的所有初始化容器必须按定义的顺序串行运行,直到它们全部成功结束才能启动应用容器,因而初始化容器通常很小,以便它们能够以轻量的方式快速运行。某初始化容器运行失败将会导致整个Pod重新启动(重启策略为Never时例外),初始化容器也必将再次运行,因此需要确保所有初始化容器的操作具有幂等性,以避免无法预知的副作用。Init 容器与普通的容器非常像,除了如下两点:
-
• 它们总是运行到完成,即它的本身是有周期的,并不是像nginx,tomcat那样一直堵塞在那里。
-
• 每个都必须在下一个启动之前成功完成,即在真正容器启动之前,初始化容器都要成功跑完。
应用
下面这个pod,会先在初始化容器中往挂载的路径的index.html写入12222222,然后nginx的挂载静态文件下,读取index.html
apiVersion: v1
kind: Pod
metadata:
name: "pod-life"
labels:
app: "pod-life"
spec:
volumes:
- name: content-vol
emptyDir: {}
initContainers: ## Pod在启动containers之前,先要【运行完】initContainers的所有容器,所以这些容器必须有终结,不能一直运行
- name: init-c-01
image: alpine ### 必须有终结的那个时刻,一般不要用一直启动的镜像
command: ["/bin/sh","-c","echo 12222222 > /app/index.html;sleep 30;echo success;"]
volumeMounts:
- name: content-vol
mountPath: /app
containers:
### docker run alpine 没有在后台一直启动的程序
- name: pod-life-01
image: "nginx" #默认的启动命令是启动nginx。nginx启动在后台一直有了
volumeMounts:
- name: content-vol
mountPath: /usr/share/nginx/html
- name: pod-life-02
image: "alpine" #pod里面的containers都必须能启动起来,Pod会不断的重启这个容器
command: ["/bin/sh","-c","sleep 30"]
应用后,查看日志
[root@k8s-01 ~]# kubectl logs -f --tail 200 pod-life -c init-c-01
success
查看pod,发现请求nginx的首页已经变成12222222
[root@k8s-01 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
counter 1/1 Running 0 35h 10.244.165.198 k8s-03 <none> <none>
nfs-client-provisioner-69b76b8dc6-ms4xg 1/1 Running 1 (6d18h ago) 18d 10.244.179.21 k8s-02 <none> <none>
nginx-5759cb8dcc-t4sdn 1/1 Running 0 32m 10.244.179.50 k8s-02 <none> <none>
pod-life 2/2 Running 0 117s 10.244.179.52 k8s-02 <none> <none>
[root@k8s-01 ~]# curl 10.244.179.52
12222222
如果这个时候将yaml的命令改错
那么初始化容器就会一直报错,重试,真正的容器也不会运行
Every 1.0s: kubectl get pods Mon Jun 20 11:34:12 2022
NAME READY STATUS RESTARTS AGE
counter 1/1 Running 0 36h
nfs-client-provisioner-69b76b8dc6-ms4xg 1/1 Running 1 (6d19h ago) 18d
nginx-5759cb8dcc-t4sdn 1/1 Running 0 47m
pod-life 0/2 Init:CrashLoopBackOff 3 (18s ago) 104s
原文始发于微信公众号(背带裤的云原生):轻松搞懂K8S:解码Pod初始化容器的奇妙密码
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/218990.html