
# 使用PoolBinding发布应用
#### 应用场景
您在云容器实例CCI服务部署工作负载后，可以通过弹性负载均衡（ELB）服务实现使用公网访问负载实例。CCI提供了PoolBinding对象帮助您自动将部署的容器实例更新至对应的后端服务器组（Pool）后端，您可以在弹性负载均衡（ELB）侧自定义负载均衡器和监听器配置，以及配置高级转发策略等，实现七层负载均衡的能力。
#### 示例说明
本文以Nginx镜像为例创建无状态工作负载，部署两个版本的服务。创建后端服务器组和PoolBinding对象，将部署的实例自动更新至后端服务器组后端。创建弹性负载均衡器和监听器，并配置高级转发策略，将流量导向不同的后端应用。
#### 操作步骤
1. 登录[ELB控制台](https://console.huaweicloud.com/vpc/#/elb/list/grid)，左侧菜单栏选择"后端服务器组"，单击"创建后端服务器组"。由于示例将部署两个工作负载，请参考以下步骤创建两个后端服务器组。
   
   1. 配置后端分配策略。
      - 实例类型：独享型
      
      - 服务器组类型：混合类型
      
      - 转发模式：负载均衡
      
      - 虚拟私有云：需与后续创建的Deployment和Service所在Namespace下的虚拟私有云保持一致，因此请合理选择虚拟私有云
      
      - 其它参数：可自定义配置 ![](https://support.huaweicloud.com/bestpractice-cci2/zh-cn_image_0000002257203476.png "点击放大")
        
        
       
   
   
   
   2. 添加后端服务器。 通过PoolBinding关联的对象无需用户手动添加，用户只需配置对应的健康检查信息，选择是否开启健康检查，若开启，编辑"参数设置"，修改健康检查参数，并确认配置的参数信息可成功访问后端业务。
      示例以Nginx镜像为例，开启健康检查并使用默认配置。
      ![](https://support.huaweicloud.com/bestpractice-cci2/zh-cn_image_0000002257545118.png "点击放大")
      
      
   
   
   
   3. 确认配置 确认配置无误后，单击"立即创建"。
      ![](https://support.huaweicloud.com/bestpractice-cci2/zh-cn_image_0000002257546822.png "点击放大")
      
      
   
   
   
   
2. 在华为云云容器实例CCI2.0控制台，选择"负载管理"，选择对应的命名空间，单击"YAML创建"，创建无状态负载。
   
   参考如下yaml示例，分别创建两个工作负载。
   Deployment的YAML示例：
   ```
   kind: Deployment
   apiVersion: cci/v2
   metadata:
     name: deploy-1
     namespace: test-ns
   spec:
     replicas: 1
     selector:
       matchLabels:
         app: nginx-test-1
     template:
       metadata:
         creationTimestamp: null
         labels:
           app: nginx-test-1
       spec:
         containers:
           - name: nginx
             image: 'nginx:latest'
             ports:
               - containerPort: 80 # 容器开放端口
                 protocol: TCP
             resources:
               limits:
                 cpu: 500m
                 memory: 1Gi
               requests:
                 cpu: 500m
                 memory: 1Gi
             terminationMessagePath: /dev/termination-log
             terminationMessagePolicy: File
         restartPolicy: Always
         terminationGracePeriodSeconds: 30
         dnsPolicy: Default
         securityContext: {}
         schedulerName: default-scheduler
     strategy:
       type: RollingUpdate
       rollingUpdate:
         maxUnavailable: 25%
         maxSurge: 25%
     progressDeadlineSeconds: 600
   ```
   - 如果您希望创建的PoolBinding关联的后端对象为Service，请执行[3]。
   
   - 如果您希望创建的PoolBinding关联的后端对象为Deployment，请执行[4]。
   
   
   
   
3. 返回华为云云容器实例CCI2.0控制台，选择"服务管理"，选择对应的命名空间，单击"YAML创建"，创建Service。参考如下yaml示例，分别创建两个Service。
   
   Service YAML示例：
   ```
   apiVersion: cci/v2
   kind: Service
   metadata:
     name: svc-1
     namespace: test-ns                               # 替换为实际命名空间名称
     annotations:
       kubernetes.io/elb.class: elb
       kubernetes.io/elb.id: 123*******               # 关联的elb id，只支持独享型elb，不支持共享型elb。
       kubernetes.io/elb.protocol-port: "http:2222"   # HTTP协议及端口号，需要与spec.ports中的端口号对应
   spec:
     selector:
       app: nginx-test-1    # 关联的负载label。
     ports:
       - name: service-0
         targetPort: 80     # 容器开放的端口。
         port: 2222         # 访问端口。
         protocol: TCP      # 访问负载的协议。
     type: LoadBalancer
   ```
   
   
4. 创建PoolBinding对象。
   
   目前console暂不支持PoolBinding对象创建，您可以使用curl命令或者ccictl工具创建。
   以ccictl工具为示例创建PoolBinding对象。ccictl配置步骤请参考[ccictl配置指南](https://support.huaweicloud.com/devg-cci2/cci_ccictl_02.html)。
   参考以下ccictl命令和示例，创建2个PoolBinding，分别与[1]创建的两个后端服务器组，以及[2]创建的两个Deployment（或[3]创建的两个Service）关联。
   ```
   ccictl create -f poolbinding.yaml
   ```
   - 若PoolBinding关联的后端对象是Deployment，则YAML示例如下：
     ```
     apiVersion: loadbalancer.networking.openvessel.io/v1
     kind: PoolBinding
     metadata:
       name: plb-test-1     # 创建的PoolBinding对象名称。
       namespace: test-ns   # 创建的PoolBinding对象所属的命名空间，需与关联的Deployment在同一命名空间下。
     spec:
       poolRef:
         id: e08*****-****-****-****-********29c1  //关联的后端服务器组ID，即步骤1创建的后端服务器组ID。
       targetRef:
         kind: Deployment   # 关联的后端对象类型，该示例为Deployment。
         group: cci/v2      # 关联的后端对象group。
         name: deploy-1     # 关联的后端对象名称，即步骤2创建的Deployment名称。
         port: 80           # 关联的后端对象目标端口号，若后端对象为Deployment，即开放的容器端口。
     ```
     
   
   - 若PoolBinding关联的后端对象是Service，则YAML示例如下：
     ```
     apiVersion: loadbalancer.networking.openvessel.io/v1
     kind: PoolBinding
     metadata:
       name: plb-test-c1    # 创建的PoolBinding对象名称。
       namespace: test-ns   # 创建的PoolBinding对象所属的命名空间，需与关联的Deployment在同一命名空间下。
     spec:
       poolRef:
         id: e08*****-****-****-****-********29c1  //关联的后端服务器组ID，即步骤1创建的后端服务器组ID。
       targetRef:
         kind: Service     # 关联的后端对象类型，该示例为Service。
         group: cci/v2     # 关联的后端对象group。
         name: svc-1       # 关联的后端对象名称，即步骤3创建的Service名称。
         port: 2222        # 关联的后端对象目标端口号，若后端对象为Service，即Service中配置的访问端口。
     ```
     
   
   
   
   
5. 在华为云弹性负载均衡服务控制台，单击查看[1]创建的后端服务器组详情，选择"后端服务器"，检查对应的负载实例是否完成刷新。
   
   ![](https://support.huaweicloud.com/bestpractice-cci2/zh-cn_image_0000002257573936.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-cci2/zh-cn_image_0000002292225413.png "点击放大")
   
   
   
   
6. 返回弹性负载均衡服务控制台，单击"购买弹性负载均衡"。
   
   - 基础配置中，实例类型选择"独享型"。
   
   - 实例规格中，规格选择"固定规格"，同时勾选"网络型"和"应用型"。
   
   - 网络配置中，网络类型选择"IPv4私网"，所属VPC需与[2]中工作负载所在VPC相同。
   
   - 公网访问中，选择"现在购买"。
   
   - 其余参数用户可自定义。 ![](https://support.huaweicloud.com/bestpractice-cci2/zh-cn_image_0000002301607177.png "点击放大")
     ![](https://support.huaweicloud.com/bestpractice-cci2/zh-cn_image_0000002267013868.png "点击放大")
     
     
     
     
     
   
   
   
   
7. 确认配置概要信息无误后，单击"立即购买"。
8. 返回弹性负载均衡服务控制台，选择[6]创建的弹性负载均衡，查看"监听器"，单击"添加监听器"。
   
   1. 配置监听器。您可根据实际情况自定义配置其它参数。完成后单击"下一步：配置后端分配策略"。
      - 名称：自定义名称
      
      - 前端协议：HTTP
      
      - 前端端口：填写前端端口
      
      - 高级转发策略：开启 ![](https://support.huaweicloud.com/bestpractice-cci2/zh-cn_image_0000002292233677.png "点击放大")
        
        
       
   
   
   
   2. 配置后端分配策略。选择后端服务器，勾选"使用已有"，搜索并选择[1]创建的其中一个后端服务器组作为默认后端服务器组，单击"下一步：确认配置"。
      ![](https://support.huaweicloud.com/bestpractice-cci2/zh-cn_image_0000002257482062.png "点击放大")
      
      
   
   
   
   3. 确认配置。确认配置无误后，单击"提交"。 ![](https://support.huaweicloud.com/bestpractice-cci2/zh-cn_image_0000002257484290.png "点击放大")
      
      
   
   
   
   
9. 返回弹性负载均衡服务控制台，选择[6]创建的弹性负载均衡，查看"监听器"，选择[8]创建的监听器，单击"添加/编辑转发策略"。
   
   ![](https://support.huaweicloud.com/bestpractice-cci2/zh-cn_image_0000002292240401.png "点击放大")
   
   
   
10. 添加转发策略。单击"添加转发策略"，编辑策略，选择转发规则，以"HTTP请求头"为例，填写HTTP请求头键值信息。选择"转发的后端服务器组"，即[1]创建的另一个未绑定至监听器的后端服务器组。确认信息无误后，单击"保存"。
    
    ![](https://support.huaweicloud.com/bestpractice-cci2/zh-cn_image_0000002257492714.png "点击放大")
    
    
    
11. 测试验证。 
    1. 构造HTTP请求。 查看弹性负载均衡IPv4公网地址，构造curl请求命令。命令格式如下：
       ```
       //未携带请求头
       while sleep 0.2;do curl http://$IP:$port;done
       //携带请求头
       while sleep 0.2;do curl http://$IP:$port -H "Type: always";done
       ```
       - $IP：弹性负载均衡IPv4公网地址。
       
       - $port：配置的监听器前端全口。 ![](https://support.huaweicloud.com/bestpractice-cci2/zh-cn_image_0000002292398045.png "点击放大")
         
         
        
    
    2. 发送请求，查看后端流量。 执行HTTP请求命令，以Nginx镜像为例部署的工作负载，可以通过ccictl logs命令查看后端接收的请求情况。
       ```
       ccictl logs -n $namespace $pod-name -f --tail=5 | grep -v "elb-healthcheck"
       ```
       - $namespace：创建的工作负载所在的命令空间。
       
       - $pod-name：创建的工作负载Pod实例名称。
        
    
    3. 查看结果示例。
       - 如果HTTP请求头不包含对应的请求头"Type: always"，则流量导向默认后端服务器组后端。 ![](https://support.huaweicloud.com/bestpractice-cci2/zh-cn_image_0000002262283706.png "点击放大")
         
       
       - 如果HTTP请求头包含对应的请求头"Type: always"，则流量导向转发策略中配置的后端服务器组后端。 ![](https://support.huaweicloud.com/bestpractice-cci2/zh-cn_image_0000002257859890.png "点击放大")
         
        
    
    
    
    
 
