重启策略

一些rs对象:必须设置为Always,需要保证该容器持续运行。
Job和CronJob:OnFailure或Never,确保容器执行完成后不再重启。

重启策略适用于pod对象中的所有容器,首次需要重启的容器,将在其需要时立即进行重启,随后再次需要重启的操作将由kubelet延迟一段时间后进行,且反复的重启操作的延迟时长为10s,20s,40s,80s,160s,300s。300s是最大延迟时长

健康检测

记: 在服务刚启动时也许会提示检查失败的警告 Warning Unhealthy 18s (x2 over 24s) kubelet Readiness probe failed: dial tcp 10.42.2.55:32000: connect: connection refused,这个时候需要结合pod的启动日志进行查看是否真的启动成功

容器进程返回值非零,Kubernetes则认为容器 发生故障,需要重启。有不少情况是发生了故障,但进程并不会退出。比如访问Web服务器时显示500内部错误,可能是系统超载,也 可能是资源死锁,此时httpd进程并没有异常退出,在这种情况下重启 容器可能是最直接、最有效的解决方案,那我们如何利用Health Check机制来处理这类场景呢? 答案就是Liveness探测。

Probe有以下三种类型

StartupProbe:

k8s 1.16版本后新加的探测方式,用于判断容器内应用程序是否已经启动, 避免一些需要长时间启动的容器被前面的探针杀掉。

如果配置了startupProbe,就会先禁止其他的探测,直到它成功为止,成功后将不再进行探测。比较适用于容器启动时间长的场景。

1
2
3
4
5
6
7
8
9
10
11
### 假如打算部署一个Java SpringBoot项目,我们假定他的项目启动时间为30秒左右,30秒后才能正常提供服务,那么我们就应该在这个时间段设置一个启动探针 StartupProbe。

startupProbe:
httpGet:
path: /doc.html
port: 40017
initialDelaySeconds: 10
failureThreshold: 10
periodSeconds: 5

### 该容器启动10秒后,startupProbe首先检测,应用程序最多有 50 秒(10次 * 5秒 = 50s)完成启动。一旦startupProbe成功一次,livenessProbe将接管,以对后续运行过程中容器死锁提供快速响应。如果startupProbe从未成功,则容器将在50s后被杀死。

livenessProbe(如果不配置,则认为当前pod永远都是健康的)

  • 判断什么时候需要杀死当前容器, 然后依据pod的重启策略进行restartPolicy

如果检查失败,将杀死容器,根据Pod的restartPolicy来操作。

1
2
3
4
5
6
7
8
9
10
11
### 第二步加入就绪探针 ReadinessProbe 用来验证该容器内的服务可以正常提供服务。

readinessProbe:
httpGet:
path: /doc.html
port: 40017
initialDelaySeconds: 10
failureThreshold: 3
periodSeconds: 5

### 这里我们探测服务的40017端口是否启动监听。经过验证,加上readinessProbe探针基本将宕机时间大幅缩减,readinessProbe会确保服务在你指定的探测命令执行成功的情况下才开始接受请求。 即便是服务的副本数只有1的情况下也不会出现长时间宕机,因为只有新的pod被探活成功,才会去停止旧有的一个pod,也即我们的服务被成功启动前,旧有的pod会一直存在处理请求的。

readinessProbe

  • 判断什么时候服务可以提供使用

如果检查失败, Kubernetes会把Pod从service endpoints中剔除。

1
2
3
4
5
6
7
8
9
10
### 第三步加入存活探针 LivenessProbe 来对服务的长时间健康检测。

livenessProbe:
httpGet:
path: /doc.html
port: 40017
failureThreshold: 1
periodSeconds: 10

### livenessProbe的设计是为了在 pod 启动成功后进行健康探测。

三种探针的配置语法完全一样.

探针检测命令是在容器中执行配置好的命令**

  • exec:如果命令返回值为0则表示容器是健康的。
  • httpGet:如果若返回200-399状态码时,则表示容器是健康的。
  • tcpSocket:通过探测容器的IP和Port,执行TCP健康检查,若这个TCP的链接能够正常被建立,则表示容器是健康的。

Probe详细配置:

1
2
3
4
5
6
initialDelaySeconds:容器启动后第一次执行探测是需要等待多少秒,默认是0秒,最小值是0。
periodSeconds:执行探测的频率。默认是10秒,最小1秒。
timeoutSeconds:探测超时时间。默认1秒,最小1秒。
successThreshold:探测失败后,最少连续探测成功多少次才被认定为成功。默认是1。对于liveness必须是1。最小值是1。
failureThreshold:探测成功后,最少连续探测失败多少次才被认定为失败。默认是3。最小值是1。
HTTP probe 中可以给 httpGet设置其他配置项:

httpget其它配置项

1
2
3
4
5
host:连接的主机名,默认连接到pod的IP。
scheme:连接使用的schema,默认HTTP。
path: 访问的HTTP server的path
httpHeaders:自定义请求的header。
port:访问的容器的端口名字或者端口号。端口号必须介于165535之间。

默认Probe

1
2
Readiness:  tcp-socket 127.0.0.1:32000 delay=0s timeout=1s period=10s #success=1 #failure=3
Liveiness: tcp-socket 127.0.0.1:32000 delay=0s timeout=1s period=10s #success=1 #failure=3