[TOC]

k8s容器检查探针

当容器部署在k8s中的时候,k8s通过 liveness probe 和 readiness probe来监测容器的健康状况,其中liveness probe 和 readiness probe是由容器所在node上的kubelet定期执行的,那关于iveness probe 和 readiness probe分别有以下几个问题

liveness probe

1.如何理解”存活“状态?

2.容器配置了存活探针和没有配置存活探针有什么区别?

3.存活探针有哪几种探测方式?分别是如何配置和如何工作的?

4.如果存活探针探测失败会采取什么策略?

readiness probe

1.如何理解”就绪“状态?

2.容器配置了就绪探针和没有配置就绪探针有什么区别?

3.就绪探针有哪几种探测方式?分别是如何配置和如何工作的?

4.如果就绪探针探测失败会采取什么策略?

liveness probe

1.如何理解容器的“存活”状态?

容器存活,指的是容器可以在虚拟机上运行,但是这并不意味着容器已经可以提供服务。

2.什么样的容器需要配置存活探针?容器配置了存活探针和没有配置存活探针有什么区别?

如果容器中的进程能够在遇到问题或者不健康的情况下自行崩溃,那么就需要配置一个存活探针,来让k8s监测容器的健康状况;而不是以docker返回的容器的状态作为依据

3.存活探针有哪几种探测方式?分别是如何工作的?

容器所在节点上的kubelet调用handler(处理程序)对容器进行探测

handler有以下三种类型:

  • ExecAction:在容器内执行指定命令,如果命令退出时的返回码为0,则表示探测成功;反之表示探测失败
  • TCPSocketAction:对容器IP地址上的指定端口进行TCP检查,如果端口打开,则表示探测成功;反之表示探测失败
  • HTTPGetAction:对容器IP地址上指定端口和路径执行HTTP Get请求,如果响应的状态码大于等于200,且小于400,则表示探测成功;反之表示探测失败

如何配置3种类型的探针

  • ExecAction
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: test-liveness-exec
spec:
containers:
- name: liveness
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
livenessProbe: //存活探针
exec: //探针类型为ExecAction
command: //指定命令
- cat
- /tmp/healthy
initialDelaySeconds: 5 //容器启动后5s后开始执行命令进行探测
periodSeconds: 5 //此后每隔5s探测一次
  • TCPSocketAction
1
2
3
4
5
6
7
8
9
10
11
12
13
14
apiVersion: v1
kind: Pod
metadata:
name: probe-tcp
namespace: coocla
spec:
containers:
- name: nginx
image: nginx
livenessProbe: //存活探针
initialDelaySeconds: 5 //容器启动后5s后开始执行命令进行探测
timeoutSeconds: 1 //此后每隔1s探测一次
tcpSocket: //探针类型为TCPSocketAction
port: 80 //探测的端口
  • HTTPGetAction
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
apiVersion: v1
kind: Pod
metadata:
name: probe-http
namespace: coocla
spec:
containers:
- name: nginx
image: nginx
livenessProbe: //存活探针
httpGet: //探针类型为HTTPGetAction
path: //探测的路径
port: 80 //探测的端口
host: www.baidu.com //探测的url
scheme: HTTPS //协议是https
initialDelaySeconds: 5 //容器启动后5s后开始执行命令进行探测
timeoutSeconds: 1 //此后每隔5s探测一次

每次探测都会得到以下3种结果:

  • success:容器通过了探测
  • failure:容器未通过探测
  • unknown:诊断失败,不会对容器采取任何措施
4.如果存活探针探测失败会采取什么策略?

如果存活探针探测失败,则表示kubelet会将该容器kill掉,然后再根据容器的RestarPolicy进行下一步操作

每一个容器都可以重启策略(RestarPolicy),RestarPolicy有三种选项可以选择:

  • Always(默认值):只要container退出就重新启动
  • Onfailure:当container非正常退出后重新启动
  • never:从不重启container

readiness probe

1.如何理解容器的“就绪”状态?

容器就绪表示container是否以及处于可接受service的请求了

2.什么样的容器需要配置存活探针?容器配置了就绪探针和没有配置就绪探针有什么区别?

就绪态探针的存在意味着 Pod 将在启动阶段不接收任何数据,并且只有在探针探测成功后才开始接收数据,所以如果你的容器需要加载大规模的数据、配置文件或者在启动期间执行迁移操作,可以添加一个就绪探针。

3.存活探针有哪几种探测方式?分别是如何工作的?

同“存活”探针

4.如果存活探针探测失败会采取什么策略?

如果ReadinessProbe失败,endpoints controller将会从service所匹配到的endpoint列表中移除关于这个container的IP地址,所以如果配置了就绪探针,对于Service匹配到的 endpoints有哪些,是ReadinessProbe决定的