ALB Ingress服务高级用法

ACK集群中,ALB Ingress对集群服务(Service)中外部可访问的API对象进行管理,提供七层负载均衡能力。本文介绍如何使用ALB Ingress将来自不同域名或URL路径的请求转发给不同的后端服务器组、将HTTP访问重定向至HTTPS以及实现灰度发布等功能。

索引

功能分类

配置示例

ALB Ingress配置

配置健康检查

端口/协议配置

转发策略配置

高级配置

基于域名转发请求

通过创建一个简单的Ingress,根据指定的正常域名或空域名转发请求,示例如下。

基于正常域名转发请求

以下 YAML 示例将路由路径配置为 /hello,访问 demo.domain.ingress.top/hello 时会转发到后端服务。

  1. 部署以下模板,分别创建Service、DeploymentIngress,将访问请求通过Ingress的域名转发至Service。

    展开查看示例YAML

    1.19及之后版本集群

    apiVersion: v1
    kind: Service
    metadata:
      name: demo-service
      namespace: default
    spec:
      ports:
        - name: port1
          port: 80
          protocol: TCP
          targetPort: 8080
      selector:
        app: demo
      sessionAffinity: None
      type: NodePort
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: demo
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: demo
      template:
        metadata:
          labels:
            app: demo
        spec:
          containers:
            - image: registry.cn-hangzhou.aliyuncs.com/alb-sample/cafe:v1
              imagePullPolicy: IfNotPresent
              name: demo
              ports:
                - containerPort: 8080
                  protocol: TCP
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: demo
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - host: demo.domain.ingress.top
          http:
            paths:
              - backend:
                  service:
                    name: demo-service
                    port: 
                      number: 80
                path: /hello
                pathType: ImplementationSpecific

    1.19版本之前集群

    apiVersion: v1
    kind: Service
    metadata:
      name: demo-service
      namespace: default
    spec:
      ports:
        - name: port1
          port: 80
          protocol: TCP
          targetPort: 8080
      selector:
        app: demo
      sessionAffinity: None
      type: NodePort
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: demo
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: demo
      template:
        metadata:
          labels:
            app: demo
        spec:
          containers:
            - image: registry.cn-hangzhou.aliyuncs.com/alb-sample/cafe:v1
              imagePullPolicy: IfNotPresent
              name: demo
              ports:
                - containerPort: 8080
                  protocol: TCP
    ---
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: demo
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - host: demo.domain.ingress.top
          http:
            paths:
              - backend:
                  serviceName: demo-service
                  servicePort: 80
                path: /hello
                pathType: ImplementationSpecific
  2. 执行以下命令,通过指定的正常域名访问服务。

    替换ADDRESSALB实例对应的域名地址,可通过kubectl get ing获取。

    curl -H "host: demo.domain.ingress.top" <ADDRESS>/hello

    预期输出:

    {"hello":"coffee"}

基于空域名转发请求

以下 YAML 示例将域名配置为空,路由路径配置为 /hello,访问<ADDRESS>/hello时会转发到后端服务。

  1. 部署以下模板,创建Ingress。

    展开查看示例YAML

    1.19及之后版本集群

    
    apiVersion: v1
    kind: Service
    metadata:
      name: demo-service
      namespace: default
    spec:
      ports:
        - name: port1
          port: 80
          protocol: TCP
          targetPort: 8080
      selector:
        app: demo
      sessionAffinity: None
      type: NodePort
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: demo
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: demo
      template:
        metadata:
          labels:
            app: demo
        spec:
          containers:
            - image: registry.cn-hangzhou.aliyuncs.com/alb-sample/cafe:v1
              imagePullPolicy: IfNotPresent
              name: demo
              ports:
                - containerPort: 8080
                  protocol: TCP
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: demo
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - host: ""
          http:
            paths:
              - backend:
                  service:
                    name: demo-service
                    port: 
                      number: 80
                path: /hello
                pathType: ImplementationSpecific

    1.19版本之前集群

    apiVersion: v1
    kind: Service
    metadata:
      name: demo-service
      namespace: default
    spec:
      ports:
        - name: port1
          port: 80
          protocol: TCP
          targetPort: 8080
      selector:
        app: demo
      sessionAffinity: None
      type: NodePort
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: demo
      namespace: default
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: demo
      template:
        metadata:
          labels:
            app: demo
        spec:
          containers:
            - image: registry.cn-hangzhou.aliyuncs.com/alb-sample/cafe:v1
              imagePullPolicy: IfNotPresent
              name: demo
              ports:
                - containerPort: 8080
                  protocol: TCP
    ---
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: demo
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - host: ""
          http:
            paths:
              - backend:
                  serviceName: demo-service
                  servicePort: 80
                path: /hello
                pathType: ImplementationSpecific
  2. 执行以下命令,通过空域名访问服务。

    替换ADDRESSALB实例对应的域名地址,可通过kubectl get ing获取。

    curl <ADDRESS>/hello

    预期输出:

    {"hello":"coffee"}

基于URL路径转发请求

ALB Ingress支持按照URL转发请求,可以通过匹配规则(pathType)字段设置不同的URL匹配策略。pathType支持以下三种匹配方式。

  • 完整匹配(Exact):完全匹配请求URL路径。

  • 默认(ImplementationSpecific):Ingress控制器实现的具体逻辑决定,在ALB Ingress Controller中为完整匹配(Exact)。若未指定path字段,ALB Ingress会默认使用/作为path。

  • 前缀匹配(Prefix):匹配请求URL路径的前缀部分。

重要
  • pathType设置为ExactPrefix时,必须将path设置为非空的绝对路径。否则,Ingress资源将因校验失败而无法创建。

  • URL匹配策略可能存在冲突的情况,此时将会按照转发规则优先级进行排序,然后再转发请求,详情请参见配置转发规则优先级

  • 简单路径(/、/foo、/foo/)

    匹配方式

    规则路径(路由规则)

    请求路径(用户访问)

    是否命中此规则

    前缀匹配(Prefix)

    /

    /(匹配所有规则)

    /foo

    • /foo

    • /foo/

    /foo/

    • /foo

    • /foo/

    /aaa

    /ccc

    否,未匹配前缀。

    完整匹配(Exact)或默认(ImplementationSpecific)

    /foo

    /foo

    /bar

    /foo/

    /foo/

    /foo

  • 分层路径(/aaa/bb、/aaa/bbb、/aaa/bbb/)

    匹配方式

    规则路径(路由规则)

    请求路径(用户访问)

    是否命中此规则

    前缀匹配(Prefix)

    /aaa/bb

    /aaa/bbb

    /aaa/bbb

    /aaa/bbb

    /aaa/bbb/

    /aaa/bbb

    是,忽略规则路径尾部斜线。

    /aaa/bbb

    /aaa/bbb/

    是,匹配请求路径尾部斜线。

    /aaa/bbb/ccc

    是,匹配请求路径的子路径。

  • 同时设置两条规则路径

    匹配方式

    规则路径(路由规则)

    请求路径(用户访问)

    是否命中此规则

    前缀匹配(Prefix)

    • /

    • /aaa

    /aaa/ccc

    是,请求路径匹配规则路径的/前缀。

    • /aaa

    • /

    /aaa/ccc

    是,请求路径匹配规则路径的/aaa前缀。

    /ccc

    是,请求路径匹配规则路径的/前缀。

    • /aaa

    • /bbb

    /ccc

    否,未匹配前缀。

三种匹配方式的示例如下:

前缀匹配(Prefix)

URL路径采用以/分隔的前缀匹配方式,匹配时区分大小写,并按路径中的每个元素逐级比较。

以下示例 YAML 中,当路由规则配置为/时,所有以/开头的路径(如/hello等)都能被匹配和访问。

  1. 部署以下模板,创建Ingress。

    展开查看示例YAML

    1.19及之后版本集群

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: demo-path-prefix
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
            - path: /
              backend:
                service:
                  name: demo-service
                  port:
                    number: 80
              pathType: Prefix

    1.19版本之前集群

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: demo-path-prefix
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
            - path: /
              backend:
                serviceName: demo-service
                servicePort: 80
              pathType: Prefix
  2. 执行以下命令,访问服务。

    替换ADDRESSALB实例对应的域名地址,可通过kubectl get ing获取。

    curl <ADDRESS>/hello
  3. 预期输出:

    {"hello":"coffee"}

完整匹配(Exact)或默认(ImplementationSpecific)

在以下示例 YAML 中,路由规则配置为 /hello 时,仅能匹配并访问 /hello 路径。

  1. 部署以下模板,创建Ingress。

    展开查看示例YAML

    1.19及之后版本集群

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: demo-path
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
            - path: /hello
              backend:
                service:
                  name: demo-service
                  port: 
                    number: 80
              pathType: Exact

    1.19版本之前集群

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: demo-path
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
            - path: /hello
              backend:
                serviceName: demo-service
                servicePort: 80
              pathType: Exact
  2. 执行以下命令,访问服务。

    替换ADDRESSALB实例对应的域名地址,可通过kubectl get ing获取。

    curl <ADDRESS>/hello

    预期输出:

    {"hello":"coffee"}

配置健康检查

ALB Ingress支持配置健康检查,可以通过设置以下注解来实现。

展开查看完整YAML示例

1.19及之后版本集群

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
    alb.ingress.kubernetes.io/healthcheck-enabled: "true"
    alb.ingress.kubernetes.io/healthcheck-path: "/"
    alb.ingress.kubernetes.io/healthcheck-protocol: "HTTP"
    alb.ingress.kubernetes.io/healthcheck-httpversion: "HTTP1.1"
    alb.ingress.kubernetes.io/healthcheck-method: "HEAD"
    alb.ingress.kubernetes.io/healthcheck-code: "http_2xx"
    alb.ingress.kubernetes.io/healthcheck-timeout-seconds: "5"
    alb.ingress.kubernetes.io/healthcheck-interval-seconds: "2"
    alb.ingress.kubernetes.io/healthy-threshold-count: "3"
    alb.ingress.kubernetes.io/unhealthy-threshold-count: "3"
spec:
  ingressClassName: alb
  rules:
  - http:
      paths:
      # 配置Context Path
      - path: /tea
        backend:
          service:
            name: tea-svc
            port:
              number: 80
      # 配置Context Path
      - path: /coffee
        backend:
          service:
            name: coffee-svc
            port:
              number: 80

1.19版本之前集群

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
    alb.ingress.kubernetes.io/healthcheck-enabled: "true"
    alb.ingress.kubernetes.io/healthcheck-path: "/"
    alb.ingress.kubernetes.io/healthcheck-protocol: "HTTP"
    alb.ingress.kubernetes.io/healthcheck-method: "HEAD"
    alb.ingress.kubernetes.io/healthcheck-httpcode: "http_2xx"
    alb.ingress.kubernetes.io/healthcheck-timeout-seconds: "5"
    alb.ingress.kubernetes.io/healthcheck-interval-seconds: "2"
    alb.ingress.kubernetes.io/healthy-threshold-count: "3"
    alb.ingress.kubernetes.io/unhealthy-threshold-count: "3"
spec:
  ingressClassName: alb
  rules:
  - http:
      paths:
      # 配置Context Path。
      - path: /tea
        backend:
          serviceName: tea-svc
          servicePort: 80
      # 配置Context Path。
      - path: /coffee
        backend:
          serviceName: coffee-svc
          servicePort: 80

注解示例如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
    alb.ingress.kubernetes.io/healthcheck-enabled: "true"
    alb.ingress.kubernetes.io/healthcheck-path: "/"
    alb.ingress.kubernetes.io/healthcheck-protocol: "HTTP"
    alb.ingress.kubernetes.io/healthcheck-httpversion: "HTTP1.1"
    alb.ingress.kubernetes.io/healthcheck-method: "HEAD"
    alb.ingress.kubernetes.io/healthcheck-code: "http_2xx"
    alb.ingress.kubernetes.io/healthcheck-timeout-seconds: "5"
    alb.ingress.kubernetes.io/healthcheck-interval-seconds: "2"
    alb.ingress.kubernetes.io/healthy-threshold-count: "3"
    alb.ingress.kubernetes.io/unhealthy-threshold-count: "3"
spec:
... ...

参数

描述

默认值

alb.ingress.kubernetes.io/healthcheck-enabled

是否开启后端服务器组的健康检查。

  • true:开启健康检查。

  • false:不开启健康检查。

false

alb.ingress.kubernetes.io/healthcheck-path

健康检查路径。

/

alb.ingress.kubernetes.io/healthcheck-protocol

健康检查使用的协议。

  • HTTP:使用HTTP协议,通过发送HEADGET请求模拟浏览器的访问行为检查服务器应用是否健康。

  • HTTPS:使用HTTPS协议,通过发送HEADGET请求模拟浏览器的访问行为检查服务器应用是否健康。

  • TCP:使用TCP协议,通过发送SYN握手报文检测服务器端口是否存活。

  • GRPC:使用gRPC协议,通过发送POSTGET请求检查服务器应用是否健康。

HTTP

alb.ingress.kubernetes.io/healthcheck-httpversion

HTTP协议版本,healthcheck-protocolHTTPHTTPS时生效。

  • HTTP1.0

  • HTTP1.1

HTTP1.1

alb.ingress.kubernetes.io/healthcheck-method

健康检查的方法。

  • HEAD

  • POST

  • GET

重要

healthcheck-protocolGRPC时,需要选择POSTGET

HEAD

alb.ingress.kubernetes.io/healthcheck-httpcode

健康检查状态码。仅当探测请求成功且返回指定状态码时,才认为该后端服务器状态正常。

可以填入以下选项中的任意一个或多个组合,多个状态码用英文半角逗号(,)分隔:

  • http_2xx

  • http_3xx

  • http_4xx

  • http_5xx

http_2xx

alb.ingress.kubernetes.io/healthcheck-code

健康检查状态码,仅当探测请求成功且返回指定状态码时,才认为该后端服务器状态正常。与healthcheck-httpcode同时使用时,以此字段为准。

可选参数依赖于healthcheck-protocol中填入的值:

  • HTTPHTTPS

    可以填入以下选项中的任意一个或多个组合,多个状态码用英文半角逗号(,)分隔:

    • http_2xx

    • http_3xx

    • http_4xx

    • http_5xx

  • GRPC:取值范围:[0, 99]。

    支持范围输入,最多填入20个范围值,多个范围值使用半角逗号(,)分隔。

  • HTTPHTTPS

    默认值:http_2xx

  • GRPC

    默认值:0

alb.ingress.kubernetes.io/healthcheck-timeout-seconds

健康检查超时时间,单位秒(s)。取值范围:[1, 300]。

5

alb.ingress.kubernetes.io/healthcheck-interval-seconds

健康检查间隔周期,单位秒(s)。取值范围:[1, 50]。

2

alb.ingress.kubernetes.io/healthy-threshold-count

健康检查成功多少次判定为成功。取值范围:[2, 10]。

3

alb.ingress.kubernetes.io/unhealthy-threshold-count

健康检查失败多少次判定为失败。取值范围:[2, 10]。

3

alb.ingress.kubernetes.io/healthcheck-connect-port

健康检查使用的端口。

0

说明

0表示使用后端服务器的端口进行健康检查。

配置HTTP重定向至HTTPS

ALB Ingress通过配置以下注解,实现将 HTTP 请求重定向至 HTTPS 443 端口。

重要
  • 仅支持配置在监听端口为80HTTP转发规则上。

  • 仅支持与自定义转发动作:RemoveHeaderInsertHeader、跨域Cors相关注解配合使用。

  • 配置此注解需要保证AlbConfig中已配置443端口的HTTPS监听,请参见通过AlbConfig配置ALB监听

展开查看完整示例YAML

1.19及之后版本集群

apiVersion: v1
kind: Service
metadata:
  name: demo-service-ssl
  namespace: default
spec:
  ports:
    - name: port1
      port: 80
      protocol: TCP
      targetPort: 8080
  selector:
    app: demo-ssl
  sessionAffinity: None
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-ssl
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo-ssl
  template:
    metadata:
      labels:
        app: demo-ssl
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/alb-sample/cafe:v1
          imagePullPolicy: IfNotPresent
          name: demo-ssl
          ports:
            - containerPort: 8080
              protocol: TCP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/ssl-redirect: "true"
  name: demo-ssl
  namespace: default
spec:
  ingressClassName: alb
  tls:
  - hosts:
    - ssl.alb.ingress.top
  rules:
    - host: ssl.alb.ingress.top
      http:
        paths:
          - backend:
              service:
                name: demo-service-ssl
                port: 
                  number: 80
            path: /
            pathType: Prefix

1.19版本之前集群

apiVersion: v1
kind: Service
metadata:
  name: demo-service-ssl
  namespace: default
spec:
  ports:
    - name: port1
      port: 80
      protocol: TCP
      targetPort: 8080
  selector:
    app: demo-ssl
  sessionAffinity: None
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-ssl
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo-ssl
  template:
    metadata:
      labels:
        app: demo-ssl
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/alb-sample/cafe:v1
          imagePullPolicy: IfNotPresent
          name: demo-ssl
          ports:
            - containerPort: 8080
              protocol: TCP
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/ssl-redirect: "true"
  name: demo-ssl
  namespace: default
spec:
  ingressClassName: alb
  tls:
  - hosts:
    - ssl.alb.ingress.top
  rules:
    - host: ssl.alb.ingress.top
      http:
        paths:
          - backend:
              serviceName: demo-service-ssl
              servicePort: 80
            path: /
            pathType: Prefix

参数

描述

注解示例

alb.ingress.kubernetes.io/ssl-redirect: "true"

将 HTTP 请求重定向到 HTTPS 443 端口。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/ssl-redirect: "true"
  name: demo-ssl
 ... ...

支持后端HTTPSgRPC协议

当前 ALB 支持 HTTPS 和 gRPC 作为后端协议,您只需在 Ingress 中添加以下注解。

展开查看完整YAML示例

1.19及之后版本集群

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/backend-protocol: "grpc"
  name: demo-alb-ingress
spec:
  ingressClassName: alb
  tls:
  - hosts:
    - demo.alb.ingress.top
  rules:
  - host: demo.alb.ingress.top
    http:
      paths:  
      - path: /
        pathType: Prefix
        backend:
          service:
            name: grpc-demo-svc
            port:
              number: 9080

1.19版本之前集群

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/backend-protocol: "grpc"
  name: demo-alb-ingress
spec:
  ingressClassName: alb
  tls:
  - hosts:
    - demo.alb.ingress.top
  rules:
    - host: demo.alb.ingress.top
      http:
        paths:
          - backend:
              serviceName: grpc-demo-svc
              servicePort: 9080
            path: /
            pathType: Prefix
说明

Ingress创建后,后端协议不支持修改,如果您需要变更协议,请删除重建Ingress。

参数

描述

YAML示例

alb.ingress.kubernetes.io/backend-protocol

  • https:后端服务使用 HTTPS 协议。

  • grpc:后端服务使用 gRPC 协议。

    使用 Ingress 转发 gRPC 服务时,需为对应域名配置 SSL 证书,并通过 TLS 协议进行通信。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/backend-protocol: "grpc"
  name: demo-alb-ingress
... ...

配置正则表达式

使用注解alb.ingress.kubernetes.io/use-regex:"true"启用正则模式,并在自定义转发条件或转发动作中配置相应的正则表达式。

重要

注解仅在pathType: Prefix的路径规则下生效。

展开查看完整YAML示例

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
   alb.ingress.kubernetes.io/use-regex: "true"  ## 允许使用正则表达式。
   alb.ingress.kubernetes.io/conditions.<YOUR-SVC-NAME>: | ## <YOUR-SVC-NAME>需替换为实际的 Service 名称,必须与下面 backend.service.name一致。
     [{
       "type": "Path",
       "pathConfig": {
           "values": [
              "~*/pathvalue1", ## 正则表达式前需要添加~*或~作为正则标志。~*或~后的内容为实际生效的正则表达式。~*表示区分大小写的正则匹配,~表示不区分大小写的正则匹配。
              "/pathvalue2"    ## 精确匹配前无需添加~*。
           ]
       }
      }]
  name: ingress-example
spec:
  ingressClassName: alb
  rules:
   - http:
      paths:
      - path: /test-path-for-alb
        pathType: Prefix
        backend:
          service:
            name: <YOUR-SVC-NAME> ## 此处<YOUR-SVC-NAME>需和注解中的自定义转发条件注明的服务名称保持一致,用于表示对应关系。
            port:
              number: 88

参数

描述

alb.ingress.kubernetes.io/use-regex: "true"

启用正则表达式。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
   alb.ingress.kubernetes.io/use-regex: "true"  ## 允许使用正则表达式。
   alb.ingress.kubernetes.io/conditions.<YOUR-SVC-NAME>: | ## <YOUR-SVC-NAME>需替换为实际的 Service 名称,必须与下面 backend.service.name一致。
     [{
       "type": "Path",         ## 支持Host
       "pathConfig": {
           "values": [
              "~*/pathvalue1", ## 正则表达式前需要添加~*或~作为正则标志。~*或~后的内容为实际生效的正则表达式。~*表示区分大小写的正则匹配,~表示不区分大小写的正则匹配。
              "/pathvalue2"    ## 精确匹配前无需添加~*。
           ]
       }
      }]
... ...

alb.ingress.kubernetes.io/conditions.<YOUR-SVC-NAME>

配置自定义转发条件。更多详情请参见转发条件介绍

<YOUR-SVC-NAME>需替换为实际的 Service 名称,需要和下面backend.service.name一致。

正则匹配规则说明:

匹配对象

前缀

规则示例

客户端路径

是否命中

说明

域名

以 ~开头

~test.example.com

test.EXAMPLE.com

域名支持不区分大小写正则匹配。

路径

以 ~开头

~/api

/API

路径支持不区分大小写正则匹配。

以 ~* 开头

~*/api

/Api

路径支持区分大小写正则匹配。

配置重写

ALB Ingress支持重写(Rewrite)功能,在接收到客户端请求后,修改请求中的Path部分,再发送给后端Service。重写通过以下两个Annotation实现:

  • alb.ingress.kubernetes.io/rewrite-target: /<path>/${number}:启用重写,并指定重写后的路径。

    重要
    • 使用${number}格式表示从原路径中通过正则表达式获取的变量,可以配置为${1}${2}${3}中的一个或多个,最多可从原路径中获取三个变量。

    • IngresspathType需设置为Prefix

  • alb.ingress.kubernetes.io/use-regex:是否在path中使用正则表达式,配置rewrite-target后默认开启。

    • "true":使用正则表达式。

    • "false":不使用正则表达式。如果path中有特殊符号(“%#;!()[]^,”\"),Ingress资源会创建失败。

配置示例

示例场景一:移除前缀

下方的YAML示例中path: /something(/|$)(.*)通过正则表达式将客户端请求的路径分为了三个部分:

  • /something:匹配需要剥离的前缀。

  • (/|$):第一捕获组,匹配/something后的/$(路径结尾)。

  • (.*):第二捕获组,匹配/something/后的全部内容,在重写后的路径中通过${2}使用。

alb.ingress.kubernetes.io/rewrite-target注解中配置的重写路径为/(路径标准前缀)+${2}(第二捕获组的内容),路径的重写效果如下:

客户端原始路径

是否匹配Path正则表达式

重写后路径

/something

匹配,第二捕获组为空。

/

/something/

匹配,第二捕获组为空。

/

/something/new

匹配,第二捕获组的内容为new

/new

/something-new/item

不匹配,在本示例中未匹配到路由规则,ALB Ingress返回503状态码。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: rewrite-ingress
  annotations:
    alb.ingress.kubernetes.io/use-regex: "true" # 允许path字段使用正则表达式。
    alb.ingress.kubernetes.io/rewrite-target: /${2} # 该注解支持正则表达式替换。
spec:
  ingressClassName: alb
  rules:
  - host: demo.alb.ingress.top
    http:
      paths:
      - path: /something(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: rewrite-svc
            port:
              number: 9080

示例场景二:捕获并重新排列多个部分

下方示例捕获路径/items/(.*)/(.*)/(.*)中的多个部分并进行重新排列,并且在用户无感的情况下更改了URL的格式(改为类POST形式)。重写路径为/(路径标准前缀)+${2}(第二捕获组的内容)+?code=+${3}(第三捕获组的内容),路径的重写效果如下:

示例中明确要求路径中有四个分段,使用这种方式要求客户端使用的路径为固定格式。

客户端原始路径

是否匹配Path正则表达式

重写后路径

/items/electronics/computers/554

匹配,第二捕获组的内容为computers,第三捕获组的内容为554

/computers?code=554

/items/produce/fruits/12

匹配,第二捕获组的内容为fruits,第三捕获组的内容为12

/fruits?code=12

/items/headphones/5

不匹配,在本示例中未匹配到路由规则,ALB Ingress返回503状态码。

/drinks/41

不匹配,在本示例中未匹配到路由规则,ALB Ingress返回503状态码。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: rewrite-ingress
  annotations:
    alb.ingress.kubernetes.io/use-regex: "true" # 允许path字段使用正则表达式。
    alb.ingress.kubernetes.io/rewrite-target: /${2}?code=${3} # 该注解支持正则表达式替换。
spec:
  ingressClassName: alb
  rules:
  - host: demo.alb.ingress.top
    http:
      paths:
      - path: /items/(.*)/(.*)/(.*)
        pathType: Prefix
        backend:
          service:
            name: rewrite-svc
            port:
              number: 9080

示例场景三:将多个路径重写到单一路径

下方示例通过同时对多个路径(/app-a(/|$)(.*)/app-b(/|$)(.*))进行正则匹配,将多个路径重写到一个单一路径。重写路径为/app-c/+${2}(第二捕获组的内容),路径的重写效果如下:

客户端原始路径

是否匹配Path正则表达式

重写后路径

/app-a/item1

匹配,第二捕获组的内容为item1

/app-c/item1

/app-a/item2

匹配,第二捕获组的内容为item2

/app-c/item2

/app-a/app-a/

匹配,第二捕获组为空。

/app-c/

/drinks/41

不匹配,在本示例中未匹配到路由规则,ALB Ingress返回503状态码。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: rewrite-ingress
  annotations:
    alb.ingress.kubernetes.io/use-regex: "true" # 允许path字段使用正则表达式。
    alb.ingress.kubernetes.io/rewrite-target: /app-c/${2} # 该注解支持正则表达式替换。
spec:
  ingressClassName: alb
  rules:
  - host: demo.alb.ingress.top
    http:
      paths:
      - path: /app-a(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: rewrite-svc
            port:
              number: 9080
      - path: /app-b(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: rewrite-svc
            port:
              number: 9080

示例场景四:重写域名

alb.ingress.kubernetes.io/rewrite-target 注解仅支持更改路径,如需更改URL中的其他部分,例如域名与参数,请使用自定义转发规则

验证重写规则匹配

使用sed命令可以提前测试客户端使用的特定路径是否匹配path中配置的正则表达式,并查看重写后的新路径。

示例场景二:捕获并重新排列多个部分中的捕获路径/items/(.*)/(.*)/(.*)和重写规则/${2}?code=${3}为例:

  1. 将下方的示例命令保存到path2.txt

    /items/electronics/computers/554
    /items/produce/fruits/12
    /items/headphones/5
    /drinks/41
  2. 查看路径是否匹配,以及重写后的路径:

    下方命令中对示例中的path正则表达式(/items/(.*)/(.*)/(.*))和重写后的路径(/${2}?code=${3})进行了改写,在sed命令中特殊字符/前需要使用转义字符\,捕获组内容的写法由${2}改为\2
    sed -E 's#\/items\/(.*)\/(.*)\/(.*)#Matched: [&]  --->  Rewritten: [/\2?code=\3]#' path2.txt

    预期输出如下,前两条路径匹配重写规则,会被重写到新的路径;后两条路径不匹配,不会被重写。

    Matched: [/items/electronics/computers/554]  --->  Rewritten: [/computers?code=554]
    Matched: [/items/produce/fruits/12]  --->  Rewritten: [/fruits?code=12]
    /items/headphones/5
    /drinks/41

配置自定义监听端口

ALB Ingress 支持通过注解自定义监听端口,可实现服务同时暴露 80(HTTP)和 443(HTTPS)端口。

展开查看完整YAML示例

1.19及之后版本集群

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
   alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]'
spec:
  ingressClassName: alb
  tls:
  - hosts:
    - demo.alb.ingress.top
  rules:
  - host: demo.alb.ingress.top
    http:
      paths:
      - path: /tea
        pathType: ImplementationSpecific
        backend:
          service:
            name: tea-svc
            port:
              number: 80

1.19版本之前集群

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]'
  name: cafe-ingress
spec:
  ingressClassName: alb
  tls:
  - hosts:
    - demo.alb.ingress.top
  rules:
    - host: demo.alb.ingress.top
      http:
        paths:
          - backend:
              serviceName: tea-svc
              servicePort: 80
            path: /tea
            pathType: ImplementationSpecific
重要

ALB不支持直接在Ingress中创建新的监听。为确保Ingress能够正常工作,您需要先在AlbConfig中创建所需的监听端口和协议,然后在Ingress中将这些监听与服务关联起来。关于如何创建ALB监听,请参见通过AlbConfig配置ALB监听

参数

描述

YAML示例

alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]'

使服务同时监听 80 和 443 端口。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
   alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]'
... ...

配置转发规则优先级

默认情况下,ALB 转发规则的优先级排序依据如下:

  • 不同Ingress按照namespace/name的字典顺序优先级进行排列,字典顺序小的优先级高。

    先比较 namespace,若相同则再比 name,各字符逐一比较。
  • 同一个Ingress按照rule字段先后顺序进行排序,配置在上面的优先级高。

    rules:
      - host: www.example.com
        http: ...
      - host: www.test.com
        http: ...

若不修改Ingressnamespace/name字段,可以配置以下Ingress注解定义ALB转发规则优先级:

展开查看完整的YAML示例

1.19及之后版本集群

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
   alb.ingress.kubernetes.io/order: "2"
spec:
  ingressClassName: alb
  rules:
  - host: demo.alb.ingress.top
    http:
      paths:
      - path: /tea
        pathType: ImplementationSpecific
        backend:
          service:
            name: tea-svc
            port:
              number: 80

1.19版本之前集群

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/order: "2" 
  name: cafe-ingress
spec:
  ingressClassName: alb
  rules:
    - host: demo.alb.ingress.top
      http:
        paths:
          - backend:
              serviceName: tea-svc
              servicePort: 80
            path: /tea
            pathType: ImplementationSpecific

参数

描述

取值范围

YAML示例

alb.ingress.kubernetes.io/order

定义 ALB 转发规则的优先级,值越小优先级越高。

同一个监听内规则优先级必须唯一。

[1,1000]

默认值:10

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
   alb.ingress.kubernetes.io/order: "2"
spec:
... ...

通过注解实现灰度发布

ALB支持复杂路由处理,具备基于 Header、Cookie 及权重的灰度发布能力。可通过配置以下相关注解灵活实现各类灰度发布策略。关于灰度发布最佳实践,请参见通过ALB Ingress实现灰度发布

参数

描述

说明

alb.ingress.kubernetes.io/canary: "true"

开启灰度发布能力

  • 灰度流量可通过 Header、Cookie 或权重进行分配。

    分配的优先级顺序为:Header > Cookie > 权重(优先级由高到低)。
  • 灰度过程中不能删除原有的规则,否则会导致服务异常。待灰度验证无误后,将原有Ingress中的后端服务Service更新为新的Service,最后将灰度的Ingress删除。

  • 基于指定Header实现灰度流量分配

    参数

    描述

    YAML示例

    alb.ingress.kubernetes.io/canary-by-header

    该规则允许自定义请求的 Header 及其对应值,需同时配置两个注解。

    • 当请求中的headerheader-value与设置的值匹配时,请求流量会被分配到灰度服务入口。

    • 其他不匹配的请求会根据灰度优先级分配到后续规则对应的灰度服务。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        alb.ingress.kubernetes.io/order: "1"
        alb.ingress.kubernetes.io/canary: "true"
        alb.ingress.kubernetes.io/canary-by-header: "location"
        alb.ingress.kubernetes.io/canary-by-header-value: "hz"
      name: demo-canary
    spec:
    ... ...

    alb.ingress.kubernetes.io/canary-by-header-value

    当请求中的 Header 包含 location: hz 时,流量将被路由到灰度服务;其余请求则会根据灰度权重策略分配到对应的灰度服务。配置示例如下。

    展开查看完整YAML示例

    1.19及之后版本集群

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        alb.ingress.kubernetes.io/order: "1"
        alb.ingress.kubernetes.io/canary: "true"
        alb.ingress.kubernetes.io/canary-by-header: "location"
        alb.ingress.kubernetes.io/canary-by-header-value: "hz"
      name: demo-canary
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
              - backend:
                  service:
                    name: demo-service-hello
                    port: 
                      number: 80
                path: /hello
                pathType: ImplementationSpecific

    1.19版本之前集群

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        alb.ingress.kubernetes.io/order: "1"
        alb.ingress.kubernetes.io/canary: "true"
        alb.ingress.kubernetes.io/canary-by-header: "location"
        alb.ingress.kubernetes.io/canary-by-header-value: "hz"
      name: demo-canary
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
              - backend:
                  serviceName: demo-service-hello
                  servicePort: 80
                path: /hello
                pathType: ImplementationSpecific
  • 基于指定Cookie实现灰度流量分配

    参数

    Cookie取值

    YAML示例

    alb.ingress.kubernetes.io/canary-by-cookie

    • always:请求流量将全部分配到灰度服务入口

    • never:请求流量不会分配到灰度服务入口

    基于Cookie的灰度不支持设置自定义,只有alwaysnever

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        alb.ingress.kubernetes.io/order: "2"
        alb.ingress.kubernetes.io/canary: "true"
        alb.ingress.kubernetes.io/canary-by-cookie: "demo"
      name: demo-canary-cookie
      ... ... 

    请求头中有 Cookie: demo=always,则流量路由到灰度服务;如果请求头中有 Cookie: demo=never,则流量不会路由到灰度服务。配置示例如下。

    展开查看完整实例YAML

    1.19及之后版本集群

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        alb.ingress.kubernetes.io/order: "2"
        alb.ingress.kubernetes.io/canary: "true"
        alb.ingress.kubernetes.io/canary-by-cookie: "demo"
      name: demo-canary-cookie
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
              - backend:
                  service:
                    name: demo-service-hello
                    port: 
                      number: 80
                path: /hello
                pathType: ImplementationSpecific

    1.19版本之前集群

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        alb.ingress.kubernetes.io/order: "2"
        alb.ingress.kubernetes.io/canary: "true"
        alb.ingress.kubernetes.io/canary-by-cookie: "demo"
      name: demo-canary-cookie
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
              - backend:
                  serviceName: demo-service-hello
                  servicePort: 80
                path: /hello
                pathType: ImplementationSpecific
  • 按权重进行流量分配

    参数

    描述

    YAML示例

    alb.ingress.kubernetes.io/canary-weight

    设置请求到指定服务的百分比。取值范围:0~100的整数。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        alb.ingress.kubernetes.io/order: "3"
        alb.ingress.kubernetes.io/canary: "true"
        alb.ingress.kubernetes.io/canary-weight: "50"
      name: demo-canary-weight

    配置灰度服务的权重为50%,示例如下:

    展开查看完整YAML示例

    1.19及之后版本集群

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      annotations:
        alb.ingress.kubernetes.io/order: "3"
        alb.ingress.kubernetes.io/canary: "true"
        alb.ingress.kubernetes.io/canary-weight: "50"
      name: demo-canary-weight
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
              - backend:
                  service:
                    name: demo-service-hello
                    port: 
                      number: 80
                path: /hello
                pathType: ImplementationSpecific

    1.19版本之前集群

    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      annotations:
        alb.ingress.kubernetes.io/order: "3"
        alb.ingress.kubernetes.io/canary: "true"
        alb.ingress.kubernetes.io/canary-weight: "50"
      name: demo-canary-weight
      namespace: default
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
              - backend:
                  serviceName: demo-service-hello
                  servicePort: 80
                path: /hello
                pathType: ImplementationSpecific

通过注解实现会话保持

ALB Ingress支持通过以下注解实现会话保持。

展开查看完整YAML示例

1.19及之后版本集群

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress-v3
  annotations:
    alb.ingress.kubernetes.io/sticky-session: "true"
    alb.ingress.kubernetes.io/sticky-session-type: "Insert"   # 支持自定义cookie时,植入cookie类型需为Server。
    alb.ingress.kubernetes.io/cookie-timeout: "1800"
    alb.ingress.kubernetes.io/cookie: "test"
spec:
  ingressClassName: alb
  rules:
  - http:
      paths:
      - backend:
          service:
            name: tea-svc
            port:
              number: 80
        path: /tea2
        pathType: ImplementationSpecific
      - backend:
          service:
            name: coffee-svc
            port:
              number: 80
        path: /coffee2
        pathType: ImplementationSpecific

1.19版本之前集群

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: cafe-ingress-v3
  annotations:
    alb.ingress.kubernetes.io/sticky-session: "true"
    alb.ingress.kubernetes.io/sticky-session-type: "Insert"  # 支持自定义cookie时,植入cookie类型需为Server。
    alb.ingress.kubernetes.io/cookie-timeout: "1800"
    alb.ingress.kubernetes.io/cookie: "test"
spec:
  ingressClassName: alb
  rules:
  - http:
      paths:
      #配置Context Path。
      - path: /tea2
        pathType: ImplementationSpecific
        backend:
          serviceName: tea-svc
          servicePort: 80
      #配置Context Path。
      - path: /coffee2
        pathType: ImplementationSpecific
        backend:
          serviceName: coffee-svc
          servicePort: 80

注解示例如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress-v3
  annotations:
    alb.ingress.kubernetes.io/sticky-session: "true"
    alb.ingress.kubernetes.io/sticky-session-type: "Insert"   # 支持自定义cookie时,植入cookie类型需为Server。
    alb.ingress.kubernetes.io/cookie-timeout: "1800"
    alb.ingress.kubernetes.io/cookie: "test"
spec:
... ...

参数

描述

默认值

alb.ingress.kubernetes.io/sticky-session

是否启用会话保持。

  • true:开启

  • false:关闭

false

alb.ingress.kubernetes.io/sticky-session-type

Cookie的处理方式。

  • Insert:植入Cookie。客户端第一次访问时,负载均衡会在返回请求中植入Cookie(即在HTTPHTTPS响应报文中插入SERVERID),下次客户端携带此Cookie访问时,负载均衡服务会将请求定向转发给之前记录到的后端服务器。

  • Server:重写Cookie。负载均衡发现用户自定义了Cookie,将会对原来的Cookie进行重写,下次客户端携带新的Cookie访问时,负载均衡服务会将请求定向转发给之前记录到的后端服务器。

说明

当前服务器组StickySessionEnabledtrue时,该参数生效。服务器组参数详情请参见CreateServerGroup - 创建服务器组

Insert

alb.ingress.kubernetes.io/cookie-timeout

Cookie 超时时间(单位:秒)取值:1~86400;

sticky-session-type配置为Insert时,此注解生效。

1000

alb.ingress.kubernetes.io/cookie

自定义Cookie值。

sticky-session-type配置为Server时,此注解必填,不允许为空。

""

指定服务器组负载均衡算法

ALB Ingress 可通过以下注解指定服务器组的负载均衡算法,具体取值及说明见下表。

展开查看完整YAML示例

1.19及之后版本集群

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
    alb.ingress.kubernetes.io/backend-scheduler: "uch" # 此处的uch可按需配置为wrr、sch和wlc。
    alb.ingress.kubernetes.io/backend-scheduler-uch-value: "test" # 仅负载均衡算法为uch时,需要配置此参数。当调度算法为wrr、sch或wlc均无需配置此参数。
spec:
  ingressClassName: alb
  rules:
  - host: demo.alb.ingress.top
    http:
      paths:
      - path: /tea
        pathType: ImplementationSpecific
        backend:
          service:
            name: tea-svc
            port:
              number: 80

1.19版本之前集群

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/backend-scheduler: "uch" # 此处的uch也可按需配置为wrr、sch和wlc。
    alb.ingress.kubernetes.io/backend-scheduler-uch-value: "test" # 仅负载均衡算法为uch时,需要配置此参数。当调度算法为wrr、sch或wlc均无需配置此参数。
  name: cafe-ingress
spec:
  ingressClassName: alb
  rules:
    - host: demo.alb.ingress.top
      http:
        paths:
          - backend:
              serviceName: tea-svc
              servicePort: 80
            path: /tea
            pathType: ImplementationSpecific

参数

取值

描述

alb.ingress.kubernetes.io/backend-scheduler

wrr

加权轮询,权重高的后端服务器被轮询到概率更高(默认值)。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
    alb.ingress.kubernetes.io/backend-scheduler: "uch" # 此处的uch可按需配置为wrr、schwlc。
    alb.ingress.kubernetes.io/backend-scheduler-uch-value: "test" # 仅负载均衡算法为uch时,需要配置此参数。当调度算法为wrr、schwlc均无需配置此参数。
spec:
... ... 

wlc

根据每台后端服务器设定的权重值和后端服务器的实际负载(即连接数)进行轮询。权重相同则优先选择连接数少的服务器。

sch

IP一致性Hash,基于客户端源IP请求做哈希分配,同一IP分配至同一后端服务器。

uch

URL参数一致性Hash。

通过注解alb.ingress.kubernetes.io/backend-scheduler-uch-value指定URL参数进行一致性Hash。

跨域配置

ALB Ingress 支持通过以下注解参数控制跨域行为。可指定允许访问的站点、请求方法、请求和响应头、凭证携带及预检(OPTIONS)缓存时间,满足不同安全和业务场景下的跨域访问需求。

展开查看完整YAML示例

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: alb-ingress
  annotations:
    alb.ingress.kubernetes.io/enable-cors: "true"
    alb.ingress.kubernetes.io/cors-expose-headers: ""
    alb.ingress.kubernetes.io/cors-allow-methods: "GET,POST"
    alb.ingress.kubernetes.io/cors-allow-credentials: "true"
    alb.ingress.kubernetes.io/cors-max-age: "600"
    alb.ingress.kubernetes.io/cors-allow-origin: "允许跨域的域名"
spec:
  ingressClassName: alb
  rules:
  - host: demo.alb.ingress.top
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: cloud-nodeport
            port:
              number: 80

注解示例如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: alb-ingress
  annotations:
    alb.ingress.kubernetes.io/enable-cors: "true"
    alb.ingress.kubernetes.io/cors-expose-headers: ""
    alb.ingress.kubernetes.io/cors-allow-methods: "GET,POST"
    alb.ingress.kubernetes.io/cors-allow-credentials: "true"
    alb.ingress.kubernetes.io/cors-max-age: "600"
    alb.ingress.kubernetes.io/cors-allow-origin: "允许跨域的域名"
spec:
... ...

参数

描述

默认值

alb.ingress.kubernetes.io/enable-cors

启用 CORS 跨域配置。

默认值:"true"

alb.ingress.kubernetes.io/cors-allow-origin

允许通过浏览器访问服务器资源的站点。

站点之间使用英文半角逗号(,)分割。 单个value值必须以http://或者https://开头后跟一个正确域名,或者一级的泛域名。不支持使用IP地址。
  • 默认值:*

  • 示例:alb.ingress.kubernetes.io/cors-allow-origin: "https://example.com:4443, http://aliyundoc.com, https://example.org:1199"

alb.ingress.kubernetes.io/cors-allow-methods

允许跨域方法。

不区分大小写。跨域方法之间使用英文半角逗号(,)分割。
  • 默认值:GET, PUT, POST, DELETE, PATCH, OPTIONS

  • 示例:alb.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, OPTIONS"

alb.ingress.kubernetes.io/cors-allow-headers

允许跨域传播的请求头。

支持配置为*或配置一个或多个 value 值,多个 value 值用半角逗号(,)隔开。单个 value 值只允许包含大小写字母、数字,不能以下划线(_)和短划线(-)开头或结尾,最大长度限制为 32 个字符。
  • 默认值:DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization

  • 示例:alb.ingress.kubernetes.io/cors-allow-headers: "X-Forwarded-For, X-app123-XPTO"

alb.ingress.kubernetes.io/cors-expose-headers

允许暴露的Header列表,

支持配置为*或配置一个或多个 value 值,多个 value 值用半角逗号(,)隔开。单个 value 值只允许包含大小写字母、数字,不能以下划线(_)和短划线(-)开头或结尾,最大长度限制为 32 个字符。
  • 默认值:""

  • 示例:alb.ingress.kubernetes.io/cors-expose-headers: "*,X-CustomResponseHeader"

alb.ingress.kubernetes.io/cors-allow-credentials

设置跨域访问时是否允许携带凭证信息。

  • 默认值:true

  • 示例:alb.ingress.kubernetes.io/cors-allow-credentials: "false"

alb.ingress.kubernetes.io/cors-max-age

对于非简单请求,设置OPTIONS预检请求在浏览器的最大缓存时间(秒),取值范围[0, 172800]。

默认值:172800

后端长连接

传统的负载均衡会采用短链接的方式访问后端服务器组,每一条请求都需要经历TCP层面的建立连接和断开连接,使网络连接成为这类高性能系统的瓶颈,通过负载均衡的后端长连接支持,极大地减少了处理连接层面的资源消耗,从而大幅度提高处理性能。参考示例如下:

展开查看完整YAML示例

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: alb-ingress
  annotations:
    alb.ingress.kubernetes.io/backend-keepalive: "true"
spec:
  ingressClassName: alb
  rules:
  - host: demo.alb.ingress.top
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: cloud-nodeport
            port:
              number: 80

参数

描述

YAML示例

alb.ingress.kubernetes.io/backend-keepalive: "true"

开启后端长连接。开启后,减少每次请求的 TCP 连接建立和断开,降低资源消耗,提升高性能系统处理能力。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: alb-ingress
  annotations:
    alb.ingress.kubernetes.io/backend-keepalive: "true"
spec:

服务器组支持IPv6挂载

在为服务器组启用IPv6挂载后,如需同时将IPv4IPv6类型的Pod挂载至服务器组,需确保集群已启用双栈能力,更多详情请参见创建ACK托管集群

说明

以下是开启IPv6挂载的限制:

  • 如果服务器组所在的VPC未开启IPv6功能,则无法启用服务器组的IPv6挂载功能。

  • 当通过自定义转发动作挂载IP类型或函数计算类型的服务器组时,不支持开启IPv6挂载功能。

  • 关联IPv4类型ALB实例的Ingress,不支持开启服务器组的IPv6挂载功能。

展开查看完整实例YAML

apiVersion: v1
kind: Service
metadata:
  name: tea-svc
  annotations:
spec:
  # 配置双栈时ipFamilies需要配置为IPv4或IPv6,ipFamilyPolicy需要配置为RequireDualStack或PreferDualStack。
  ipFamilyPolicy: RequireDualStack
  ipFamilies:
  - IPv4
  - IPv6
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
  selector:
    app: tea
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tea
spec:
  replicas: 2
  selector:
    matchLabels:
      app: tea
  template:
    metadata:
      labels:
        app: tea
    spec:
      containers:
      - name: tea
        image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest
        ports:
        - containerPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
    alb.ingress.kubernetes.io/enable-ipv6: "true"
spec:
  ingressClassName: alb
  rules:
   - host: demo.alb.ingress.top
     http:
      paths:
      - path: /tea
        pathType: Prefix
        backend:
          service:
            name: tea-svc
            port:
              number: 80
Service 和 ALB Ingress 需按双栈要求进行配置。创建支持双栈的 ALB 实例后,服务器组可同时挂载 IPv4 和 IPv6 类型的后端服务器。

配置对象

配置参数

取值

描述

YAML示例

Service

ipFamilies

  • IPv4

  • IPv6

指定 Service 可用的 IP 地址类型。

apiVersion: v1
kind: Service
metadata:
  name: tea-svc
  annotations:
spec:
  # 配置双栈时ipFamilies需要配置为IPv4IPv6,ipFamilyPolicy需要配置为RequireDualStackPreferDualStack。
  ipFamilyPolicy: RequireDualStack
  ipFamilies:
  - IPv4
  - IPv6
... ...

ipFamilyPolicy

  • RequireDualStack

  • PreferDualStack

设置 Service 的 IP 策略,支持双栈。

ALB Ingress

alb.ingress.kubernetes.io/enable-ipv6

"true"

启用服务器组的 IPv6 挂载功能。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
    alb.ingress.kubernetes.io/enable-ipv6: "true"
spec:
... ...

支持QPS限速

ALB本身支持转发规则的QPS限速功能,需配置以下注解即可实现 QPS 限速。

展开查看完整YAML示例

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
    alb.ingress.kubernetes.io/traffic-limit-qps: "50"
spec:
  ingressClassName: alb
  rules:
   - host: demo.alb.ingress.top
     http:
      paths:
      - path: /tea
        pathType: ImplementationSpecific
        backend:
          service:
            name: tea-svc
            port:
              number: 80
      - path: /coffee
        pathType: ImplementationSpecific
        backend:
          service:
            name: coffee-svc
            port:
              number: 80

注解

描述

YAML示例

alb.ingress.kubernetes.io/traffic-limit-qps

设置转发规则的 QPS 限速上限。取值范围:[1,1000000]

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress
  annotations:
    alb.ingress.kubernetes.io/traffic-limit-qps: "50"
spec:
... ...

后端慢启动

在新增Pod加入Service后端后,如果ALB Ingress立即将流量分配至新增Pod,可能会导致瞬时的CPU或内存高压,导致访问异常。通过使用慢启动,ALB Ingress可以逐步将流量转移至新增Pod,缓解突发流量造成的影响。配置示例如下:

展开查看完整YAML示例

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/slow-start-enabled: "true"
    alb.ingress.kubernetes.io/slow-start-duration: "100"
  name: alb-ingress
spec:
  ingressClassName: alb
  rules:
  - host: alb.ingress.alibaba.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: tea-svc
            port:
              number: 80

参数

说明

YAML示例

alb.ingress.kubernetes.io/slow-start-enabled

是否启用慢启动功能,默认不开启。

  • true:启用慢启动功能。

  • false:不启用慢启动功能。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/slow-start-enabled: "true"
    alb.ingress.kubernetes.io/slow-start-duration: "100"
  name: alb-ingress
... ...

alb.ingress.kubernetes.io/slow-start-duration

慢启动完成后,流量逐步增加的时间越长,流量提升的速度越慢。该参数以秒(s)为单位,取值范围为 [30, 900],默认值为 30 秒。

连接优雅中断

Pod进入Terminating状态时,ALB Ingress会将其从后端服务器组中移除,ALB与该Pod已建立的连接不会立即中断,客户端访问时仍持续有请求转发至这些后端服务器,可能会导致Pod内的业务长期无法下线或出现请求错误。为了避免该问题,可以使用ALB的连接优雅中断功能,当Pod被移除或健康检查异常时,ALB Ingress会保持一定时间内的正常传输,并在到达中断时间后主动断开连接,保障业务平稳下线。更多详情,请参见通过ALB连接优雅中断实现业务平稳下线

重要

在连接优雅中断时间结束前,ALB Ingress无法保证Pod处于运行状态。请为Pod配置spec.terminationGracePeriodSeconds使用preStop Hook,以控制PodTerminating状态中的可用性。

展开查看完整YAML示例

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/connection-drain-enabled: "true"
    alb.ingress.kubernetes.io/connection-drain-timeout: "199"
  name: alb-ingress
spec:
  ingressClassName: alb
  rules:
  - host: alb.ingress.alibaba.com
    http:
      paths:
      - path: /test
        pathType: Prefix
        backend:
          service:
            name: tea-svc
            port:
              number: 80

参数

描述

YAML示例

alb.ingress.kubernetes.io/connection-drain-enabled

是否开启连接优雅中断,默认不开启。

  • true:开启优雅中断。

  • false:不开启优雅中断。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/connection-drain-enabled: "true"
    alb.ingress.kubernetes.io/connection-drain-timeout: "199"
  name: alb-ingress
... ...

alb.ingress.kubernetes.io/connection-drain-timeout

优雅中断超时时间,单位为秒(s),取值范围为 [0, 900],默认值为 300 秒

关闭跨可用区(AZ)

默认情况下,ALB启用跨可用区(AZ)的负载均衡,这意味着在同一地域的不同可用区之间,流量会被均匀分配至后端服务。如果关闭了ALB服务器组的跨AZ负载均衡,则流量将仅在同一地域内的同一可用区的后端服务之间分配。

重要

如果您需要关闭跨AZ负载均衡,请确保ALB在每个可用区中都配置可用的后端服务,并确保这些服务器的资源充足。为避免对业务产生影响,请谨慎进行此操作。

您可参照下方的示例配置关闭跨AZ:

展开查看完整YAML示例

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: alb-ingress
  namespace: default
  annotations:
    alb.ingress.kubernetes.io/cross-zone-enabled: "false"
spec:
  ingressClassName: alb
  rules:
  - host: alb.ingress.alibaba.com
    http:
      paths:
      - path: /test
        pathType: Prefix
        backend:
          service:
            name: tea-svc
            port:
              number: 80

参数

描述

YAML示例

alb.ingress.kubernetes.io/cross-zone-enabled

是否关闭跨AZ转发,默认开启。

  • true:开启跨AZ转发。

  • false:关闭跨AZ转发。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: alb-ingress
  namespace: default
  annotations:
    alb.ingress.kubernetes.io/cross-zone-enabled: "false"
... ...