# 后端服务器组配置（poolConfig）
在ELB Gateway模式下，系统通过PoolConfiguration（简称poolConfig）来配置和调整后端服务器组的相关参数。
#### 前提条件
集群版本已支持ELB Gateway功能。
#### 关联机制
创建HTTPRoute与Service时，系统支持两种关联poolConfig的方式：
- **自动创建（推荐）**：先创建HTTPRoute和Service，系统会自动生成对应的poolConfig资源。后续可直接修改该资源来调整后端服务器组参数。
- **按需预创建**：提前手动创建poolConfig并绑定目标Service，随后创建HTTPRoute时，系统将直接基于该poolConfig的参数配置生成后端服务器组。
 
#### 操作指南
#### 方式一：修改已有PoolConfiguration
对于系统自动创建或已存在的poolConfig，可以通过以下步骤查找并修改。
1. **创建Gateway资源。**
   
   ```
   apiVersion: gateway.networking.k8s.io/v1
   kind: Gateway                      # 资源类型为 Gateway
   metadata:
     name: cce-gateway              # Gateway 名称
     namespace: default
   spec:
     gatewayClassName: cce-shared-internal  # GatewayClass 名称
     listeners:
       - name: http              #监听器名称
         protocol: HTTP               # 协议
         port: 80                     # 监听端口
   ```
   
   
2. **创建关联Service的HTTPRoute资源。**
   
   ```
   apiVersion: gateway.networking.k8s.io/v1
   kind: HTTPRoute                # 资源类型为 HTTPRoute
   metadata:
     name: backend                # HTTPRoute 名称
     namespace: default
   spec:
     parentRefs:
       - group: gateway.networking.k8s.io
         kind: Gateway
         name: cce-gateway
     hostnames:
       - "www.example.com"    #域名
     rules:
       - backendRefs:
           - group: ""
             kind: Service
             name: backend        # 已创建的 Service
             port: 3000           # Service 的端口
             weight: 1
         matches:
           - path:
               type: PathPrefix   # 前缀匹配
               value: /
   ```
   
   
3. **查询Service关联的poolConfig名称：**
   
   ```
   kubectl get poolconfig -n <namespace> -l gateway.cce.io/service-name=<serviceName>
   ```
   参数说明：
   - \<namespace\>：目标Service所在的命名空间。
   
   - \<serviceName\>：目标Service的名称。
   
   
   示例：
   ```
   kubectl get poolconfig -n default -l gateway.cce.io/service-name=backend
   ```
   预期输出如下：
   ```
   NAME            TARGET    PORT   ACCEPTED   AGE
   backend-95qcg   backend   3000   True       2m10s
   ```
   
   
4. **编辑对应的poolConfig资源更新后端服务器组参数：**
   
   ```
   kubectl edit poolconfig backend-95qcg -n default
   ```
   
   
 
 #### 方式二：手动预创建PoolConfiguration
1. **预先创建PoolConfiguration：通过spec.targetRef指定要绑定的Service。**
   
   ```
   apiVersion: gateway.cce.io/v1alpha1
   kind: PoolConfiguration
   metadata:
     name: poolconfig-default
     namespace: default
   spec:
     targetRef:
       group: ""
       kind: Service
       name: backend   #已有Service名称
     defaultConfig:
       lbAlgorithm: ROUND_ROBIN
       poolProtocol: HTTP
       sessionAffinity:
         type: HTTP_COOKIE
         cookieTimeout: 1440
       healthCheck:
         enable: true
         protocol: HTTP
         urlPath: "/healthz"
         delay: 5
         timeout: 10
         maxRetries: 3
         expectedCodes: "200-399"
         monitorPort: 8080
   ```
   
   
2. **创建Gateway资源。**
   
   ```
   apiVersion: gateway.networking.k8s.io/v1
   kind: Gateway                      # 资源类型为 Gateway
   metadata:
     name: cce-gateway              # Gateway 名称
     namespace: default
   spec:
     gatewayClassName: cce-shared-internal  # GatewayClass 名称
     listeners:
       - name: http              #监听器名称
         protocol: HTTP               # 协议
         port: 80                     # 监听端口
   ```
   
   
3. **创建HTTPRoute资源：关联已绑定poolConfig的Service。系统会自动读取该poolConfig并创建对应的ELB后端服务器组。**
   
   ```
   apiVersion: gateway.networking.k8s.io/v1
   kind: HTTPRoute                # 资源类型为 HTTPRoute
   metadata:
     name: backend                # HTTPRoute 名称
     namespace: default
   spec:
     parentRefs:
       - group: gateway.networking.k8s.io
         kind: Gateway
         name: cce-gateway
     hostnames:
       - "www.example.com"    #域名
     rules:
       - backendRefs:
           - group: ""
             kind: Service
             name: backend        # 已创建的 Service
             port: 3000           # Service 的端口
             weight: 1
         matches:
           - path:
               type: PathPrefix   # 前缀匹配
               value: /
   ```
   
   
 
#### poolConfig配置指导
 #### 健康检查
- **设置健康检查的默认配置**
  通过defaultConfig.healthCheck为Service的所有端口设置统一的健康检查默认配置：
  ```
  apiVersion: gateway.cce.io/v1alpha1
  kind: PoolConfiguration
  metadata:
    name: poolconfig-default
    namespace: default
  spec:
    targetRef:
      group: ""
      kind: Service
      name: backend
    defaultConfig:
      healthCheck:     #健康检查
        enable: true
        protocol: HTTP
        urlPath: "/healthz"
        delay: 5
        timeout: 10
        maxRetries: 3
        expectedCodes: "200-399"
        monitorPort: 8080
  ```
  
- **不同端口的健康检查配置**
  通过ports为不同端口设置各自的健康检查配置，覆盖defaultConfig中的默认值：
  ```
  apiVersion: gateway.cce.io/v1alpha1
  kind: PoolConfiguration
  metadata:
    name: poolconfig-default
    namespace: default
  spec:
    targetRef:
      group: ""
      kind: Service
      name: backend   #已有Service名称
    defaultConfig:
      healthCheck:     #健康检查
        enable: true
        protocol: HTTP
        urlPath: "/healthz"
        delay: 5
        timeout: 10
        maxRetries: 3
        expectedCodes: "200-399"
        monitorPort: 8080
      slowStart:
        enable: false
    ports:
      - port: 8080          #8080端口的后端服务器组配置
        config:
          lbAlgorithm: LEAST_CONNECTIONS
          healthCheck:
            enable: true
            protocol: TCP
            delay: 3
            timeout: 5
            maxRetries: 2
      - port: 80         #80端口的后端服务器组配置
        config:
          lbAlgorithm: LEAST_CONNECTIONS
          healthCheck:
            enable: true
            protocol: TCP
            delay: 3
            timeout: 10
            maxRetries: 2
    reclaimPolicy: DeleteWhenOrphaned
  ```
  
 
 #### 配置慢启动持续时间
```
apiVersion: gateway.cce.io/v1alpha1
kind: PoolConfiguration
metadata:
  name: poolconfig-default
  namespace: default
spec:
  targetRef:
    group: ""
    kind: Service
    name: backend
  defaultConfig:
    lbAlgorithm: ROUND_ROBIN    #配置后端服务器组的负载均衡算法：加权轮询
    poolProtocol: HTTP            #后端协议
    slowStart:
      enable: true    #开启慢启动
      duration: 30    #慢启动持续时间
  reclaimPolicy: DeleteWhenOrphaned
```
 #### 会话保持
```
apiVersion: gateway.cce.io/v1alpha1
kind: PoolConfiguration
metadata:
  name: poolconfig-default
  namespace: default
spec:
  targetRef:
    group: ""
    kind: Service
    name: backend
  defaultConfig:
    lbAlgorithm: ROUND_ROBIN
    poolProtocol: HTTP
    sessionAffinity:         #会话保持
      type: HTTP_COOKIE           #开启HTTP_COOKIE类型的会话保持
      cookieTimeout: 60    #会话保持超时时间
  reclaimPolicy: DeleteWhenOrphaned
```
#### Service多端口开启不同的健康检查
```
apiVersion: gateway.cce.io/v1alpha1
kind: PoolConfiguration
metadata:
  name: poolconfig-default
  namespace: default
spec:
  targetRef:
    group: ""
    kind: Service
    name: backend   #已有Service名称
  defaultConfig:
    lbAlgorithm: ROUND_ROBIN
    poolProtocol: HTTP
    sessionAffinity:
      type: HTTP_COOKIE
      cookieTimeout: 1440
    ipTargetEnable: false
    slowStart:
      enable: false
  ports:
    - port: 8080
      config:
        lbAlgorithm: LEAST_CONNECTIONS
        healthCheck:
          enable: true
          protocol: TCP
          delay: 3
          timeout: 5
          maxRetries: 2
    - port: 80
      config:
        lbAlgorithm: LEAST_CONNECTIONS
        healthCheck:
          enable: true
          protocol: TCP
          delay: 3
          timeout: 10
          maxRetries: 2
  reclaimPolicy: DeleteWhenOrphaned
```
#### PoolConfiguration配置参数说明
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/caution_3.0-zh-cn.png)
非必填或无默认值的字段，若不填/未指定（即null或省略该字段），系统均默认为保持已有配置不变，实际状态以ELB侧现有配置为准。只有显式传入新值（如传入空列表 \[\] 进行清空）时才会触发更新。
表1poolConfig Spec 
| 参数             | 是否必填 | 参数类型                                                             | 描述                                                                                                                                                                                                                                                                                                               |
|:---|:---|:---|:---|
| targetRef   | 是    | [PolicyTargetRef] object      | 关联的Service引用（1:1关系，一个Service至多一个PoolConfiguration）。                                                                                                                                                                                                                                                             |
| defaultConfig | 否      | [PoolConfig] object           | 所有端口的基础池配置。                                                                                                                                                                                                                                                                                                      |
| ports         | 否       | Array of [PortOverride] objects | 特定端口的配置覆盖列表，详情请参见[不同端口的健康检查配置]。                                                                                                                                                                                                                                                  |
| reclaimPolicy  | 否      | String                                                       | 当关联的目标资源（如Service）被删除时poolconfig的回收策略。无论选择哪种策略，绑定的底层云资源都将被释放。 - **Retain**：保留poolconfig资源本身，后续需显式手动删除。  - **DeleteWhenOrphaned**（默认）：自动级联删除poolconfig资源。   |
   
 表2PolicyTargetRef 
| 参数   | 是否必填 | 参数类型   | 描述                                                                   |
|:---|:---|:---|:---|
| group | 是     | String | 目标资源API Group。                                                        |
| kind | 是     | String  | 目标资源Kind，如Gateway（ListenerConfiguration）或Service（PoolConfiguration）。 |
| name | 是      | String   | 目标资源名称。                                                               |
   
 表3PoolConfig（defaultConfig和PortOverride.config共用） 
| 参数             | 是否必填 | 参数类型                                                    | 描述                                                                                                                                                                                                                                                                                                                                                                                                          |
|:---|:---|:---|:---|
| lbAlgorithm    | 否  | String                                                 | 负载均衡算法，取值ROUND_ROBIN、LEAST_CONNECTIONS、SOURCE_IP，默认 ROUND_ROBIN，详情请参见[会话保持]。 - ROUND_ROBIN：加权轮询算法。  - LEAST_CONNECTIONS：加权最少连接算法。  - SOURCE_IP：源IP算法。   |
| poolProtocol   | 否   | String                                                 | 后端服务协议，取值HTTP、HTTPS，默认HTTP，详情请参见[会话保持]。 - 仅独享型ELB支持该特性。  - 修改后仅对新创建的后端服务组生效。如果需要设置后端协议可以预创建poolconfig，详情请参见[方式二：手动预创建PoolConfiguration]。                                             |
| ipTargetEnable   | 否     | Boolean                                                  | 表示为ELB配置IP类型的后端，启用后该Service/Ingress添加的后端地址均为VPC子网内的IP。其中CCE Turbo集群的后端为\<Pod IP\>:\<targetPort\>，CCE Standard集群的后端为\<节点IP\>:\<NodePort\>。 注意： - 仅独享型ELB支持该特性。  - ELB也需要同步开启IP类型的后端。                                                           |
| sessionAffinity | 否      | [SessionAffinity] object | 会话保持配置，nil表示无会话保持；SOURCE_IP算法不能与会话保持组合，详情请参见[会话保持]。                                                                                                                                                                                                                                                                                                                   |
| slowStart        | 否     | [SlowStart] object      | 慢启动配置，不配置时表示禁用；仅HTTP/HTTPS/GRPC + ROUND_ROBIN + 无会话保持时生效，仅独享型ELB支持，详情请参见[配置慢启动持续时间]。                                                                                                                                                                                                                                                                                    |
| healthCheck      | 否    | [HealthCheck] object    | 健康检查配置，不设置时表示不开启健康检查，详情请参见[健康检查]。                                                                                                                                                                                                                                                                                                                                        |
   
 表4SessionAffinity 
| 参数           | 是否必填 | 参数类型   | 描述                                          |
|:---|:---|:---|:---|
| type         | 是   | String  | 会话保持类型，取值HTTP_COOKIE、APP_COOKIE。           |
| cookieName  | 否   | String | APP_COOKIE模式的Cookie名称，type=APP_COOKIE时必填。 |
| cookieTimeout | 否  | Integer | HTTP_COOKIE模式持久化超时，单位分钟，范围1-1440，默认1440。  |
   
 表5SlowStart 
| 参数         | 是否必填 | 参数类型      | 描述                       |
|:---|:---|:---|:---|
| enable    | 是    | Boolean  | 是否启用慢启动。                 |
| duration | 否   | Integer | 慢启动持续时间，单位秒，范围30-1200，默认30。 |
   
 表6HealthCheck 
| 参数             | 是否必填 | 参数类型     | 描述                                               |
|:---|:---|:---|:---|
| enable         | 是    | Boolean  | 是否启用健康检查。                                         |
| protocol       | 否   | String    | 健康检查协议，取值TCP、HTTP、HTTPS、GRPC、TLS，默认HTTP。             |
| urlPath        | 否    | String     | 健康检查URL路径，默认 /，仅protocol=HTTP/HTTPS适用。             |
| delay           | 否    | Integer  | 健康检查间隔，单位秒，范围1-50，默认5。                             |
| timeout         | 否   | Integer    | 健康检查超时，单位秒，范围1-50，默认10。                            |
| maxRetries      | 否     | Integer | 连续失败次数上限，范围1-10，默认3。                              |
| expectedCodes | 否   | String    | 期望状态码范围，HTTP如200-399，gRPC如0-99，仅HTTP/HTTPS/GRPC适用。 |
| monitorPort   | 否     | Integer   | 健康检查端口，nil用Service端口，范围1-65535。                     |
   
 表7PortOverride（用于ports列表项） 
| 参数       | 是否必填 | 参数类型                                                 | 描述                                                            |
|:---|:---|:---|:---|
| port   | 是    | Integer                                              | 端口号。                                                           |
| config | 否     | [PoolConfig] object | 该端口的覆盖配置，类型定义见[PoolConfig]。 |
   
