【无标题】
官网:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/探针(Probe)用于检测 Pod 中容器的健康状态和生命周期管理。探针可以帮助 Kubernetes确保应用程序在运行中的健康状态,并在需要时采取适当的动作(如重启容器、将流量切
Pod三种探针及四种探针方式
一、简介
官网:https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
探针(Probe)用于检测 Pod 中容器的健康状态和生命周期管理。探针可以帮助 Kubernetes确保应用程序在运行中的健康状态,并在需要时采取适当的动作(如重启容器、将流量切换到健康的容器等)。Kubernetes对Pod的健康状态可以通过三类探针来检查:LivenessProbe、ReadinessProbe及StartupProbe,其中最主要的探针为 LivenessProbe与ReadinessProbe,kubelet会定期执行这两类探针来诊断容器的健康状况。
二、三种探针
- StartupProbe:用于判断容器内应用程序是否已经启动。某些应用会遇到启动比较慢的情况,例如应用程序启动时需要与远程服务器建立网络连接,或者遇到网络访问较慢等情况时,会造成容器启动缓慢, 因为这属于“有且仅有一次”的超长延时,可以通过StartupProbe探针解决该问题。如果配置了startupProbe,就会先禁止其他的探针,直到它成功为止,成功后将不在进行探测。如果探针失败,kubelet则杀死容器,并且按照预先在资源清单中设定的重启策略重启容器。(启动探针)只会在容器启动时进行健康检查,且优先级最高。如果探测成功才会继续执行其他两种方式的探针。启动探针,那么在容器的剩余生命周期中不在执行此探针。
- LivenessProbe:用于探测容器是否运行,如果探测失败,kubelet会根据配置的重启策略进行相应的处理。若没有配置该探针,默认就是success。(存活探针,探针失败;按照预先在资源清单中设定的重启策略重启容器)
- ReadinessProbe:用于判断容器服务是否可用(Ready状态),达到Ready状态的Pod才可以接收请求。并且程序已经是可以接受流量的状态。对于被Service管理的 Pod,Service与Pod Endpoint的关联关系也将基于Pod是否Ready进行设置。如果在运行过程中Ready状态变为False,则系统自动将其从Service 的后端Endpoint列表中隔离出去,后续再把恢复到Ready状态的Pod加回后端Endpoint列表。这样就能保证客户端在访问Service时不会被转发到服务不可用的Pod实例上。需要注意的是,ReadinessProbe也是定期触发执行的,存在于Pod的整个生命周期中。(就绪探针,探针失败不会重启pod)
三、四种探针方式
● ExecAction:在容器内执行一个命令,如果返回值为0,则认为容器健康。
● TCPSocketAction:通过TCP连接检查容器内的端口是否是通的,如果是通的就认为容器健康。
● HTTPGetAction:通过应用程序暴露的API地址来检查程序是否是正常的,如果状态码为200~399之间,则认为容器健康。
● gRPC探针:v1.24版本以后就可以使用内置gRPC探针,但必须先启用 GRPCContainerProbe 特性门控才能配置依赖于 gRPC 的检查机制。
四、使用案例
---
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/hujiaming/nginx:1.24.0
name: nginx
readinessProbe: # 就绪探针,一种探针只能同时使用一种探针方式
httpGet: # URI接口检测方式
path: /index.html # 检查路径
port: 80
scheme: HTTP # HTTP或者HTTPS
initialDelaySeconds: 15 # 初始化时间,健康检查延迟执行时间
timeoutSeconds: 3 # 超时时间
periodSeconds: 15 # 检测间隔
successThreshold: 1 # 检查成功为1次表示就绪
failureThreshold: 2 # 检测失败2次,切断流量,用户请求则不转发到该容器
livenessProbe: # 存活探针,一种探针只能同时使用一种探针方式
tcpSocket: # 端口检测方式
port : 80
initialDelaySeconds: 15 # 初始化时间
timeoutSeconds: 3 # 超时时间
periodSeconds: 15 # 检测间隔
successThreshold: 1 # 检查成功为1次表示存活
failureThreshold: 2 # 检测失败2次则按照重启策略重启容器
command: # 容器启动命令
- sh
- -c
- sleep 60;nginx -g "daemon off;"
restartPolicy: Always
---
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
imagePullPolicy: IfNotPresent
- image: registry.cn-hangzhou.aliyuncs.com/hujiaming/nginx:1.24.0
name: nginx
startupProbe: # 存活探针
tcpSocket: # 探针方式
port: 80 # 探针端口
initialDelaySeconds: 10 #初始化时间,健康检查延迟执行时间(随着程序启动的长久来设定)
timeoutSeconds: 2 # 超时时间
periodSeconds: 10 # 检测间隔
successThreshold: l # 检查成功为1次表示存活
failureThreshold: 2 # 检测失败2次表示未存活
readinessProbe: # 就绪探针,三种检查方式同时只能使用一种。
httpGet: # 接口检测方式
path: /index.html # 检查路径
port: 80 # 检查端口
initialDelaySeconds: 10 # 初始化时间,健康检查延迟执行时间
timeoutSeconds: 2 # 超时时间
periodSeconds: 10 # 检测间隔
successThreshold: 1 #检查成功为1次表示就绪
failureThreshold: 2 #检测失败2次表示未就绪
livenessProbe: # 存活探针
tcpSocket: # 端口检测方式
port: 80
initialDelaySeconds: 10 # 初始化时间
timeoutSeconds: 2 # 超时时间
periodSeconds: 10 # 检测间隔
successThreshold: l # 检查成功为1次表示就绪
failureThreshold: 2 # 检测失败2次表示未就绪
command: # 容器启动执行的命令
- sh
- -c
- sleep 30;nginx -g "daemon off;"
ports: # 容器端口
- containerPort: 80 # 容器端口号
restartPolicy: Always
---
---
apiVersion: v1
kind: Pod
metadata:
name: liveness-grpc
spec:
containers:
- name: etcd
image: registry.cn-hangzhou.aliyuncs.com/google_containers/etcd:3.5.15-0
command: [ "/usr/local/bin/etcd", "--data-dir", "/var/lib/etcd", "--listen-client-urls", "http://0.0.0.0:2379", "--advertise-client-urls", "http://127.0.0.1:2379", "--log-level", "debug"]
ports:
- containerPort: 2379
livenessProbe:
grpc:
port: 2379
initialDelaySeconds: 10 #初始化时间,健康检查延迟执行时间(随着程序启动的长久来设定)
timeoutSeconds: 2 # 超时时间
periodSeconds: 10 # 检测间隔
successThreshold: 1 # 检查成功为1次表示存活
failureThreshold: 2 # 检测失败2次表示未存活
$ kubectl create -f etcd-grpc.yaml
$ kubectl logs -f liveness-grpc
更多推荐



所有评论(0)