全部產品
Search
文件中心

Container Service for Kubernetes:ALB Ingress服務進階用法

更新時間:Jan 01, 2026

ACK Serverless叢集中,ALB Ingress對叢集服務(Service)中外部可訪問的API對象進行管理,提供七層負載平衡能力。本文介紹如何使用ALB Ingress將來自不同網域名稱或URL路徑的請求轉寄給不同的後端伺服器組、將HTTP訪問重新導向至HTTPS及實現灰階發布等功能。

前提條件

基於網域名稱轉寄請求

通過建立一個簡單的Ingress,根據指定的正常網域名稱或空網域名稱轉寄請求,樣本如下。

基於正常網域名稱轉寄請求

以下 YAML 樣本將路由路徑配置為 /hello,訪問 demo.domain.ingress.top/hello 時會轉寄到後端服務。

  1. 部署以下模板,分別建立Service、Deployment和Ingress,將訪問請求通過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: ClusterIP
    ---
    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: ClusterIP
    ---
    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. 執行以下命令,通過指定的正常網域名稱訪問服務。

    替換ADDRESS為ALB執行個體對應的網域名稱地址,可通過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: ClusterIP
    ---
    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: ClusterIP
    ---
    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. 執行以下命令,通過空網域名稱訪問服務。

    替換ADDRESS為ALB執行個體對應的網域名稱地址,可通過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. 執行以下命令,訪問服務。

    替換ADDRESS為ALB執行個體對應的網域名稱地址,可通過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. 執行以下命令,訪問服務。

    替換ADDRESS為ALB執行個體對應的網域名稱地址,可通過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
        pathType: ImplementationSpecific
        backend:
          service:
            name: tea-svc
            port:
              number: 80
      # 配置Context Path
      - path: /coffee
        pathType: ImplementationSpecific
        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協議,通過發送HEAD或GET請求類比瀏覽器的訪問行為檢查伺服器應用是否健康。

  • HTTPS:使用HTTPS協議,通過發送HEAD或GET請求類比瀏覽器的訪問行為檢查伺服器應用是否健康。

  • TCP:使用TCP協議,通過發送SYN握手報文檢測伺服器連接埠是否存活。

  • GRPC:使用gRPC協議,通過發送POST或GET請求檢查伺服器應用是否健康。

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中填入的值:

  • HTTP或HTTPS

    可以填入以下選項中的任意一個或多個組合,多個狀態代碼用英文半形逗號(,)分隔:

    • http_2xx

    • http_3xx

    • http_4xx

    • http_5xx

  • GRPC:取值範圍:[0, 99]。

    支援範圍輸入,最多填入20個範圍值,多個範圍值使用半形逗號(,)分隔。

  • HTTP或HTTPS

    預設值: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通過設定註解alb.ingress.kubernetes.io/ssl-redirect: "true",可以將HTTP請求重新導向到HTTPS 443連接埠。

重要
  • 僅支援配置在監聽連接埠為80的HTTP轉寄規則上。

  • 僅支援與自訂轉寄動作:RemoveHeaderInsertHeader、跨域Cors相關註解配合使用。

  • 配置此註解需要保證AlbConfig中已配置443連接埠的HTTPS監聽,請參見通過AlbConfig配置ALB監聽

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: ClusterIP
---
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: ClusterIP
---
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

支援後端HTTPS和gRPC協議

當前 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
... ...

配置Regex

使用註解alb.ingress.kubernetes.io/use-regex:"true"啟用正則模式,並在自訂轉寄條件或轉寄動作中配置相應的Regex。

重要

註解僅在pathType: Prefix的路徑規則下生效。

展開查看完整YAML樣本

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
   alb.ingress.kubernetes.io/use-regex: "true"  ## 允許使用Regex。
   alb.ingress.kubernetes.io/conditions.<YOUR-SVC-NAME>: | ## <YOUR-SVC-NAME>需替換為實際的 Service 名稱,必須與下面 backend.service.name一致。
     [{
       "type": "Path",
       "pathConfig": {
           "values": [
              "~*/pathvalue1", ## Regex前需要添加~*或~作為正則標誌。~*或~後的內容為實際生效的Regex。~*表示區分大小寫正則匹配,~表示不區分大小寫正則匹配。
              "/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"

啟用Regex。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
   alb.ingress.kubernetes.io/use-regex: "true"  ## 允許使用Regex。
   alb.ingress.kubernetes.io/conditions.<YOUR-SVC-NAME>: | ## <YOUR-SVC-NAME>需替換為實際的 Service 名稱,必須與下面 backend.service.name一致。
     [{
       "type": "Path",         ## 支援Host
       "pathConfig": {
           "values": [
              "~*/pathvalue1", ## Regex前需要添加~*或~作為正則標誌。~*或~後的內容為實際生效的Regex。~*表示區分大小寫正則匹配,~表示不區分大小寫正則匹配。
              "/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}格式表示從原路徑中通過Regex擷取的變數,可以配置為${1}${2}${3}中的一個或多個,最多可從原路徑中擷取三個變數。

    • Ingress的pathType需設定為Prefix

  • alb.ingress.kubernetes.io/use-regex:是否在path中使用Regex,配置rewrite-target後預設開啟。

    • "true":使用Regex。

    • "false":不使用Regex。如果path中有特殊符號(“%#;!()[]^,”\"),Ingress資源會建立失敗。

配置樣本

樣本情境一:移除首碼

下方的YAML樣本中path: /something(/|$)(.*)通過Regex將用戶端請求的路徑分為了三個部分:

  • /something:匹配需要剝離的首碼。

  • (/|$):第一擷取的群組,匹配/something後的/$(路徑結尾)。

  • (.*):第二擷取的群組,匹配/something/後的全部內容,在重寫後的路徑中通過${2}使用。

alb.ingress.kubernetes.io/rewrite-target註解中配置的重寫路徑為/(路徑標準首碼)+${2}(第二擷取的群組的內容),路徑的重寫效果如下:

用戶端原始路徑

是否匹配PathRegex

重寫後路徑

/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欄位使用Regex。
    alb.ingress.kubernetes.io/rewrite-target: /${2} # 該註解支援Regex替換。
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}(第三擷取的群組的內容),路徑的重寫效果如下:

樣本中明確要求路徑中有四個分段,使用這種方式要求用戶端使用的路徑為固定格式。

用戶端原始路徑

是否匹配PathRegex

重寫後路徑

/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欄位使用Regex。
    alb.ingress.kubernetes.io/rewrite-target: /${2}?code=${3} # 該註解支援Regex替換。
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}(第二擷取的群組的內容),路徑的重寫效果如下:

用戶端原始路徑

是否匹配PathRegex

重寫後路徑

/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欄位使用Regex。
    alb.ingress.kubernetes.io/rewrite-target: /app-c/${2} # 該註解支援Regex替換。
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中配置的Regex,並查看重寫後的新路徑。

樣本情境二:捕獲並重新排列多個部分中的捕獲路徑/items/(.*)/(.*)/(.*)和重寫規則/${2}?code=${3}為例:

  1. 將下方的樣本命令儲存到path2.txt

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

    下方命令中對樣本中的pathRegex(/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: ...

若不修改Ingress的namespace/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: "Server"   # 支援自訂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: "Server"   # 支援自訂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(即在HTTP或HTTPS響應報文中插入SERVERID),下次用戶端攜帶此Cookie訪問時,負載平衡服務會將請求定向轉寄給之前記錄到的後端伺服器。

  • Server:重寫Cookie。負載平衡發現使用者自訂了Cookie,將會對原來的Cookie進行重寫,下次用戶端攜帶新的Cookie訪問時,負載平衡服務會將請求定向轉寄給之前記錄到的後端伺服器。

說明

當前伺服器組StickySessionEnabledtrue時,該參數生效。伺服器組參數詳情請參見建立伺服器組

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、sch和wlc。
    alb.ingress.kubernetes.io/backend-scheduler-uch-value: "test" # 僅負載平衡演算法為uch時,需要配置此參數。當調度演算法為wrr、sch或wlc均無需配置此參數。
spec:
... ... 

wlc

根據每台後端伺服器設定的權重值和後端伺服器的實際負載(即串連數)進行輪詢。權重相同則優先選擇串連數少的伺服器。

sch

源IP一致性Hash,基於用戶端源IP請求做雜湊分配,同一IP分配至同一後端伺服器。

uch

URL參數一致性Hash。

通過註解alb.ingress.kubernetes.io/backend-scheduler-uch-value指定URL參數進行一致性Hash。

跨網域設定

當前ALB Ingress支援跨網域設定樣本如下:

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"

spec:
  ingressClassName: alb
  rules:
  - host: demo.alb.ingress.top
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: cloud-nodeport
            port:
              number: 80

參數

說明

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

允許通過瀏覽器訪問的網站。使用半形逗號(,)分割。 值必須以http://或者https://開頭,後跟一個正確網域名稱,或者一級的泛網域名稱。預設值:*,樣本:alb.ingress.kubernetes.io/cors-allow-origin: "https://example.com:4443, http://aliyundoc.com, https://example.org:1199"

alb.ingress.kubernetes.io/cors-allow

允許跨域方法,不區分大小寫。跨域方法之間使用半形逗號(,)分割。

預設值:GET, PUT, POST, DELETE, PATCH, OPTIONS,樣本:alb.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, OPTIONS"

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

允許跨域傳播的要求標頭,只能輸入字母、數字、底線(_)和短劃線(-)。要求標頭之間使用半形逗號(,)分割。

預設值: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列表,允許輸入字母、數字、底線(_)、短劃線(-)和星號(*)。Header之間使用半形逗號(,)分割。

預設值:empty,樣本: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預檢請求在瀏覽器的最大緩衝時間(秒),取值範圍[-1, 172800]。

預設值:172800

後端長連結

傳統負載平衡採用短連結訪問後端伺服器組,每次請求都需建立和斷開TCP串連,成為高效能系統的瓶頸。後端長連結支援極大減少了串連資源消耗,大幅提高處理效能。您可以在ALB Ingress中通過註解alb.ingress.kubernetes.io/backend-keepalive開啟後端長連結。參考樣本如下:

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

支援QPS限速

ALB本身支援轉寄規則的QPS限速功能,限速值要求在1~100000之間。當前在ALB Ingress只需要設定alb.ingress.kubernetes.io/traffic-limit-qps註解即可。參考樣本如下:

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

後端慢啟動

在新增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,以控制Pod在Terminating狀態中的可用性。

展開查看完整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 秒