我有一个k8s集群。我们的服务是基于队列的。我们的 pod 订阅事件队列,获取事件并执行任务。那么对于这类服务,如何定义k8s活体探测和就绪探测呢?
假设您的问题是因为处理工作线程消耗队列消息,它不会公开任何要检查的端口。
在这种情况下,您可以定义livenessProbe
并readinessProbe
自定义命令,接下来是文档中的示例:
apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: k8s.gcr.io/busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
readinessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
另外,请记住您的进程上线并准备好调整initialDelaySeconds
所需的时间,periodSeconds
在 Pod 完全停滞之前不要杀死它。
以下是对这些探针的非常简短的介绍:
Liveliness Probe是为了让 Kubernetes 知道工作负载是否健康。它可以是在容器中执行的 shell 命令,也可以是应该积极响应的简单 tcp/http 请求。
如果在 pod 配置中指定的一段时间后,实时性检查失败,Kubrenetes 将重新启动工作负载。
因此,如果您的工作负载正在执行耗时的过程,您可能需要给实时探测足够的时间,以确保您的 Pod 不会过度重新启动。
Rediness Probe用于 Kubernetes 代理确定您的工作负载是否已准备好消耗流量。仅当 rediness 探测响应积极时,流量才会发送到您的 pod。因此,如果您的工作负载需要更多时间处理单个请求,并且需要在此期间将其他请求转移到其他副本以进行快速处理,则可能需要为工作负载提供稍高的 rediness 间隔。
这些探测参数与副本数相结合,可以确保应用程序的快速健康运行。了解每个探头覆盖的区域以及可以调谐它们的参数非常重要。
以下是一些阅读:
https://blog.colinbreck.com/kubernetes-liveness-and-readiness-probes-how-to-avoid-shooting-yourself-in-the-foot/
https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/