# 通过ELB健康检查设置Pod就绪状态
在Pod执行滚动更新过程中，可能出现Pod自身更新完成但负载均衡器后端服务器组未更新完成的情况，出现短暂的访问中断问题。为解决上述问题，CCE支持配置Pod的就绪状态与挂载到ELB后端的健康检查联动，在健康检查成功后，再将Pod置为就绪。与Pod的strategy.rollingUpdate.maxSurge和strategy.rollingUpdate.maxUnavailable参数配合，可实现负载的优雅滚动升级。
#### 工作原理
当Service采用LoadBalancer类型对接ELB时， 如果Service对接的Pod发生滚动更新，由于Pod启动速度通常快于与负载均衡后端配置更新速度，新Pod已就绪、旧Pod已终止但ELB还未将新Pod加入后端，部分请求可能会继续流向已终止的Pod，出现短暂的访问失败。
ReadinessGates是Kubernetes为Pod提供的扩展就绪性检查机制，允许设置自定义条件满足时，Pod才会被标记为Ready，并开始正式接收流量。
当Pod配置*readinessGates*字段后，Pod就绪的校验流程如下：
1. kubelet首先完成容器层面的就绪性判定，kubelet在容器启动后判定 "就绪"，即ContainersReady=True，但此时Pod仍不可用，会继续其他自定义ReadinessGates校验。
2. 根据Pod配置的*readinessGates*字段中指定的Service，检测该Service的健康检查状态，只有健康检查成功，才会进行下一步。
3. kubelet确认ELB健康检查的ReadinessGates条件为True后，才会将Pod的最终Ready状态设置为True。Pod才被视为就绪，同时进行下一步终止旧Pod完成滚动升级。
 
#### 约束与限制
- 该特性从以下版本开始支持：
  - v1.19集群：v1.19.16-r5及以上版本
  
  - v1.21集群：v1.21.8-r0及以上版本
  
  - v1.23集群：v1.23.6-r0及以上版本
  
  - v1.25集群：v1.25.2-r0及以上版本
  
  - v1.25以上版本集群
   
- 该功能只支持直通场景，即CCE Turbo集群中使用独享型ELB的场景。
- 该功能需在Pod中配置特定的readinessGates字段，指定标签target-health.elb.k8s.cce/{serviceName}，其中{serviceName}为服务名称。
- Pod就绪状态只在最初对接ELB后端时生效，后续健康检查状态不再影响Pod就绪状态。
 
#### 通过ELB健康检查设置Pod就绪状态
使用Pod ReadinessGates方式如下：
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 在左侧导航栏中选择"工作负载"，在右上角单击"YAML创建"。 
   YAML内容如下：
   ```
   kind: Deployment
   apiVersion: apps/v1
   metadata:
     name: nginx
     namespace: default
     labels:
       version: v1
   spec:
     replicas: 1
     selector:
       matchLabels:
         app: nginx
         version: v1
     template:
       metadata:
         labels:
           app: nginx
           version: v1
       spec:
         containers:
           - name: container-1
             image: nginx:latest
         imagePullSecrets:
           - name: default-secret
         readinessGates:
           - conditionType: target-health.elb.k8s.cce/specific-service-name  # 指定ServiceName。
     strategy:
       type: RollingUpdate
       rollingUpdate:
         maxUnavailable: 25%           # 配合以下两个参数，可以控制ELB后端个数，实现优雅滚动升级。
         maxSurge: 25%
   ```
   
   
3. 单击"确定"创建工作负载后，查看工作负载状态，负载处于未就绪状态，Pod处于实例异常状态。 
   事件提示如下：
   ```
   实例未就绪：corresponding condition of pod readiness gate "target-health.elb.k8s.cce/specific-service-name" does not exist.
   ```
   
   
4. 在左侧导航栏中选择"服务"，在右上角单击"创建服务"，并进行以下配置。 
   - Service名称：需要与Pod中readinessGates字段设置的名称一致。
   
   - 访问类型：选择负载均衡型Service。
   
   - 选择器：单击"引用负载标签"，选择上一步中创建的工作负载并单击"确定"。
   
   - 负载均衡器：必须使用独享型ELB，您可以选择已有的ELB或自动创建新的ELB。
   
   - 健康检查：开启健康检查（不开启则默认为健康检查成功）。
   
   
   图1负载均衡配置   
   ![](https://support.huaweicloud.com/usermanual-cce/zh-cn_image_0000001698180605.png "点击放大")
   
   
5. 前往ELB控制台，查看对应的后端服务器组，健康检查状态正常。
6. 在CCE控制台中查看工作负载状态处于"运行中"。
 
