# 通过Kubectl命令行创建ELB Ingress
#### 操作场景
本节以Nginx工作负载为例，说明通过kubectl命令添加ELB Ingress的方法。
- 如您在同一VPC下没有可用的ELB，CCE支持在添加Ingress时自动创建ELB，请参考[添加Ingress-自动创建ELB]。
- 如您已在同一VPC下提前创建了一个可用的ELB，则可参考[添加Ingress-对接已有ELB]。
 
#### 前提条件
- Ingress为后端工作负载提供网络访问，因此集群中需提前部署可用的工作负载。若您无可用工作负载，可参考[创建工作负载](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0673.html)部署示例nginx工作负载。
- 为上述工作负载配置Service。
- 独享型ELB规格必须支持应用型（HTTP/HTTPS），且网络类型必须支持私网（有私有IP地址）。
 
 #### 添加Ingress-自动创建ELB
下面介绍如何通过kubectl命令在添加Ingress时自动创建ELB。
1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce-autopilot/cce_11_0107.html)，使用kubectl连接集群。
2. 创建名为"**ingress-test.yaml** "的YAML文件，此处文件名可自定义。
   
   **vi ingress-test.yaml**
   **独享型负载均衡（公网访问）示例 ：**
   ```
   apiVersion: networking.k8s.io/v1
   kind: Ingress
   metadata:
     name: ingress-test
     namespace: default
     annotations:
       kubernetes.io/elb.class: performance
       kubernetes.io/elb.port: '80'
       kubernetes.io/elb.autocreate: 
         '{
             "type": "public",
             "bandwidth_name": "cce-bandwidth-******",
             "bandwidth_chargemode": "bandwidth",
             "bandwidth_size": 5,
             "bandwidth_sharetype": "PER",
             "eip_type": "5_bgp",
             "elb_virsubnet_ids":["*****"],
             "available_zone": [
                 "cn-north-4b"
             ],
             "l7_flavor_name": "L7_flavor.elb.s1.small"
          }'
   spec:
     rules: 
     - host: ''
       http: 
         paths: 
         - path: '/'
           backend: 
             service:
               name: <your_service_name>  #替换为您的目标服务名称
               port: 
                 number: <your_service_port>  #替换为您的目标服务端口
           property:
             ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
           pathType: ImplementationSpecific
     ingressClassName: cce
   ```
   表1关键参数说明 
   | 参数                                          | 是否必填 | 参数类型                   | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   |:---|:---|:---|:---|
   | kubernetes.io/elb.class                     | 是   | String             | **该参数在创建完成后不可修改** **。** 取值如下： - performance：独享型负载均衡。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   | ingressClassName                           | 是   | String             | cce：表示使用自研ELBIngress。 创建Ingress时必须增加该参数。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
   | kubernetes.io/elb.port                   | 否   | Integer              | 界面上的对外端口，为注册到负载均衡服务地址上的端口。 取值范围：1\~65535，HTTP协议默认为80，HTTPS协议默为443。 说明： 部分端口为高危端口，默认被屏蔽，如21端口                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   | kubernetes.io/elb.subnet-id               | 否    | String               | 为集群所在子网的ID，取值范围：1\~100字符。 获取方法请参见：[VPC子网接口与OpenStack Neutron子网接口的区别是什么？](https://support.huaweicloud.com/api-vpc/vpc_api_0005.html)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   | kubernetes.io/elb.enterpriseID             | 否      | String              | 表示ELB企业项目ID，仅限于已开通企业项目的企业客户账号使用。给定企业项目ID后，相关资源将直接创建在该ELB企业项目下。 取值范围：1\~100字符。 **获取方法：** 登录[企业项目管理控制台](https://console.huaweicloud.com/eps/#/projects/list)后，在打开的企业项目列表中单击要加入的企业项目名称，进入企业项目详情页，找到"ID"字段复制即可。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
   | kubernetes.io/elb.autocreate               | 是     | elb.autocreate object | 自动创建Ingress关联的ELB，详细字段说明参见[表2]。**该参数在创建完成后不可修改** **。** **示例：** - 自动创建公网独享型ELB： 值为'{"type":"inner","available_zone":\["\*\*\*\*\*"\],"elb_virsubnet_ids":\["\*\*\*\*\*"\],"l7_flavor_name":"L7_flavor.elb.pro.max","l4_flavor_name":"","vip_subnet_cidr_id":"\*\*\*\*\*"}'   - 自动创建私网独享型ELB： 值为 '{"type":"inner", "name": "A-location-d-test"}'                                                                                                                                                                                                                                                                                                                                |
   | kubernetes.io/elb.tags                     | 否    | String                | 为ELB添加资源标签，仅自动创建ELB时支持设置。 格式为key=value，同时添加多个标签时以英文逗号（,）隔开。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
   | host                                        | 否    | String              | 为服务访问域名配置，默认为""，表示域名全匹配。请确保所填写的域名已注册并备案，一旦配置了域名规则后，必须使用域名访问。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   | path                                        | 是     | String             | 为路由路径，用户自定义设置。所有外部访问请求需要匹配host和path。 说明： 此处添加的访问路径要求后端应用内存在相同的路径，否则转发无法生效。 例如，Nginx应用默认的Web访问路径为"/usr/share/nginx/html"，在为Ingress转发策略添加"/test"路径时，需要应用的Web访问路径下也包含相同路径，即"/usr/share/nginx/html/test"，否则将返回404。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
   | ingress.beta.kubernetes.io/url-match-mode | 否     | String               | 路由匹配策略。 默认值为"STARTS_WITH"(前缀匹配)。 取值范围： - EQUAL_TO：精确匹配  - STARTS_WITH：前缀匹配  - REGEX：正则匹配                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
   | pathType                                 | 是    | String               | 路径类型。 - ImplementationSpecific: 匹配方法取决于具体Ingress Controller的实现。在CCE中会使用ingress.beta.kubernetes.io/url-match-mode指定的匹配方式。  - Exact：精确匹配 URL 路径，且区分大小写。  - Prefix：前缀匹配，且区分大小写。该方式是将URL路径通过"/"分隔成多个元素 ，并且对元素进行逐个匹配。 如果URL中的每个元素均和路径匹配，则说明该URL的子路径均可以正常路由。 说明： - Prefix匹配时每个元素均需精确匹配，如果URL的最后一个元素是请求路径中最后一个元素的子字符串，则不会匹配 。例如：/foo/bar匹配/foo/bar/baz，但不匹配/foo/barbaz。  - 通过"/"分隔元素时，若URL或请求路径以"/"结尾，将会忽略结尾的"/"。例如：/foo/bar会匹配/foo/bar/。      关于Ingress路径匹配示例，请参见[示例](https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/)。 |
      
    表2elb.autocreate字段数据结构说明 
   | 参数                    | 是否必填      | 参数类型              | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
   |:---|:---|:---|:---|
   | name                  | 否          | String             | 自动创建的负载均衡的名称。 取值范围：只能由中文、英文字母、数字、下划线、中划线、点组成，且长度范围为1-64个字符。 默认名称：cce-lb+service.UID                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
   | type                 | 否         | String           | 负载均衡实例网络类型，公网或者私网。 - public：公网型负载均衡  - inner：私网型负载均衡   默认类型：inner                                                                                                                                                                                                                                                                                            |
   | bandwidth_name      | 公网型负载均衡必填 | String           | 带宽的名称，默认值为：cce-bandwidth-\*\*\*\*\*\*。 取值范围：只能由中文、英文字母、数字、下划线、中划线、点组成，且长度范围为1-64个字符。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
   | bandwidth_chargemode | 公网型负载均衡必填   | String             | 带宽付费模式。 - bandwidth：按带宽  - traffic：按流量   默认类型：bandwidth                                                                                                                                                                                                                                                                                                         |
   | bandwidth_size        | 公网型负载均衡必填  | Integer            | 带宽大小，默认1Mbit/s\~2000Mbit/s，请根据Region带宽支持范围设置。 调整带宽时的最小单位会根据带宽范围不同存在差异。 - 小于等于300Mbit/s：默认最小单位为1Mbit/s。  - 300Mbit/s\~1000Mbit/s：默认最小单位为50Mbit/s。  - 大于1000Mbit/s：默认最小单位为500Mbit/s。                                                                                                            |
   | bandwidth_sharetype | 公网型负载均衡必填 | String            | 带宽共享方式。 - PER：独享带宽                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
   | eip_type             | 公网型负载均衡必填  | String           | 弹性公网IP类型。 - 5_telcom：电信  - 5_union：联通  - 5_bgp：全动态BGP  - 5_sbgp：静态BGP                                                                      |
   | vip_subnet_cidr_id  | 否         | String            | 指定ELB所在的子网，该子网必须属于集群所在的VPC。 如不指定，则ELB与集群在同一个子网。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
   | vip_address         | 否        | String            | 负载均衡器的内网IP。仅支持指定IPv4地址，不支持指定IPv6地址。 该IP必须为ELB所在子网网段中的IP。若不指定，自动从ELB所在子网网段中生成一个IP地址。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
   | available_zone        | 是        | Array of strings | 负载均衡所在可用区。 可以通过[查询可用区列表](https://support.huaweicloud.com/api-elb/ListAvailabilityZones.html)获取所有支持的可用区。 独享型负载均衡器独有字段。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
   | l4_flavor_name        | 是        | String            | 四层负载均衡实例规格名称。 可以通过[查询规格列表](https://support.huaweicloud.com/api-elb/ListFlavors.html)获取所有支持的类型。 - 弹性规格：适用于业务用量波动较大的场景，按实际使用量收取每小时使用的容量费用。  - 固定规格：适用于业务用量较为稳定的场景，按固定规格折算收取每小时使用的容量费用。   独享型负载均衡器独有字段。                                                                                             |
   | l7_flavor_name         | 否         | String            | 七层负载均衡实例规格名称。 可以通过[查询规格列表](https://support.huaweicloud.com/api-elb/ListFlavors.html)获取所有支持的类型。 - 弹性规格：适用于业务用量波动较大的场景，按实际使用量收取每小时使用的容量费用。  - 固定规格：适用于业务用量较为稳定的场景，按固定规格折算收取每小时使用的容量费用。   独享型负载均衡器独有字段，必须与l4_flavor_name对应规格的类型一致，即都为弹性规格或都为固定规格。 |
   | elb_virsubnet_ids    | 否          | Array of strings  | 填写子网的网络ID，指定负载均衡后端所在子网，用于分配与后端服务建立连接的IP地址，不填默认为vip_subnet_cidr_id参数所选的子网。不同实例规格将占用不同数量子网IP，不建议使用其他资源（如集群等）的子网网段。 独享型负载均衡器独有字段。 示例： ``` "elb_virsubnet_ids": [ "14567f27-8ae4-42b8-ae47-9f847a4690dd" ] ``` **获取方式：** 登录[VPC控制台](https://console.huaweicloud.com/vpc/#/vpc/vpcs/list)，在左侧导航栏选择"子网"，根据集群所在的VPC名称筛选子网，单击子网名称，在"基本信息"页签下找到"网络ID"字段复制即可。                                                                                                                                                                                                                                                                                                                      |
      
   
   
3. 创建Ingress。 
   **kubectl create -f ingress-test.yaml**
   回显如下，表示Ingress服务已创建。
   ```
   ingress/ingress-test created
   ```
   **kubectl get ingress**
   回显如下，表示Ingress服务创建成功，工作负载可访问。
   ```
   NAME             HOSTS     ADDRESS          PORTS   AGE
   ingress-test     *         121.**.**.**     80      10s
   ```
   
   
4. 访问工作负载（例如Nginx工作负载），在浏览器中输入访问地址http://121.\*\*.\*\*.\*\*:80进行验证。 
   其中，121.\*\*.\*\*.\*\*为统一负载均衡实例的IP地址。
   
   
 
 #### 添加Ingress-对接已有ELB
CCE支持在添加Ingress时选择对接已有的ELB。
![](https://support.huaweicloud.com/usermanual-cce-autopilot/public_sys-resources/note_3.0-zh-cn.png)
- 对接已有独享型ELB规格必须支持应用型（HTTP/HTTPS），且网络类型必须支持私网（有私有IP）。
 
**YAML文件配置如下：**
```
apiVersion: networking.k8s.io/v1
kind: Ingress 
metadata: 
  name: ingress-test
  annotations: 
    kubernetes.io/elb.id: <your_elb_id>  #替换为您已有的ELB ID
    kubernetes.io/elb.ip: <your_elb_ip>  #替换为您已有的ELB IP
    kubernetes.io/elb.class: performance  #ELB类型
    kubernetes.io/elb.port: '80'
spec:
  rules: 
  - host: ''
    http: 
      paths: 
      - path: '/'
        backend: 
          service:
            name: <your_service_name>  #替换为您的目标服务名称
            port: 
              number: 8080             #替换为您的目标服务端口
        property:
          ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
        pathType: ImplementationSpecific
  ingressClassName: cce
```
表3关键参数说明 
| 参数                     | 是否必填                           | 参数类型     | 描述                                                                                                                                                                                                                                                                                                                                 |
|:---|:---|:---|:---|
| kubernetes.io/elb.id  | 该参数可与kubernetes.io/elb.ip二选一填写 | String    | 为负载均衡实例的ID，取值范围：1-100字符。 **该参数在创建完成后不可修改**。 **获取方法：** 在控制台的"服务列表"中，单击"网络 \> 弹性负载均衡 ELB"，单击ELB的名称，在ELB详情页的"基本信息"页签下找到"ID"字段复制即可。                                                     |
| kubernetes.io/elb.ip   | 该参数可与kubernetes.io/elb.id二选一填写                              | String | 为负载均衡实例的服务地址。该参数可与kubernetes.io/elb.id二选一填写，二者产生冲突时以kubernetes.io/elb.id为准。**该参数在创建完成后不可修改**。 独享型ELB只支持指定私网IP。                                                                                                                                                                                                                      |
| kubernetes.io/elb.class | 是                             | String  | 负载均衡器类型。**该参数在创建完成后不可修改** **。** - performance：独享型负载均衡。   说明： ELB Ingress对接已有的独享型ELB时，该独享型ELB必须支持应用型（HTTP/HTTPS）规格。 |
   
