在Pod上線階段,需要確保Pod在接收流量之前真正達到可服務狀態,您可以通過配置ReadinessGate來保證Pod上線階段的可用性。ALB Ingress Controller支持啟用ReadinessGate功能,持續監控ACK集群Pod的狀態,等待Pod狀態變為可用狀態后再將完全啟動的Pod掛載到后端服務器組,并向該Pod轉發流量。
前提條件
已創建ACK托管集群或ACK Serverless集群。具體操作,請參見創建集群、創建Kubernetes托管版集群。
已為集群安裝ALB Ingress Controller組件。具體操作,請參見管理ALB Ingress Controller組件。
說明若需要在ACK專有集群中通過ALB Ingress訪問服務,在部署服務前需要為ALB Ingress Controller授權。具體操作,請參見為ACK專有集群授予ALB Ingress Controller訪問權限。
已通過kubectl工具連接集群。具體操作,請參見獲取集群KubeConfig并通過kubectl工具連接集群。
原理解析
K8s可以通過三類可用性探針,包括存活(LivenessProbe)、就緒(ReadinessProbe)、啟動(StartupProbe),來檢查Pod的健康狀態、服務可用性和啟用條件,提高應用的可用性。您可以通過HTTP請求、TCP Socket連接或命令行方式配置這三類探針,設置執行探測的頻率、超時時間、健康閾值和不健康閾值等參數。更多信息,請參見配置存活/就緒和啟動探針。
探針種類 | 作用 |
存活探針(LivenessProbe) | 用于判斷容器是否存活,如果LivenessProbe探針探測到容器不健康,kubelet將kill掉該容器,并根據容器的重啟策略做相應的處理。如果一個容器不包含LivenessProbe探針,那么kubelet認為該容器的LivenessProbe探針返回的值永遠是Success,即容器存活。 |
就緒探針(ReadinessProbe) | 用于判斷容器服務是否可用,達到Ready狀態的Pod才可以接收請求。Service與Endpoint的關聯關系也根據Pod的Ready狀態設置:
|
啟動探針(StartupProbe) | 用于判斷容器何時開始啟動,可以控制容器在啟動成功后再進行存活性和就緒性檢查。可以使用該探針對慢啟動容器進行存活性檢測,避免它們在啟動運行之前被kill掉。 |
可用性探針模式下,Pod的Ready狀態僅由kubelet根據容器狀態判斷。然而,對于復雜應用程序來說,往往需要更精細地控制容器內服務的可用性,需要具備控制Pod的Ready狀態的能力。
通過ReadinessGate機制,您可以設置一個或多個自定義的Pod可用性探測來判斷Pod是否可用。新增的自定義Condition狀態將由外部Controller控制器設置,K8s將在判斷全部ReadinessGate條件都為true時,才將Pod設置為服務可用狀態。
ALB Ingress Controller支持配置ReadinessGate,使ACK集群持續監控Pod狀態,直到狀態為可用狀態才認為Pod已經啟動并掛載至后端服務器組上,并將流量轉發至該Pod節點。
在Deployment中配置ReadinessGate自定義Condition:target-health.alb.k8s.alibabacloud
后,ACK集群持續監控Pod狀態。當ALB Ingress Controller將Pod成功添加到ALB后端服務器組后,集群才標記Pod狀態可用并向Pod轉發流量。
操作步驟
創建tea-service.yaml,配置ReadinessGate自定義Condition。
創建tea-service.yaml文件并拷貝以下內容到文件中,用于部署名稱為
tea
的Deployment以及名稱為tea-svc
的Service。在Deployment中配置ReadinessGate自定義Condition:target-health.alb.k8s.alibabacloud
,使ACK集群持續監控Pod的狀態,直到狀態為可用狀態才認為Pod已經啟動并掛載到后端服務器組上。apiVersion: apps/v1 kind: Deployment metadata: name: tea spec: replicas: 3 selector: matchLabels: app: tea template: metadata: labels: app: tea spec: containers: - name: tea image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest ports: - containerPort: 80 # 配置readinessGate readinessGates: - conditionType: target-health.alb.k8s.alibabacloud --- apiVersion: v1 kind: Service metadata: name: tea-svc spec: ports: - port: 80 targetPort: 80 protocol: TCP selector: app: tea type: NodePort
執行以下命令,部署Deployment和Service。
kubectl apply -f tea-service.yaml
執行以下命令,檢查ReadinessGate配置是否生效。
kubectl get pods -o yaml |grep 'target-health'
預期輸出:
-conditionType:target-health.alb.k8s.alibabacloud message:correspondingconditionofpodreadinessgate"target-health.alb.k8s.alibabacLoud"
相關文檔
關于如何在ACK集群中通過ALB Ingress訪問服務,請參見ALB Ingress快速入門。
ALB Ingress對集群服務(Service)中外部可訪問的API對象進行管理,提供七層負載均衡能力。更多用法,請參見ALB Ingress服務高級用法。
在使用ALB Ingress過程中遇到問題,請參見ALB Ingress異常問題排查、ALB Ingress FAQ自助排查問題。