使用ReadinessGate实现ALB Ingress后端Pod滚动升级时平滑上线
在Pod上线阶段,需要确保Pod在接收流量之前真正达到可服务状态,您可以通过配置ReadinessGate来保证Pod上线阶段的可用性。ALB Ingress Controller支持启用ReadinessGate功能,持续监控ACS集群Pod的状态,等待Pod状态变为可用状态后再将完全启动的Pod挂载到后端服务器组,并向该Pod转发流量。
前提条件
原理解析
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,使ACS集群持续监控Pod状态,直到状态为可用状态才认为Pod已经启动并挂载至后端服务器组上,并将流量转发至该Pod节点。
在Deployment中配置ReadinessGate自定义Condition:target-health.alb.k8s.alibabacloud
后,ACS集群持续监控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
,使ACS集群持续监控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"