文档首页> 云容器引擎 CCE> 用户指南> 旧版UI> 网络管理> Ingress> 通过Kubectl命令行添加ELB Ingress
更新时间:2022-09-15 GMT+08:00
分享

通过Kubectl命令行添加ELB Ingress

操作场景

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

前提条件

添加Ingress-自动创建ELB

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

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

    vi ingress-test.yaml

    • 1.15及以上集群版本中的“apiVersion”为: “networking.k8s.io/v1beta1”
    • 1.13及以下集群版本中的“apiVersion”为: “extensions/v1beta1”

    您可根据需求选择创建负载均衡,对应的YAML文件配置分别如下所示:

    共享型负载均衡(公网访问)实例:
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress 
    metadata: 
      name: ingress-test
      annotations: 
        kubernetes.io/elb.class: union
        kubernetes.io/ingress.class: cce
        kubernetes.io/elb.port: '80'
        kubernetes.io/elb.autocreate: 
          '{
              "type":"public",
              "bandwidth_name":"cce-bandwidth-******",
              "bandwidth_chargemode":"traffic",
              "bandwidth_size":5,
              "bandwidth_sharetype":"PER",
              "eip_type":"5_bgp"
            }'
    spec:
      rules: 
      - host: ''
        http: 
          paths: 
          - path: '/'
            backend: 
              serviceName: <your_service_name>  #替换为您的目标服务名称
              servicePort: 80
            property:
              ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH

    独享型负载均衡(公网访问)实例:

    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": "traffic",
              "bandwidth_size": 5,
              "bandwidth_sharetype": "PER",
              "eip_type": "5_bgp",
              "available_zone": [
                  "cn-north-4b"
              ],
              "l7_flavor_name": "L7_flavor.elb.s1.small"
           }'
    spec:
      rules:
      - host: ''
        http:
          paths:
          - path: '/'
            backend: 
              serviceName: <your_service_name>  #替换为您的目标服务名称
              servicePort: 80
            property:
              ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
    表1 关键参数说明

    参数

    是否必填

    参数类型

    描述

    kubernetes.io/elb.class

    String

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

    取值如下:

    默认值为“union”

    kubernetes.io/ingress.class

    String

    cce:表示使用自研ELBIngress。

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

    kubernetes.io/elb.port

    Integer

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

    取值范围:1~65535。

    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":"traffic","bandwidth_size":5,"bandwidth_sharetype":"PER","eip_type":"5_bgp","name":"james"}'

    • 私网自动创建:

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

    host

    String

    为服务访问域名配置,默认为"",表示域名全匹配。

    path

    String

    为路由路径,用户自定义设置。所有外部访问请求需要匹配host和path。

    serviceName

    String

    Ingress绑定的目标Service名称。

    servicePort

    Integer

    目标Service的访问端口。

    ingress.beta.kubernetes.io/url-match-mode

    String

    路由匹配策略。

    默认值为“STARTS_WITH”(前缀匹配)。

    取值范围:

    • EQUAL_TO:精确匹配
    • STARTS_WITH:前缀匹配
    • REGEX:正则匹配
    表2 elb.autocreate字段数据结构说明

    参数

    是否必填

    参数类型

    描述

    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类型,各局点可能存在差异,请参见创建EIP时的type参数。

    • 5_telcom:电信
    • 5_union:联通
    • 5_bgp:全动态BGP
    • 5_sbgp:静态BGP

    name

    String

    自动创建的负载均衡的名称。

    取值范围:1~64个字符,小写字母,数字,下划线,小写字母开头,小写字母或者数字结尾。

    默认值为“cce-lb+ingress.UID”

    vip_subnet_cidr_id

    String

    指定ELB所在的子网。1.21及以上版本支持。

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

    available_zone

    Array of strings

    负载均衡所在可用区,必填项。

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

    l4_flavor_name

    String

    四层负载均衡实例名称。

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

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

    l7_flavor_name

    String

    七层负载均衡实例名称,必填项。

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

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

    elb_virsubnet_ids

    Array of strings

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

    默认值为集群所在子网。

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

  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。
  • 1.15及以上集群版本中的“apiVersion”为: “networking.k8s.io/v1beta1”
  • 1.13及以下集群版本中的“apiVersion”为: “extensions/v1beta1”
  • 对接已有独享型ELB规格需要支持应用型(HTTP),且网络类型必须支持私网。

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

apiVersion: networking.k8s.io/v1beta1
kind: Ingress 
metadata: 
  name: ingress-test
  annotations: 
    kubernetes.io/elb.class: performance                                # 负载均衡器类型 
    kubernetes.io/elb.id: <your_elb_id>  #替换为您已有的ELB ID
    kubernetes.io/elb.ip: <your_elb_ip>  #替换为您已有的ELB IP
    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.class

String

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

取值如下:

默认值为“union”

kubernetes.io/elb.id

String

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

获取方法:

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

kubernetes.io/elb.ip

String

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

配置HTTPS证书

Ingress支持配置TLS证书,以HTTPS协议的方式对外提供安全服务。

  • 服务需要以HTTPS协议的方式对外暴露时,需要在Ingress中配置TLS密钥证书。创建密钥的方法请参见创建密钥
  • 同一个ELB实例的同一个端口配置HTTPS时,需要选择一样的证书。
  1. 请参见通过kubectl连接集群,使用kubectl连接集群。
  2. 执行如下命令,创建名为“ingress-test-secret.yaml”的YAML文件,此处文件名可自定义。

    vi ingress-test-secret.yaml

    YAML文件配置如下:
    apiVersion: v1
    data:
      tls.crt: LS0******tLS0tCg==
      tls.key: LS0tL******0tLS0K
    kind: Secret
    metadata:
      annotations:
        description: test for ingressTLS secrets
      name: ingress-test-secret
      namespace: default
    type: IngressTLS

    此处tls.crt和tls.key为示例,请获取真实密钥进行替换。tls.crt和tls.key的值为Base64加密后的内容。

  3. 创建密钥。

    kubectl create -f ingress-test-secret.yaml

    回显如下,表明密钥已创建。

    secret/ingress-test-secret created

    查看已创建的密钥。

    kubectl get secrets

    回显如下,表明密钥创建成功。

    NAME                         TYPE                                  DATA      AGE
    ingress-test-secret          IngressTLS                            2         13s

  4. 创建名为“ingress-test.yaml”的YAML文件,此处文件名可自定义。

    vi ingress-test.yaml

    安全策略选择(kubernetes.io/elb.tls-ciphers-policy)仅在1.17.11及以上版本的集群中支持。

    以关联已有ELB为例,YAML文件配置如下:

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress 
    metadata: 
      name: ingress-test
      annotations: 
        kubernetes.io/elb.class: performance                                # 负载均衡器类型 
        kubernetes.io/elb.id: <your_elb_id>  #替换为您已有的ELB ID
        kubernetes.io/elb.ip: <your_elb_ip>  #替换为您已有的ELB IP
        kubernetes.io/ingress.class: cce
        kubernetes.io/elb.port: '443'
        kubernetes.io/elb.tls-ciphers-policy: tls-1-2
    spec:
      tls: 
      - secretName: ingress-test-secret
      rules: 
      - host: ''
        http: 
          paths: 
          - path: '/'
            backend: 
              serviceName: <your_service_name>  #替换为您的目标服务名称
              servicePort: 80
            property:
              ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
    表4 关键参数说明

    参数

    是否必填

    参数类型

    描述

    kubernetes.io/elb.tls-ciphers-policy

    String

    默认值为“tls-1-2”,为监听器使用的安全策略,仅在HTTPS协议下生效。

    取值范围:

    • tls-1-0
    • tls-1-1
    • tls-1-2
    • tls-1-2-strict

    各安全策略使用的加密套件列表详细参见表5

    tls

    Array of strings

    HTTPS协议时,需添加此字段。该字段可添加多项独立的域名和证书,详见配置服务器名称指示(SNI)

    secretName

    String

    HTTPS协议时添加,配置为创建的密钥证书名称。

    表5 tls_ciphers_policy取值说明

    安全策略

    支持的TLS版本类型

    使用的加密套件列表

    tls-1-0

    TLS 1.2

    TLS 1.1

    TLS 1.0

    ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:AES128-SHA256:AES256-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:AES128-SHA:AES256-SHA

    tls-1-1

    TLS 1.2

    TLS 1.1

    tls-1-2

    TLS 1.2

    tls-1-2-strict

    TLS 1.2

    ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:AES128-GCM-SHA256:AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:AES128-SHA256:AES256-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384

  5. 创建Ingress。

    kubectl create -f ingress-test.yaml

    回显如下,表示Ingress服务已创建。

    ingress/ingress-test created

    查看已创建的Ingress。

    kubectl get ingress

    回显如下,表示Ingress服务创建成功,工作负载可访问。

    NAME             HOSTS     ADDRESS          PORTS   AGE
    ingress-test     *         121.**.**.**     80      10s

  6. 访问工作负载(例如Nginx工作负载),在浏览器中输入安全访问地址https://121.**.**.**:443进行验证。

    其中,121.**.**.**为统一负载均衡实例的IP地址。

配置服务器名称指示(SNI)

SNI允许同一个IP地址和端口号下对外提供多个基于TLS的访问域名,且不同的域名可以使用不同的安全证书。
  • 用于SNI的证书需要指定域名,每个证书只能指定一个域名。支持泛域名证书。
  • 安全策略选择(kubernetes.io/elb.tls-ciphers-policy)仅在1.17.11及以上版本的集群中支持。
满足以上条件时可进行SNI配置,以自动创建关联ELB为例,yaml文件配置如下,本例中sni-test-secret-1sni-test-secret-2为SNI证书,该证书指定的域名必须与证书中的域名一致。
apiVersion: networking.k8s.io/v1beta1
kind: Ingress 
metadata: 
  name: ingress-test
  annotations: 
    kubernetes.io/elb.class: performance                                # 负载均衡器类型 
    kubernetes.io/elb.id: <your_elb_id>  #替换为您已有的ELB ID
    kubernetes.io/elb.ip: <your_elb_ip>  #替换为您已有的ELB IP
    kubernetes.io/ingress.class: cce
    kubernetes.io/elb.port: '443'
    kubernetes.io/elb.tls-ciphers-policy: tls-1-2
spec:
  tls: 
  - secretName: ingress-test-secret
  - hosts:
      - example.top  #签发证书时指定域名为example.top
    secretName: sni-test-secret-1  
  - hosts:
      - example.com  #签发证书时指定域名为example.com
    secretName: sni-test-secret-2
  rules: 
  - host: ''
    http: 
      paths: 
      - path: '/'
        backend: 
          serviceName: <your_service_name>  #替换为您的目标服务名称
          servicePort: 80
        property:
          ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH

路由到多个服务

Ingress可通过不同的匹配策略同时路由到多个后端服务,YAML文件中的spec字段设置如下。通过访问“www.example.com/foo”、“www.example.com/bar”、“foo.example.com/”即可分别路由到三个不同的后端Service。

Ingress转发策略中注册的URL需与后端应用暴露的URL一致,否则将返回404错误。

spec:
  rules: 
  - host: 'www.example.com'
    http: 
      paths: 
      - path: '/foo'
        backend: 
          serviceName: <your_service_name>  #替换为您的目标服务名称
          servicePort: 80
        property:
          ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
      - path: '/bar'
        backend:
          serviceName: <your_service_name>  #替换为您的目标服务名称
          servicePort: 80
        property:
          ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
  - host: 'foo.example.com'
    http:
      paths:
      - path: '/'
        backend:
          serviceName: <your_service_name>  #替换为您的目标服务名称
          servicePort: 80
        property:
          ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
分享:

    相关文档

    相关产品

close