[TOC]
# Pod 健康检查(探针)和重启策略
Pod 的探针分为`liveness`和`readiness`探针 存活探针 和 就绪探针
* liveness 为容器存活探针
* readiness 为容器就绪探针(可读性)
## 存活探针 (liveness)
根据官网api手册,查到liveness提供三种探测方法
* exec :执行命令的检测方式
* httpGet :根据http请求返回的检测方式
* tcpSocket :检查容器TCP状态,如果能连接则正常(eg:连接数据库3389)
### exec 方式示例
~~~
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
image: busybox
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5 # 容器启动完成后,等待5秒再开始检测
periodSeconds: 5 #每间隔5秒检测一次
~~~
上面的yaml做了两件事情
* 定义一个pod,这个pod会在启动时,创建`/tmp/healthy`的文件,然后等待30秒后,删除这个文件
* 每隔5秒,就会执行`cat /tmp/healthy`命令,如果检测到执行命令失败,则这个Pod将会重启
因为一开始创建容器的时候,是有`/tmp/healthy`文件的,但是30秒后,这个文件将会被删除,随后检测失败,这个容器再次被重启,如此循环

重启的次数

### httpGet 方式示例
httpGet的方式是检查返回码,而不是检测某个具体的端口,例如8080
~~~
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-http
spec:
containers:
- name: liveness
image: registry.cn-shenzhen.aliyuncs.com/zwh-kolla/liveness (官方测试用的镜像,我下载到了阿里云上)
args:
- /server
livenessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: Custom-Header
value: Awesome
initialDelaySeconds: 3
periodSeconds: 3
~~~
**任何大于或等于200且小于400的代码表示成功,任何其他代码表示失败。**
`periodSeconds`:指定kubelet应每3秒执行一次活跃度探测 `initialDelaySeconds`:告诉kubelet应该在执行第一次探测之前等待3秒`name: Custom-Header`和`value: Awesome`:获取http返回文本信息中的内容
查看api文档,httpGet检测方式,有以下字段可以设置:
* host:要连接的主机名,默认为Pod IP,可以在http request head中设置host头部。
* scheme: 用于连接host的协议,默认为HTTP。
* path:http服务器上的访问URI。
* httpHeaders:自定义HTTP请求headers,HTTP允许重复headers。
* port: 容器上要访问端口号或名称。
## 就绪探针 (readiness)
### TCP 方式示例
针对检测某一个指定的端口
~~~
apiVersion: v1
kind: Pod
metadata:
name: goproxy
labels:
app: goproxy
spec:
containers:
- name: goproxy
image: k8s.gcr.io/goproxy:0.1
ports:
- containerPort: 8080
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
~~~
这个示例中,使用了两个探针`readinessProbe`和`livenessProbe`
* 第一步:使用`readinessProbe`字段,容器启动完成5秒后,每隔10秒访问一次8080端口,能访问则容器正常。
* 第二步:使用`livenessProbe`字段,容器启动完成15秒后,每隔20秒访问一次8080端口,能访问则容器正常。
#### readinessProbe和livenessProbe区别
两种配对Pod的处置方式不同
* 就绪探针`readinessProbe`探测失败时,就绪探针不会删除或重启Pod,而是会显示“未就绪”状态
* 存活探针`livenessProbe`探测失败时,则Kill容器并根据Pod的重启策略来决定作出对应的措施
还是上面TCP的示例片段
~~~
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
~~~
### 探针其他可选字段
(详情可以查看官网API文档)
`initialDelaySeconds`:Pod启动后延迟多久才进行检查,单位:秒。
`periodSeconds`:检查的间隔时间,默认为10,单位:秒。
`timeoutSeconds`:探测的超时时间,默认为1,单位:秒。
`successThreshold`:探测失败后认为成功的最小连接成功次数,默认为1,在Liveness探针中必须为1,最小值为1。
`failureThreshold`:探测失败的重试次数,重试一定次数后将认为失败,在readiness探针中,Pod会被标记为未就绪,默认为3,最小值为1
### 使用命名的端口
可以使用命名的ContainerPort作为HTTP或TCP liveness检查:
~~~
ports:
- name: liveness-port
containerPort: 8080
hostPort: 8080
livenessProbe:
httpGet:
path: /healthz
port: liveness-port
~~~
## 重启策略
根据`restartPolicy`来定义重启策略 1)`Always`:但凡 Pod 对象终止就将其重启,此为默认设定。 2)`OnFailure`:仅在 Pod 对象出现错误时方才将其重启。 3)`Never`: 从不重启。
Pod 的重启,只会在当前同一节点上尝试重启 Pod。 只有第一次重启是立刻执行,后面需要重启时,kubelet 会延迟时间进行,且反复 的重启操作的延迟时长依次为 10秒、20秒、40秒、80秒、160秒和300秒,300秒是最大延迟时长。
- 一、K8S的安装
- 1.1 安装环境
- 1.2 问题汇总
- 1.3 事前准备
- 1.4 安装配置负载均衡
- 1.5 安装K8S软件
- 1.6 初始化kubeadm
- 1.7 添加控制节点
- 1.8 添加计算节点
- 1.9 安装故障问题处理
- 1.10 安装管理dashboard
- 1.11 编写测试Pod
- 1.12 从外部访问集群中的Pod
- 1.13 部署metrics-server指标采集
- 二、Pod管理
- 2.1 Pod 资源需求和限制
- 2.2 Init 容器
- 2.3 Pod 健康检查(探针)和重启策略
- 2.4 Pod 生命周期(钩子Hook)
- 2.5 静态Pod
- 2.6 初始化容器(init container)
- 2.7 资源限制
- 三、资源控制器
- 3.1 Deployment
- 3.2 StatefulSet
- 3.3 DaemonSet
- 3.4 Job
- 3.5 定时任务
- 3.6 准入控制器
- 3.7 自动伸缩
- 3.8 ReplicaSet
- 四、存储
- 4.1 Secret 管理敏感信息
- 4.2 ConfigMap 存储配置
- 4.3 Volume
- 4.4 PV
- 4.5 PVC
- 4.6 StorageClass
- 4.7 暴露宿主机信息给Pod
- 五、服务Service
- 5.1 Service 资源
- 5.2 服务发现
- 5.3 服务暴露
- 5.4 Ingress 资源
- 5.5 Ingress 专题
- 5.6 traefik 2.X版本使用
- 六、认证、授权、准入控制
- 6.1 服务账户
- 6.2 LimitRange资源与准入控制器
- 6.3 ResourceQuota 资源与准入控制器
- 七、Helm
- 7.1 Helm 安装
- 八、 istio
- 8.1 istio 介绍
- 8.2 iotis 安装
- 九、calico
- 9.1 两种网络模式
- 9.2 全互联模式 与 路由反射模式
- 9.3 BGP跨网段(大型网络)
- 十、Ingress
- 10.1 安装 LoadBalancer
- 10.2 部署 ingress-nginx
- 10.3 Ingress-nginx 的使用
- 10.4 开启TCP和UDP
- 使用中的问题
- CSI Node问题
