上次推文我们学习了Pod生命周期(上)知识:相位、创建与终止、初始化容器,今天继续分享完余下的3个知识:钩子函数、容器探测、重启策略。
01钩子函数
钩子函数能够感知自身生命周期中的事件,并在相应的时刻到来时运行用户指定的程序代码。
k8s在主容器的启动之后和停止之前提供了两个钩子函数.
-
post start:容器创建之后执行,如果失败了会重启容器;
-
pre stop:容器终止之前执行,执行完成之后容器将成功终止,在其完成之前会阻塞删除容器的操作;
钩子处理器支持使用下面三种方式定义动作:
1)Exec命令:在容器内执行一次命令
......
lifecycle:
postStart:
exec:
command:
- cat
- /tmp/healthy
......
2)TCPSocket:在当前容器尝试访问指定的socket
......
lifecycle:
postStart:
tcpSocket:
3)HttpGet:在当前容器中向某url发起http请求
......
lifecycle:
postStart:
httpGet:
path: #uri地址
port:
host:
scheme: HTTP #支持的协议,http或者https
......
下面演示钩子函数的使用
创建pod-hook-exec.yaml文件,内容如下:
apiVersion: v1
kind: Pod
metadata:
name: pod-hook-exec
namespace: dev
spec:
containers:
- name: main-container
image: nginx:1.17.1
ports:
- name: nginx-port
containerPort: 80
lifecycle:
postStart:
exec: #在容器启动的时候执行一个命令,修改掉nginx的默认首页内容
command: ["/bin/sh","-c","echo postStart... >
/usr/share/nginx/html/index.html"]
preStop: #在容器停止之前停止nginx服务
exec:
command: ["/usr/sbin/nginx","-s","quit"]
使用配置文件
[root@master ~]# vim pod-hook-exec.yaml
[root@master ~]# kubectl create -f pod-hook-exec.yaml
pod/pod-hook-exec created
[root@master ~]# kubectl get pod pod-hook-exec -n test -o wide
NAME READY STATUS RESTARTS AGE IP NODE
NOMINATED NODE READINESS GATES
pod-hook-exec 1/1 Running 0 34s 10.244.104.24 node2
<none> <none>
[root@master ~]# curl 10.244.104.24:80
postStart...
02容器探测
容器探测用于检测容器中的应用实例是否能正常工作,是保障业务可用性的一种传统机制。如果经过探测,实例的状态不符合预期,那么K8S就会把该问题实例“摘除”,不承担业务流量,k8s提供了两种探针来实现容器探测,分别是:
-
livenessprobes:存活性探针,用于检测应用实例当前是否处于正常运行状态,如果不是,k8s会重启容器;
-
readinessprobes:就绪性探针,用于检测应用实例当前是否可以接受请求,如果不能,k8s不会转发流量;
即livenessProbe决定是否重启容器,readinesProbe决定是否将请求转发给容器。
-
startupProbe:使用启动探针来了解应用容器何时启动,如果配置了这个类探针,就可以控制容器在启动成功后再进行存活性liveness和就绪态readiness的检查,确保存活、就绪探针不会影响应用的启动。
探针参数
探针有很多配置参数,可以使用这些参数精确地控制启动、存活和就绪检测的行为。
--initialDelaySeconds:容器启动后要等待多少秒后才启动存活、就绪和启动探针, 默认是 0 秒,最小值是