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

为ELB Ingress配置高级转发规则

Ingress支持多样化的转发规则,可以根据HTTP请求方法、HTTP请求头、查询字符串、网段、Cookie等请求参数匹配不同的监听器(每个监听器对应一个ELB访问端口),便于灵活地分流业务,合理分配资源。

图1 高级转发规则示意图

前提条件

  • 已创建一个CCE Standard或CCE Turbo集群,且集群版本满足以下要求:
    • v1.23集群:v1.23.18-r10及以上
    • v1.25集群:v1.25.16-r0及以上
    • v1.27集群:v1.27.16-r0及以上
    • v1.28集群:v1.28.13-r0及以上
    • v1.29集群:v1.29.8-r0及以上
    • v1.30集群:v1.30.4-r0及以上
    • 其他更高版本的集群
  • 您需要使用kubectl连接到集群,详情请参见通过kubectl连接集群

约束与限制

仅使用独享型ELB时,Ingress支持配置高级转发规则。

通过kubectl命令行配置

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

    vi ingress-test.yaml
    以使用已有ELB创建Ingress的场景为例,YAML配置如下:
    apiVersion: networking.k8s.io/v1 
    kind: Ingress 
    metadata: 
      annotations: 
        kubernetes.io/elb.class: performance
        kubernetes.io/elb.id: ab53c3b2-xxxx-xxxx-xxxx-5ac3eb2887be
        kubernetes.io/elb.port: '80'
        # 表示访问svc-hello1服务,请确保svc-hello1服务存在
        kubernetes.io/elb.conditions.svc-hello1: |  
            [ 
              { 
                "type": "Method", 
                "methodConfig": { 
                  "values": [ 
                    "GET", 
                    "POST" 
                  ] 
                } 
              }, 
              { 
                "type": "Header", 
                "headerConfig": { 
                  "key": "gray-hello", 
                  "values": [ 
                    "value1", 
                    "value2" 
                  ] 
                } 
              }, 
              { 
                "type": "Cookie", 
                "cookieConfig": { 
                  "values": [ 
                    { 
                      "key": "querystringkey1", 
                      "value": "querystringvalue2" 
                    }, 
                    { 
                      "key": "querystringkey3", 
                      "value": "querystringvalue4" 
                    } 
                  ] 
                } 
              }, 
              { 
                "type": "QueryString", 
                "queryStringConfig": { 
                  "key": "testKey", 
                  "values": [ 
                    "testValue" 
                  ] 
                } 
              }, 
              { 
                "type": "SourceIp", 
                "sourceIpConfig": { 
                  "values": [ 
                    "192.168.0.0/16", 
                    "172.16.0.0/16" 
                  ] 
                } 
              } 
            ] 
      name: ingress-test 
    spec: 
      ingressClassName: cce 
      rules: 
       - http: 
          paths: 
          - path: /hello1 
            pathType: ImplementationSpecific 
            backend: 
              service: 
                name: svc-hello1 
                port: 
                  number: 80
    表1 高级转发规则注解

    参数

    类型

    描述

    kubernetes.io/elb.conditions.${svc_name}

    String

    配置高级转发规则,${svc_name}即对应的Service名称,其最大长度为48个字符。

    如果该annotation值配置成[]则表示删除相应的高级转发规则。

    注解值格式为Json字符串数组,具体格式请参见表2

    须知:
    • 由于ELB的API限制,conditions设置的数量上限为10,即一条kubernetes.io/elb.conditions.{svcName}中,最多包含十条key-value键值对。
    • 一条conditions中的数组中不同的规则是“与”关系,但同一个规则块中的值是“或”关系。例如,Method和QueryString两种转发条件都配置时,需要同时满足,才能实现目标流量分发。但如果Method值为GET,POST,即只需要满足Method为GET或POST,且QueryString满足条件即可。
    表2 数组结构

    参数

    使用说明

    示例

    type

    匹配类型,支持设置以下几种参数值:

    • Method:根据匹配的HTTP请求方法进行转发,需要与methodConfig字段搭配使用。Method仅可配置一次。
    • Header:根据匹配的HTTP请求头进行转发,需要与headerConfig字段搭配使用。
    • Cookie:根据匹配的Cookie进行转发,需要与cookieConfig字段搭配使用。
    • QueryString:根据请求中匹配的字符串进行转发,需要与queryStringConfig字段搭配使用。
    • SourceIp:根据匹配的请求网段进行转发,需要与sourceIpConfig字段搭配使用。SourceIp仅可配置一次。

    -

    methodConfig

    触发转发的HTTP请求方法,仅当type参数值为Method时使用。

    可以并列设置多个请求方法,支持以下几种请求方法:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS。

    methodConfig无需设置key,仅设置values即可,values为数组。

    {
      "type": "Method",
      "methodConfig": {
         "values": [
            "GET",
            "POST"
         ]
      }
    }

    headerConfig

    触发转发的HTTP请求头,仅当type参数值为Header时使用。

    • 键(key):只能由英文字母、数字、下划线和中划线组成。

      HTTP请求头User-agent和Connection仅支持首字母大写的形式。

    • 值(value)一个键下可以配置多个值。只能包含英文字母、数字和特殊字符!#$%&'()*+,.\/:;<=>?@[]^-_'{|}~。还支持*和?两种通配符。

    一个headerConfig结构体中仅能设置一个Key,如需设置多个Key,请配置多组HeaderConfig规则块。

    {
      "type": "Header",
      "headerConfig": {
         "key": "gray-hello",
         "values": [
            "value1",
            "value2"
         ]
      } 
    }

    cookieConfig

    触发转发的Cookie,仅当type参数值为Cookie时使用。Cookie是键值对的形式,需要分别设置值:

    • 键(key):键的长度为1~100个字符,且首尾字符不能为空格。
    • 值(value):一个键下配置一个值,值的长度为1~100个字符。

    支持输入多个Cookie键值对,键值对支持英文字母、数字和特殊字符!%'"()*+,./:=?@^-_`~。

    设置cookieConfig时,values字段中支持设置多个key,value对数组,多个数组之间为或关系。

    { 
      "type": "Cookie", 
      "cookieConfig": { 
         "values": [ 
            { 
              "key": "querystringkey1", 
              "value": "querystringvalue2" 
            }, 
            { 
               "key": "querystringkey3", 
               "value": "querystringvalue4" 
            } 
         ] 
      } 
    }

    queryStringConfig

    当请求中的字符串与设置好的转发规则中的字符串相匹配时,触发转发,仅当type参数值为QueryString时使用。

    查询字符串是键值对的形式,需要分别设置值:

    • 键(key):只能包含英文字母、数字和特殊字符!$'()*+,./:;=?@^-_'。
    • 值(value):一个键下可以配置多个值。只能包含英文字母、数字和特殊字符!$'()*+,./:;=?@^-_'。还支持*和?两种通配符。

    queryStringConfig仅能设置一个Key,如需设置多个Key,请配置多组QueryStringConfig规则块。

    { 
       "type": "QueryString", 
       "queryStringConfig": { 
          "key": "testKey", 
          "values": [ 
              "testValue" 
          ] 
       } 
    }

    sourceIpConfig

    触发转发的请求网段,仅当type参数值为SourceIp时使用。

    网段示例: 192.168.1.0/24或2020:50::44/127

    sourceIpConfig无需设置key,仅设置values即可,values为数组。

    { 
       "type": "SourceIp", 
       "sourceIpConfig": { 
          "values": [ 
             "192.168.0.0/16", 
             "172.16.0.0/16" 
          ] 
       } 
    }

  3. 创建Ingress。

    kubectl create -f ingress-test.yaml

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

    ingress/ingress-test created

  4. 查看已创建的Ingress。

    kubectl get ingress
    回显如下,表示Ingress服务创建成功。
    NAME          CLASS    HOSTS     ADDRESS          PORTS   AGE
    ingress-test  cce      *         121.**.**.**     80      10s