【七】Kubernetes 探针介绍 - 存活、就绪探针案例测试
一、探针概述
探针是有 kubelet 对容器执行的定期诊断,并不是由 Master 节点发起的探测,而是由每一个 Node 所在的 kubelet 进行探测,这样可以减轻 Master 节点系统负载压力。
kubelet 要执行诊断,kubelet 调用由容器实现的 Handler (处理程序)。一共有三种类型的处理程序:
-
ExecAction: 在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功,非 0 都属于不成功。
-
TCPSocketAction: 对容器的 IP 地址上的指定端口执行 TCP 检查。如果端口打开,则诊断被认为是成功的。
-
HTTPGetAction: 对容器的 IP 地址上指定端口和路径执行 HTTP Get 请求。如果响应的状态码大于等于 200 且小于 400,则诊断被认为是成功的。
每次探测都将获得以下三种结果之一:
Success
(成功):容器通过了诊断。Failure
(失败):容器未通过诊断。Unknown
(未知):诊断失败,因此不会采取任何行动。
两种探针方式:
liveness Probe:是一个存活探测器,会随着 Pod 生命周期一直循环检测。探测容器是否正在运行,如果存活探测失败,则 kubelet 会杀死容器,然后根据其容器的
重启策略来对容器进行操作,默认为 Always,则 Pod 进行重启。
readiness Probe:是一个就绪探测器,检测 Pod 是否到达就绪状态,只有达到就绪状态了才可以对外提供服务,当一个 Pod 内的所有容器都准备好了,才能把这个 Pod 看作就绪了。
readiness Probe 应用场景:
就绪探针可以应用在 Service 后端的 Pod 探测上,在 Pod 还没有准备好的时候,会从 Service 的负载均衡器中剔除。
二、探针实例测试
2.1 就绪探针 - HTTP Get
readiness-httpget.yaml如下:
apiVersion: v1 kind: Pod metadata: name: readiness-httpget # Pod 名称 namespace: test # Pod 所在的命名空间 spec: containers: - name: readiness-httpget-container # 容器名称 image: hub.test.com/library/mynginx:v1 # 镜像地址 imagePullPolicy: IfNotPresent # 镜像下载策略 readinessProbe: # 就绪探测 httpGet: # 检测方案 path: /index1.html # 检测路径 port: 80 # 检测端口 initialDelaySeconds: 3 # 启动后多少秒开始第一次检测 periodSeconds: 3 # 每次间隔检测时间
创建 Pod
[root@k8s-master01 ~]# kubectl create -f readiness-httpget.yaml pod/readiness-httpget created
查看 Pod 状态
虽然已经 Running 了,但是还没就绪状态,因为我们这个容器没有
index1.html这个页面。
查看该 Pod 的详细详细
[root@k8s-master01 ~]# kubectl describe pod readiness-httpget -n test ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 5m11s default-scheduler Successfully assigned test/readiness-httpget to k8s-node01 Normal Pulled 5m10s kubelet Container image "hub.test.com/library/mynginx:v1" already present on machine Normal Created 5m10s kubelet Created container readiness-httpget-container Normal Started 5m10s kubelet Started container readiness-httpget-container Warning Unhealthy 8s (x100 over 5m5s) kubelet Readiness probe failed: HTT 1044 P probe failed with statuscode: 404
提示就绪检测找不到该页面,返回状态码 404。
接下来进入该容器手动创建
index1.html页面
[root@k8s-master01 ~]# kubectl exec readiness-httpget -n test -it -- /bin/bash root@readiness-httpget:/# cd /usr/share/nginx/html/ root@readiness-httpget:/usr/share/nginx/html# ls 50x.html index.html root@readiness-httpget:/usr/share/nginx/html# touch index1.html root@readiness-httpget:/usr/share/nginx/html# exit
再次查看 Pod 状态已经就绪状态了
2.2 存活探针 - exec
liveness-exec.yaml文件如下:
apiVersion: v1 kind: Pod metadata: name: liveness-exec # Pod 名称 namespace: test # Pod 所在的命名空间 spec: containers: - name: liveness-exec-container # 容器名称 image: hub.test.com/library/busybox:latest # 镜像地址 imagePullPolicy: IfNotPresent # 镜像下载策略 command: ["/bin/sh","-c","touch /tmp/live; sleep 60; rm -rf /tmp/live; sleep 3600"] # 创建 live 文件,休眠60秒,删除 live 文件,再休眠 1 分钟。 livenessProbe: # 存活探测 exec: # 检测方案 command: ["test","-e","/tmp/live"] # 检测该文件是否存在,返回值 0 成功,非 0 失败 initialDelaySeconds: 3 # 启动后多少秒开始第一次检测 periodSeconds: 3 # 每次间隔检测时间
创建 Pod
[root@k8s-master01 ~]# kubectl create -f liveness-exec.yaml pod/liveness-exec created
查看 Pod 状态,加上
-w实时查看
[root@k8s-master01 ~]# kubectl get pod -n test -w
从上图可以看到 RESTARTS 已经重启一次了,它会循环重启,因为重新创建 Pod 到时候 /tmp/live 就会被创建,但是 60 秒后又被删除。
2.3 存活探针 - HTTPGet
liveness-httpgat.yaml文件如下:
apiVersion: v1 kind: Pod metadata: name: liveness-httpgat # Pod 名称 namespace: test # Pod 所在的命名空间 spec: containers: - name: liveness-httpgat-container # 容器名称 image: hub.test.com/library/mynginx:v1 # 镜像地址 imagePullPolicy: IfNotPresent # 镜像下载策略 ports: - name: http containerPort: 80 livenessProbe: # 存活探测 httpGet: # 检测方案 port: http path: /index.html initialDelaySeconds: 3 # 启动后多少秒开始第一次检测 periodSeconds: 3 # 每次间隔检测时间 timeoutSeconds: 10 # 探测的超时时间
创建 Pod
[root@k8s-master01 ~]# kubectl create -f liveness-httpget.yaml pod/liveness-httpgat created
查看 Pod 状态,此时是正常的
[root@k8s-master01 ~]# kubectl get pod -n test NAME READY STATUS RESTARTS AGE hpa-nginx-deploy-9f8676f85-5fk6c 1/1 Running 0 12m liveness-httpgat 1/1 Running 0 30s
现在将
nginx容器里面的 index.html 文件给删除
[root@k8s-master01 ~]# kubectl exec liveness-httpgat -n test -it -- rm -rf /usr/share/nginx/html/index.html
重启次数变为 1 ,由于
liveness没有检测到 index.html 文件,则会删掉主容器,主容器一旦被删除 Pod 也会进行重启。
2.4 存活探针 - TCP
liveness-tcp.yaml文件如下:
apiVersion: v1 kind: Pod metadata: name: liveness-tcp # Pod 名称 namespace: test # Pod 所在的命名空间 spec: containers: - name: liveness-tcp-container # 容器名称 image: hub.test.com/library/mynginx:v1 # 镜像地址 imagePullPolicy: IfNotPresent # 镜像下载策略 livenessProbe: # 存活探测 tcpSocket: # 检测方案 port: 8080 # 检测端口 initialDelaySeconds: 3 # 启动后多少秒开始第一次检测 periodSeconds: 3 # 每次间隔检测时间
创建 Pod
[root@k8s-master01 ~]# kubectl create -f liveness-tcp.yaml pod/liveness-tcp created
查看 Pod 状态,此时由于
nginx端口为 80,所以检测不到 8080 端口,会一直重启。
2.5 就绪探针+存活探针 - HTTPGet
live-readi-httpgat.yaml文件如下:
apiVersion: v1 kind: Pod metadata: name: live-readi-httpgat # Pod 名称 namespace: test # Pod 所在的命名空间 spec: containers: - name: live-readi-httpgat-container # 容器名称 image: hub.test.com/library/mynginx:v1 # 镜像地址 imagePullPolicy: IfNotPresent # 镜像下载策略 ports: - name: http containerPort: 80 # 容器端口 readinessProbe: # 就绪探测 httpGet: # 检测方案 path: /index1.html # 检测路径 port: 80 # 检测端口 initialDelaySeconds: 3 periodSeconds: 3 livenessProbe: # 存活探测 httpGet: # 检测方案 port: http # 检测协议 path: /index.html # 检测路径 initialDelaySeconds: 3 # 启动后多少秒开始第一次检测 periodSeconds: 3 # 每次间隔检测时间 timeoutSeconds: 10 # 探测的超时时间
创建 Pod
[root@k8s-master01 ~]# kubectl create -f live-read-httpget.yaml pod/live-readi-httpgat created
查看 Pod 状态
虽然是 Running 状态,但是还没 Read,因为就绪探针没有检测到
index1.html这个文件存在。
进入容器手动创建测试
[root@k8s-master01 ~]# kubectl exec live-readi-httpgat -n test -it -- /bin/bash root@live-readi-httpgat:/# cd /usr/share/nginx/html/ root@live-readi-httpgat:/usr/share/nginx/html# touch index1.html
再次查看 Pod 状态,现在已经
就绪状态
我们再测试
liveness探针,删除 index.html 文件
[root@k8s-master01 ~]# kubectl exec live-readi-httpgat -n test -it -- rm -rf /usr/share/nginx/html/index.html
可以看到 Pod 重启 1 次,又回到未就绪状态了,因为重启完后默认是没有
index1.html文件的
三、配置补充
使用启动探测器保护慢启动容器
有时候,会有一些现有的应用程序在启动时需要较多的初始化时间。 要不影响对引起探测死锁的快速响应,这种情况下,设置存活探测参数是要技巧的。 技巧就是使用一个命令来设置启动探测,针对HTTP 或者 TCP 检测,可以通过设置
failureThreshold * periodSeconds参数来保证有足够长的时间应对糟糕情况下的启动时间。
实例:
startupProbe: httpGet: path: /test port: liveness-port failureThreshold: 30 periodSeconds: 10
应用程序可以有最多 5 分钟(30 * 10 = 300s) 的时间来完成它的启动。
还有很多配置字段,可以使用这些字段精确的控制存活和就绪检测的行为:
initialDelaySeconds
:容器启动后要等待多少秒后存活和就绪探测器才被初始化,默认是 0 秒,最小值是 0。periodSeconds
:执行探测的时间间隔(单位是秒)。默认是 10 秒。最小值是 1。timeoutSeconds
:探测的超时后等待多少秒。默认值是 1 秒。最小值是 1。successThreshold
:探测器在失败后,被视为成功的最 1044 小连续成功数。默认值是 1。 存活和启动探测的这个值必须是 1。最小值是 1。failureThreshold
:当探测失败时,Kubernetes 的重试次数。 存活探测情况下的放弃就意味着重新启动容器。 就绪探测情况下的放弃 Pod 会被打上未就绪的标签。默认值是 3。最小值是 1。
- Kubernetes存活探针和就绪探针的最佳实践
- JMeter压力测试案例大全 之(邮件服务器测试和元件介绍)
- k8s实践16:kubernetes监测探针简单测试
- Kubernetes 源码编译以及源码基于libvirt/kvm的coreos集群测试介绍
- JMeter压力测试案例大全 之(邮件服务器测试和元件介绍)
- Linux下四款Web服务器压力测试工具介绍(http_load、webbench、ab、siege)
- 广州软件测试交流会第六次沙龙案例分析总结[转载]
- Linux下四款Web服务器压力测试工具(http_load、webbench、ab、siege)介绍
- 第93讲(HelloActor整体介绍):Akka第一个案例动手实战开发消息实体类
- Nginx应用案例分享:压力测试
- 软件测试之 Monkey 的简单使用、参数类型介绍及参数的综合应用
- dubbo介绍及其使用案例
- Linux下四款Web服务器压力测试工具(http_load、webbench、ab、siege)介绍
- jsp基础及详细介绍(附带案例代码)
- monkey压力测试介绍
- 测试一下,顺便提一个MDA案例
- opengl es2.0 入门教程推荐(正方体,案例解说,Shader介绍,纹理贴图)
- selenium+ant+testng测试框架简单介绍
- 软件功能测试工具介绍
- 浏览器兼容性测试工具介绍