更新时间:2024-03-11 GMT+08:00

通过Kubectl命令行创建ELB Ingress

操作场景

本节以Nginx工作负载为例,说明通过kubectl命令添加ELB Ingress的方法。

前提条件

networking.k8s.io/v1版本Ingress说明

CCE在v1.23版本集群开始Ingress切换到networking.k8s.io/v1版本。

v1版本参数相较v1beta1参数有如下区别。

  • ingress类型由annotations中kubernetes.io/ingress.class变为使用spec.ingressClassName字段。
  • backend的写法变化。
  • 每个路径下必须指定路径类型pathType,支持如下类型。
    • ImplementationSpecific: 对于这种路径类型,匹配方法取决于具体Ingress Controller的实现。在CCE中会使用ingress.beta.kubernetes.io/url-match-mode指定的匹配方式,这与v1beta1方式相同。
    • Exact:精确匹配 URL 路径,且区分大小写。
    • Prefix:基于以 / 分隔的 URL 路径前缀匹配。匹配区分大小写,并且对路径中的元素逐个匹配。 路径元素指的是由 / 分隔符分隔的路径中的标签列表。

添加Ingress-自动创建ELB

下面介绍如何通过kubectl命令在添加Ingress时自动创建ELB。

  1. 请参见通过kubectl连接集群,使用kubectl连接集群。
  2. 创建名为“ingress-test.yaml”的YAML文件,此处文件名可自定义。

    vi ingress-test.yaml

    CCE在1.23版本集群开始Ingress切换到networking.k8s.io/v1版本,之前版本集群使用networking.k8s.io/v1beta1。v1版本与v1beta1版本的区别请参见networking.k8s.io/v1版本Ingress说明

    共享型负载均衡(公网访问)示例 -1.23及以上版本集群:
    apiVersion: networking.k8s.io/v1
    kind: Ingress 
    metadata: 
      name: ingress-test
      annotations: 
        kubernetes.io/elb.class: union
        kubernetes.io/elb.port: '80'
        kubernetes.io/elb.autocreate: 
          '{
              "type":"public",
              "bandwidth_name":"cce-bandwidth-******",
              "bandwidth_chargemode":"bandwidth",
              "bandwidth_size":5,
              "bandwidth_sharetype":"PER",
              "vip_subnet_cidr_id": "*****",
              "vip_address": "**.**.**.**",
              "eip_type":"5_bgp"
            }'
        kubernetes.io/elb.tags:key1=value1,key2=value2           # 添加ELB资源标签
    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    # 表示使用ELB Ingress
    共享型负载均衡(公网访问)示例 - 1.21及以下版本集群:
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress 
    metadata: 
      name: ingress-test
      annotations: 
        kubernetes.io/elb.class: union
        kubernetes.io/ingress.class: cce    # 表示使用ELB Ingress
        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"
            }'
        kubernetes.io/elb.tags:key1=value1,key2=value2           # 添加ELB资源标签
    spec:
      rules: 
      - host: ''
        http: 
          paths: 
          - path: '/'
            backend: 
              serviceName: <your_service_name>  #替换为您的目标服务名称
              servicePort: <your_service_port>  #替换为您的目标服务端口
            property:
              ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
    独享型负载均衡(公网访问)示例 - 1.23及以上版本集群:
    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",
              "vip_subnet_cidr_id": "*****",
              "vip_address": "**.**.**.**",
              "elb_virsubnet_ids":["*****"],
              "available_zone": [
                  "ap-southeast-1a"
              ],
              "l7_flavor_name": "L7_flavor.elb.s1.small"
           }'
        kubernetes.io/elb.tags:key1=value1,key2=value2           # 添加ELB资源标签
    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.21及以下版本集群:
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: ingress-test
      namespace: default
      annotations:
        kubernetes.io/elb.class: performance
        kubernetes.io/ingress.class: cce
        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": [
                  "ap-southeast-1a"
              ],
              "l7_flavor_name": "L7_flavor.elb.s1.small"
           }'
        kubernetes.io/elb.tags:key1=value1,key2=value2           # 添加ELB资源标签
    spec:
      rules:
      - host: ''
        http:
          paths:
          - path: '/'
            backend: 
              serviceName: <your_service_name>  #替换为您的目标服务名称
              servicePort: <your_service_port>  #替换为您的目标服务端口
            property:
              ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
    表1 关键参数说明

    参数

    是否必填

    参数类型

    描述

    kubernetes.io/elb.class

    String

    请根据不同的应用场景和功能需求选择合适的负载均衡器类型。

    取值如下:

    默认值为“union”

    kubernetes.io/ingress.class

    (仅1.21及以下集群)

    String

    cce:表示使用自研ELBIngress。

    通过API接口创建Ingress时必须增加该参数。

    ingressClassName

    (仅1.23及以上集群)

    String

    cce:表示使用自研ELBIngress。

    通过API接口创建Ingress时必须增加该参数。

    kubernetes.io/elb.port

    String

    界面上的对外端口,为注册到负载均衡服务地址上的端口。

    取值范围:1~65535。

    说明:

    部分端口为高危端口,默认被屏蔽,如21端口。

    kubernetes.io/elb.subnet-id

    -

    String

    为集群所在子网的ID,取值范围:1~100字符。

    • Kubernetes v1.11.7-r0及以下版本的集群自动创建时:必填。
    • Kubernetes v1.11.7-r0以上版本的集群:可不填,默认为""。

    获取方法请参见:VPC子网接口与OpenStack Neutron子网接口的区别是什么?

    kubernetes.io/elb.enterpriseID

    String

    Kubernetes v1.15及以上版本的集群支持此字段;Kubernetes v1.15以下版本默认创建到default项目下。

    企业项目ID,选择后可以直接创建在具体的企业项目下。

    取值范围:1~100字符。

    获取方法:

    登录控制台后,单击顶部菜单右侧的“企业 > 项目管理”,在打开的企业项目列表中单击要加入的企业项目名称,进入企业项目详情页,找到“ID”字段复制即可。

    kubernetes.io/elb.autocreate

    elb.autocreate object

    自动创建Ingress关联的ELB,详细字段说明参见表2

    示例:

    • 公网自动创建:

      值为 '{"type":"public","bandwidth_name":"cce-bandwidth-******","bandwidth_chargemode":"bandwidth","bandwidth_size":5,"bandwidth_sharetype":"PER","eip_type":"5_bgp","name":"james"}'

    • 私网自动创建:

      值为 '{"type":"inner", "name": "A-location-d-test"}'

    kubernetes.io/elb.tags

    String

    为ELB添加资源标签,仅自动创建ELB时支持设置,且集群版本需满足v1.23.11-r0、v1.25.6-r0、v1.27.3-r0及以上。

    格式为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

    路径类型,该字段仅v1.23及以上集群支持。
    • 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路径匹配示例,请参见示例

    表2 elb.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

    具体类型以各区域配置为准,详情请参见弹性公网IP控制台。

    vip_subnet_cidr_id

    String

    指定ELB所在的子网,该子网必须属于集群所在的VPC。

    如不指定,则ELB与集群在同一个子网。

    仅v1.21及以上版本的集群支持指定该字段。

    vip_address

    String

    负载均衡器的内网IP。仅支持指定IPv4地址,不支持指定IPv6地址。

    该IP必须为ELB所在子网网段中的IP。若不指定,自动从ELB所在子网网段中生成一个IP地址。

    仅v1.23.11-r0、v1.25.6-r0、v1.27.3-r0及以上版本集群支持指定该字段。

    available_zone

    Array of strings

    负载均衡所在可用区。

    可以通过查询可用区列表获取所有支持的可用区。

    独享型负载均衡器独有字段。

    l4_flavor_name

    String

    四层负载均衡实例规格名称。

    可以通过查询规格列表获取所有支持的类型。

    独享型负载均衡器独有字段。

    l7_flavor_name

    String

    七层负载均衡实例规格名称。

    可以通过查询规格列表获取所有支持的类型。

    独享型负载均衡器独有字段,必须与l4_flavor_name对应规格的类型一致,即都为弹性规格或都为固定规格。

    elb_virsubnet_ids

    Array of strings

    负载均衡后端所在子网,不填默认为集群子网。不同实例规格将占用不同数量子网IP,不建议使用其他资源(如集群,节点等)的子网网段。

    独享型负载均衡器独有字段。

    示例:

    "elb_virsubnet_ids": [
       "14567f27-8ae4-42b8-ae47-9f847a4690dd"
     ]

    ipv6_vip_virsubnet_id

    String

    双栈类型负载均衡器所在子网的IPv6网络ID,需要对应的子网开启IPv6,仅使用双栈集群时需填写。

    独享型负载均衡器独有字段。

  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。
  • 对接已有独享型ELB规格必须支持应用型(HTTP/HTTPS),且网络类型必须支持私网(有私有IP)。
以1.23及以上版本集群为例,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               

以1.21及以下版本集群为例,YAML文件配置如下:

apiVersion: networking.k8s.io/v1beta1
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'
    kubernetes.io/ingress.class: cce
spec:
  rules: 
  - host: ''
    http: 
      paths: 
      - path: '/'
        backend: 
          serviceName: <your_service_name>  #替换为您的目标服务名称
          servicePort: 80
        property:
          ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
表3 关键参数说明

参数

是否必填

参数类型

描述

kubernetes.io/elb.id

String

为负载均衡实例的ID,取值范围:1-100字符。

获取方法:

在控制台的“服务列表”中,单击“网络 > 弹性负载均衡 ELB”,单击ELB的名称,在ELB详情页的“基本信息”页签下找到“ID”字段复制即可。

kubernetes.io/elb.ip

String

为负载均衡实例的服务地址,公网ELB配置为公网IP,私网ELB配置为私网IP。

kubernetes.io/elb.class

String

负载均衡器类型。

说明:

ELB Ingress对接已有的独享型ELB时,该独享型ELB必须支持应用型(HTTP/HTTPS)规格。