初始化容器
初始化容器的两种典型操作。
1 初始化容器必须运行完成直至结束,若某初始化容器运行失败,则kubernetes要重启其知道成功完成
2 每个初始化容器都必须按照定义的顺序串行执行
应用场景:
1 用于运行特定的工具程序,处于安全方面的考虑,这些程序不适合在主容器中使用
2 提供主容器镜像中不具备的工具程序或自定义代码
3 为容器镜像的构建和部署人员提供了分离,独立工作途径,使得他们不必协同起来制作单个镜像文件
4 初始化容器和朱荣旗处于不同的文件系统视图,可分别安全的使用敏感资源
5 初始化容器要先于与应用容器串行启动并运行完成
kubectl explain pods.spec.initContainers
示例
#[root@master1 all]# cat demoinit.yaml
apiVersion: v1
kind: Pod
metadata:
name: demo-init
labels:
service: httpd
spec:
containers:
- name: myapp-container
image: ikubernetes/myapp:v1
initContainers:
- name: init-something
image: busybox
command: ["sh","-c","sleep 10"]
生命周期函数
生命周期函数实现了程序运行周期中关键时刻的可见性,并赋予用户为此采取某种行动的能力,类似的,容器生命手气钩子使用它能够感知自身声明周期管理中的事件,并在相应的时刻到来是运行由用户指定的处理程序代码, kubernetes为容器提供了两种声明周期钩子。
poststart: 于容器创建完成后立即执行的钩子处理器,不过kubernetes无法确保它一定会于容器中的ENTRYPOINT 之前运行
preStop: 于容器终止操作之前立即运行的钩子处理器,它以同步的方式调用,因此在其完成之前会阻塞删除容器的操作作用
钩子处理器实现方式有exec和http两种,前一种是在钩子事件触发直接在当前容器中运行的由用户定义的命令,后一种则是当前容器中向某URL发起http请求
poststart 和 prestop 的定义在pods.spec.containers.lifecycle
嵌套字段中,使用方式如下
#[root@master all]# cat demo-life.yaml
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:
- name: lifecycle-demo
image: nginx:1.14
lifecycle:
postStart:
exec:
command: ["/bin/sh","-c","echo 'nginx-lifecycle-demo' >/usr/share/nginx/html/index.html"]
容器探测
Pod通过两类探针来检查容器的健康状态。分别是LivenessProbe(存活探测)和 ReadinessProbe(就绪探测)
Pod 终止过程
概述
当用户提交删除请求后,系统会进行强制删除操作的宽限倒计时,并将TERM信息发送给POD对象的每一个容器的主进程,宽限倒计时结束后,这些进程将收到强制kill信号,POD对象随机也将由API server删除,如果在等待进程终止的过程中,kubelet或容器管理器发生了重启,那么终止操作会重新获取一个满额的删除宽限期限并重新执行删除操作。
对象的终止流程
1 用户发送删除POD对象命令
2 api server 服务中的POD会随时间的推移而更新,在宽限期内(默认是30s)pod被视为dead
3 将pod 标记为terminating状态
4 与第三步同时进行,kubelet在监控到POD对象转换为terminaing状态的同时启动POD关闭过程
5 与第三步同行,端点控制器监控到POD对象的关闭行为时将其所有匹配到此端点的service资源的端点列表中的POD移除
6 如果当前POD对象定义了prestop钩子处理器,则将其标记为termingating 后及会以同步的方式启动执行,若宽限期结束后,prestop仍未结束,则第二部会被重新执行一个时长为2秒的小宽限期限
7 pod对象中的容器进程收到term信号
8 宽限期结束后,若存在任何一个仍在运行的进程,那么pod 对象及会收到sigkill 信号
9 kubelet请求api server 将次POD 资源的宽限期设置为0从而完成删除操作,他变得对用户不可见
POD 状态
1 pending:api server创建了POD,资源对象已经存储进入etcd中,但尚未完成调度
2 running: pod 已经被调度至某个节点,并且所有容器都已经被kubelet创建完成
3 failed:失败状态
4 suceeded:pod 中的所有容器已经成功终止并不会重启
5 unknown:未知状态,和节点的kubelet故障,联络中断,成了未知状态