一,Pod重启策略
yaml中与containers同级
containers:
restartPolicy: Never
取值
Always:只要退出就重启,默认策略
OnFailure:失败退出(exit code不等于0)时重启
Never:只要退出就不再重启
二,健康检查类型
1,(存活检查)livenessProbe:如果检测失败,将杀死容器,根据pod的restartPolicy来操作
2,(就绪检查)readinessProbe:如果检查失败,Kubernetes会把pod从service endpoints中剔除
3,(启动检查)startupProbe:使用启动检查时默认禁用其他检查机制,检查成功才由存活检查接手,用于保护慢启动容器
三,健康检查方法
httpGet: 发送http请求,返回状态码200-400成功
#http探测任何大于或等于 200 且小于 400 的代码都表示成功,其他代表失败
exec:执行shell命令返回状态码0成功
tcpSocket: 发起TCP Socket建立成功
httpget
对指定端口指定url发起http请求
spec:
containers:
- image: nginx
name: nginx
resources: {}
livenessProbe: #http方式存活检查,默认重启pod
httpGet:
port: 80
path: /
initialDelaySeconds: 10
periodSeconds: 10
readinessProbe: #http就绪检查,默认从service摘除pod
httpGet:
port: 80
path: /
initialDelaySeconds: 10 #initialDelaySeconds 表示在容器启动后多少秒开始探测
periodSeconds: 10 #periodSeconds 表示探针的探测周期,默认情况下是 10 秒
tcpsocket
对指定端口建立tcp连接
spec:
containers:
- name: mysql-01
image: mysql:5.6
resources:
limits:
memory: "512Mi"
cpu: "1500m"
ports:
- containerPort: 3306
readinessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 30
periodSeconds: 20
livenessProbe:
tcpSocket:
port: 3306
initialDelaySeconds: 30
periodSeconds: 20
exec
运行一次命令
spec:
...
containers:
- image: 'gluster/gluster-centos:latest'
readinessProbe:
timeoutSeconds: 3
initialDelaySeconds: 60
exec:
command:
- /bin/bash
- '-c'
- systemctl status glusterd.service
livenessProbe:
timeoutSeconds: 3
initialDelaySeconds: 60
exec:
command:
- /bin/bash
- '-c'
- systemctl status glusterd.service
startupProbe:
tcpSocket:
port: 24007
failureThreshold: 10 #表示运行探测失败的次数
initialDelaySeconds: 10 #表示在容器启动后多少秒开始探测
periodSeconds: 10 #表示探针的探测周期,默认情况下是 10 秒
四,钩子函数
钩子函数能够感知自身生命周期中的事件,并在相应的时刻到来时运行用户指定的程序代码。
kubernetes在主容器的启动之后和停止之前提供了两个钩子函数:
post start:容器创建之后执行,如果失败了会重启容器
pre stop :容器终止之前执行,执行完成之后容器将成功终止,在其完成之前会阻塞删除容器的操作
钩子处理器支持使用下面三种方式定义动作:
Exec命令:在容器内执行一次命令
spec:
containers
- names:
...
lifecycle:
postStart:
exec:
command:
- cat
- /tmp/healthy
TCPSocket:在当前容器尝试访问指定的socket
spec:
containers
- names:
...
lifecycle:
postStart:
tcpSocket:
port: 8080
HTTPGet:在当前容器中向某url发起http请求
spec:
containers
- names:
...
lifecycle:
postStart:
httpGet:
path: / #URI地址
port: 80 #端口号
host: 192.168.5.3 #主机地址
scheme: HTTP #支持的协议,http或者https
为pod设置额外的命令,有可能覆盖默认的Entrypoint和Cmd时,将应用以下规则:
如果不为容器提供command或args参数,则使用Docker镜像中定义的默认值。
如果提供command但没有提供args参数,则仅使用提供的command。Docker镜像中定义的默认EntryPoint和默认Cmd将被忽略。
如果仅为容器提供args,则Docker镜像中定义的默认Entrypoint将与您提供的args一起运行。
如果提供command和args,则将忽略Docker镜像中定义的默认Entrypoint和默认Cmd。 您的command与 args一起运行。
spec:
containers:
- name: main-container
...
lifecycle:
postStart:
exec: # 在容器启动的时候执行一个命令,修改nginx默认首页内容
command: ["/bin/sh","-c","echo postStart... > /usr/share/nginx/html/index.html"]
preStop:
exec: # 在容器停止之前停止nginx服务
command: ["/usr/sbin/nginx","-s","quit"]
五,init初始化
初始化容器是在pod的主容器启动之前运行的容器,做一些主容器的前置工作。
应用场景:
- 检查并等待其他关联组件运行(例如:数据库或某个后台服务)。
- 基于环境变量(env)或者配置模板生成配置文件。
- 从远程数据库获取本地所需的配置信息(类似配置中心),或者将自身注册到某个中央数据库中(类似服务注册)。
- 下载相关依赖包,或者对系统进行一些预配置操作,比如设置文件、目录权限。
- 应用 Init Container 对集群环境进行故障排查。与其他几种应用场景相比较特殊。
它具有两大特征:
1.初始化容器必须运行完成直至结束,若某初始化容器运行失败,那么kubernetes需要重启它直到成功完成
2.初始化容器必须按照定义的顺序执行,当且仅当前一个成功之后,后面的一个才能运行
初始化容器有很多的应用场景,下面列出的是最常见的:
- 提供主容器镜像中不具备的工具程序或自定义代码
- 初始化容器要先于应用容器串行启动并运行完成,因此可用于延后应用容器的启动直至其依赖的条件得到满足
#项目环境,pod启动前先用初始化容器测试连接数据库和缓存是否存活
apiVersion: v1
kind: Pod
metadata:
name: pod-initcontainer
namespace: dev
spec:
containers:
- name: main-container
image: nginx:1.17.1
ports:
- name: nginx-port
containerPort: 80
initContainers:
- name: test-mysql
image: busybox:1.30
command: ['sh', '-c', 'until ping 192.168.90.14 -c 1 ; do echo waiting for mysql...; sleep 2; done;']
- name: test-redis
image: busybox:1.30
command: ['sh', '-c', 'until ping 192.168.90.15 -c 1 ; do echo waiting for reids...; sleep 2; done;']