設定探測¶
Knative 探測的一般理解¶
請務必注意,Knative 探測與 Kubernetes 探測不同。其中一個原因是 Knative 試圖盡量減少冷啟動時間,因此探測間隔比 Kubernetes 高得多。
一般探測架構如下
- 使用者可以選擇性地在
KnativeService
CR 中定義就緒/存活和/或啟動探測。 - 存活和啟動探測由 Kubelet 直接對應容器執行。
- 另一方面,就緒探測由 Knative 重寫,以便由 Queue-Proxy 容器執行。
- Knative 會從多個地方進行探測(例如 Activator、net-* 控制器,以及 Queue-Proxy),以確保整個網路堆疊已設定且已就緒。與 vanilla Kubernetes 相比,Knative 使用更快的(稱為積極探測)探測間隔,以縮短當 Pod 已經啟動並執行,但 Kubernetes 本身尚未反映該就緒狀態時的冷啟動時間。
- 當使用者未定義探測時,Knative 會為主要使用者容器定義預設的就緒探測。它將檢查 Knative 服務的流量連接埠上的 TCP Socket。
- Knative 也會為 Queue-Proxy 容器本身定義就緒探測。Queue-Proxy 的健康端點會彙總來自所有使用者容器(主要 + sidecars)的重寫就緒探測的所有結果。對於彙總狀態,Queue-Proxy 將平行呼叫每個容器的就緒探測,等待其回應(或逾時),並將彙總結果回報給 Kubernetes。
一旦 Queue-Proxy 探測傳回成功回應,且 Knative 網路層重新設定完成,Knative 會將 Pod 視為健康且已準備好服務流量。
注意
請記住,Knative 可能會將您的 Pod 視為健康且已就緒,而 Kubernetes 仍然認為它不是,反之亦然。Deployment
和 Pod
狀態不會反映 Knative
中的狀態。若要完整檢查 Knative 所看到的狀態,您必須檢查 Knative 物件階層上的所有條件(例如 Service
、Configuration
、Revision
、PodAutoscaler
、ServerlessService
、Route
、Ingress
)。
設定自訂探測¶
注意
如果您在 Knative 服務中使用多個容器,請務必啟用多容器探測。
您可以在 Knative 服務中定義就緒和存活探測,方式與在 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 服務應初始啟動(或部署)為止。這稱為進度期限。使用啟動探測時,使用者必須確保進度期限設定為高於啟動探測可採取的最長時間的值。請考慮您針對 initialDelaySeconds
、success/failureThreshold
、periodSeconds
和 timeoutSeconds
的設定。否則,啟動探測可能永遠不會在達到進度期限之前通過,而服務將永遠無法成功啟動。Knative 服務接著會在服務物件的狀態中標示這一點
[
{
"lastTransitionTime": "2024-06-06T09:28:01Z",
"message": "Revision \"runtime-00001\" failed with message: Initial scale was never achieved.",
"reason": "RevisionFailed",
"status": "False",
"type": "ConfigurationsReady"
}
]