配置探测¶
对 Knative 探测的总体理解¶
值得注意的是,Knative 探测与 Kubernetes 探测不同。其中一个原因是 Knative 试图最小化冷启动时间,因此其探测间隔比 Kubernetes 大得多。
一般的探测架构如下
- 用户可以选择在
KnativeServiceCR 中定义就绪/存活和/或启动探针。 - 存活和启动探针由 Kubelet 直接针对相应的容器执行。
- 而就绪探针则由 Knative 重写,以便由 Queue-Proxy 容器执行。
- Knative 从多个地方(例如 Activator、net-* 控制器和 Queue-Proxy)进行探测,以确保整个网络堆栈已配置并准备就绪。与纯 Kubernetes 相比,Knative 使用更快的(称为激进探测)探测间隔来缩短 Pod 已经启动并运行,而 Kubernetes 本身尚未反映其就绪状态时的冷启动时间。
- 当用户未定义探针时,Knative 将为主要的用户容器定义一个默认的就绪探针。它将检查 Knative Service 流量端口上的 TCP 套接字。
- Knative 还会为 Queue-Proxy 容器本身定义一个就绪探针。Queue-Proxy 的健康端点会聚合其为所有用户容器(主容器 + sidecar)重写的所有就绪探针的结果。对于聚合状态,Queue-Proxy 将并行调用每个容器的就绪探针,等待它们的响应(或超时),并向 Kubernetes 报告聚合结果。
一旦 Queue-Proxy 探针返回成功响应并且 Knative 网络层重新配置完成,Knative 就会认为 Pod 健康并准备好提供流量。
注意
请记住,Knative 可能会认为您的 Pod 健康并准备就绪,而 Kubernetes 仍然认为它没有,反之亦然。Deployment 和 Pod 状态不反映 Knative 中的状态。要完全检查 Knative 看到的状态,您必须检查 Knative 对象层次结构(例如 Service、Configuration、Revision、PodAutoscaler、ServerlessService、Route、Ingress)上的所有条件。
配置自定义探针¶
注意
如果您在 Knative Service 中使用多个容器,请务必启用多容器探测。
您可以在 Knative Service 中定义就绪和存活探针,就像在 Kubernetes 中一样
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: runtime
namespace: default
spec:
template:
spec:
containers:
- name: first-container
image: <your-image>
ports:
- containerPort: 8080
readinessProbe:
httpGet:
port: 8080 # you can also check on a different port than the containerPort (traffic-port)
path: "/health"
livenessProbe:
tcpSocket:
port: 8080
startupProbe:
httpGet:
port: 8080
path: "/"
- name: second-container
image: <your-image>
readinessProbe:
httpGet:
port: 8089
path: "/health"
livenessProbe:
tcpSocket:
port: 8089
startupProbe:
httpGet:
port: 8080
path: "/"
支持的探针类型有
- httpGet
- tcpSocket
- exec
- grpc
注意
请注意,Knative 还会进行一些默认设置(使用 HTTP 检查来检查流量端口的就绪状态)和额外的验证,以使激进探测起作用。
警告
由于 Queue-Proxy 容器不重写或检查定义的存活探针,因此重要的是要知道 Kubernetes 可以在存活探针失败时重新启动特定的容器。请务必将您定义为存活探针的相同检查也包含为就绪探针,以确保 Knative 知道 Pod 中失败的容器。否则,您可能会在存活探针失败导致容器重新启动期间看到连接错误。
进度截止时间和启动探针¶
重要的是要知道 Knative 有一个截止时间,在该截止时间之前 Knative Service 应该初步启动(或回滚)。这称为进度截止时间。使用启动探针时,用户必须确保进度截止时间设置为大于启动探针可能花费的最大时间的值。为此,请考虑您的 initialDelaySeconds、success/failureThreshold、periodSeconds 和 timeoutSeconds 配置。否则,启动探针可能在达到进度截止时间之前永远不会通过,并且服务将永远无法成功启动。Knative Service 将在 Service 对象的 status 中标记此状态
[
{
"lastTransitionTime": "2024-06-06T09:28:01Z",
"message": "Revision \"runtime-00001\" failed with message: Initial scale was never achieved.",
"reason": "RevisionFailed",
"status": "False",
"type": "ConfigurationsReady"
}
]