更新时间:2024-09-29 GMT+08:00

为ELB Ingress配置多个转发策略

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

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

例如,Nginx应用默认的Web访问路径为“/usr/share/nginx/html”,在为Ingress转发策略添加“/test”路径时,需要应用的Web访问路径下也包含相同路径,即“/usr/share/nginx/html/test”,否则将返回404。

前提条件

Ingress路由到多个服务

您可以使用以下方式路由到多个服务。

  1. 登录CCE控制台,单击集群名称进入集群。
  2. 选择左侧导航栏的“服务”,在右侧选择“路由”页签,单击右上角“创建路由”
  3. 设置Ingress参数。

    本示例中展示配置转发策略的关键参数,其余参数可按需配置,详情请参见通过控制台创建ELB Ingress

    表1 关键参数说明

    参数

    配置说明

    示例

    名称

    自定义Ingress名称。

    ingress-test

    负载均衡器

    选择对接的ELB实例或自动创建ELB实例。

    共享型ELB

    监听器配置

    • 前端协议:可选择“HTTP”“HTTPS”
    • 对外端口:ELB监听器的端口。
    • 前端协议:“HTTP”
    • 对外端口:80

    转发策略配置

    • 域名:实际访问的域名地址,不配置时可通过IP地址访问Ingress。请确保所填写的域名已注册并备案,一旦配置了域名规则后,必须使用域名访问。
    • 路径匹配规则:支持前缀匹配精确匹配正则匹配,请按需选择。
    • 路径:后端应用对外提供访问的路径,此处添加的访问路径要求后端应用内存在相同的路径,否则转发无法生效。
    • 目标服务名称:请选择已有Service或新建Service。页面列表中的查询结果已自动过滤不符合要求的Service。
    • 目标服务访问端口:可选择目标Service的访问端口。

    转发规则一:

    • 域名:www.example.com
    • 路径匹配规则:前缀匹配
    • 路径:/foo
    • 目标服务名称:nginx
    • 目标服务访问端口:80

    转发规则二:

    • 域名:www.example.com
    • 路径匹配规则:前缀匹配
    • 路径:/bar
    • 目标服务名称:nginx
    • 目标服务访问端口:80

    转发规则三:

    • 域名:foo.example.com
    • 路径匹配规则:前缀匹配
    • 路径:/
    • 目标服务名称:nginx
    • 目标服务访问端口:80
    图1 路由到多个服务

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

    vi ingress-test.yaml

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

    1.23及以上版本集群:
    apiVersion: networking.k8s.io/v1
    kind: Ingress 
    metadata: 
      name: ingress-test
      annotations: 
        kubernetes.io/elb.id: <your_elb_id>  #替换为您已有的ELB ID
        kubernetes.io/elb.class: performance  #ELB类型
        kubernetes.io/elb.port: '80'
    spec:
      rules: 
      - host: 'www.example.com'
        http: 
          paths: 
          - path: '/foo'
            backend: 
              service:
                name: <your_service_name>  #替换为您的目标服务名称
                port: 
                  number: 80             #替换为您的目标服务端口
            property:
              ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
            pathType: ImplementationSpecific
          - path: '/bar'
            backend: 
              service:
                name: <your_service_name>  #替换为您的目标服务名称
                port: 
                  number: 80             #替换为您的目标服务端口
            property:
              ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH
            pathType: ImplementationSpecific
      - host: 'foo.example.com'
        http: 
          paths: 
          - path: '/'
            backend: 
              service:
                name: <your_service_name>  #替换为您的目标服务名称
                port: 
                  number: 80             #替换为您的目标服务端口
            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
      annotations: 
        kubernetes.io/ingress.class: cce
        kubernetes.io/elb.port: '80'
        kubernetes.io/elb.id: <your_elb_id>  #替换为您已有的ELB ID
        kubernetes.io/elb.class: performance  #ELB类型
    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

  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    www.example.com,foo.example.com     121.**.**.**     80      10s