全部產品
Search
文件中心

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

更新時間:Nov 29, 2024

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

索引

前提條件

基於網域名稱轉寄請求

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

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

  1. 部署以下模板,分別建立Service、Deployment和Ingress,將訪問請求通過Ingress的網域名稱轉寄至Service。

    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. 執行以下命令,通過指定的正常網域名稱訪問服務。

    替換ADDRESS為ALB執行個體對應的網域名稱地址,可通過kubectl get ing擷取。

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

    預期輸出:

    {"hello":"coffee"}

基於空網域名稱轉寄請求

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

    1.19及之後版本叢集

    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

    1.19版本之前叢集

    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、ImplementationSpecific和Prefix三種匹配方式。

說明

URL匹配策略可能存在衝突的情況,此時將會按照轉寄規則優先順序進行排序,然後再轉寄請求,詳情請參見配置轉寄規則優先順序

匹配方式

規則路徑

請求路徑

路徑和請求路徑是否匹配

Prefix

/

(所有路徑)

Prefix

/foo

  • /foo

  • /foo/

Prefix

/foo/

  • /foo

  • /foo/

Prefix

/aaa/bb

/aaa/bbb

Prefix

/aaa/bbb

/aaa/bbb

Prefix

/aaa/bbb/

/aaa/bbb

是,請求路徑忽略規則路徑的尾部斜線

Prefix

/aaa/bbb

/aaa/bbb/

是,規則路徑匹配請求路徑的尾部斜線

Prefix

/aaa/bbb

/aaa/bbb/ccc

是,規則路徑匹配請求路徑的子路徑

Prefix

同時設定兩個規則路徑:

  • /

  • /aaa

/aaa/ccc

是,請求路徑匹配規則路徑的/首碼

Prefix

同時設定兩個規則路徑:

  • /aaa

  • /

/aaa/ccc

是,請求路徑匹配規則路徑的/aaa首碼

Prefix

同時設定兩個規則路徑:

  • /aaa

  • /

/ccc

是,請求路徑匹配規則路徑的/首碼

Prefix

/aaa

/ccc

否,未匹配首碼

Exact或ImplementationSpecific

/foo

/foo

Exact或ImplementationSpecific

/foo

/bar

Exact或ImplementationSpecific

/foo

/foo/

Exact或ImplementationSpecific

/foo/

/foo

三種匹配方式的樣本如下:

Exact

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

    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"}

(預設)ImplementationSpecific

在ALB Ingress中與Exact做相同處理。

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

  2. 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: ImplementationSpecific

    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: ImplementationSpecific
  3. 執行以下命令,訪問服務。

  4. 替換ADDRESS為ALB執行個體對應的網域名稱地址,可通過kubectl get ing擷取。

  5. curl <ADDRESS>/hello

    預期輸出:

    {"hello":"coffee"}

Prefix

/分隔的URL路徑進行首碼匹配。匹配區分大小寫,並且對路徑中的元素逐個完成匹配。

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

  2. 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
  3. 執行以下命令,訪問服務。

  4. 替換ADDRESS為ALB執行個體對應的網域名稱地址,可通過kubectl get ing擷取。

  5. 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

參數

說明

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

預設值:HEAD

重要

healthcheck-protocolGRPC時,需要選擇POSTGET

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

    預設值:http_2xx

  • GRPC

    取值範圍:[0, 99]。

    預設值:0

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

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連接埠。

重要

ALB不支援直接在Ingress中建立新的監聽。為確保Ingress能夠正常工作,您需要先在AlbConfig中建立所需的監聽連接埠和協議,然後在Ingress中將這些監聽與服務關聯起來。關於如何建立ALB監聽,請參見通過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/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

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

支援後端HTTPS和gRPC協議

當前ALB後端協議支援HTTPS和gRPC協議,通過ALB Ingress只需要在註解中配置alb.ingress.kubernetes.io/backend-protocol: "grpc"alb.ingress.kubernetes.io/backend-protocol: "https"即可。使用Ingress轉寄gRPC服務需要對應網域名稱擁有SSL認證,使用TLS協議進行通訊。配置gRPC協議的樣本如下:

說明

後端協議不支援修改,如果您需要變更協議,請刪除重建Ingress。

1.19及之後版本叢集

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/backend-protocol: "grpc"
  name: lxd-grpc-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: lxd-grpc-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

配置正則表達

自訂轉寄條件中配置,需要使用者自己在path路徑上編寫Regex。配置樣本如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
   alb.ingress.kubernetes.io/use-regex: "true" # 允許path欄位使用Regex。
   alb.ingress.kubernetes.io/conditions.service-a: | # 該註解中的服務為叢集中已存在的服務,且服務名稱必須和rule欄位backend下的服務名稱保持一致。
     [{
       "type": "Path",
       "pathConfig": {
           "values": [
              "~*^/pathvalue1", # Regex前需要添加~*作為正則標誌,~*後的內容為實際生效的Regex。
              "/pathvalue2" # 精確匹配前無需添加~*。
           ]
       }
      }]
  name: ingress-example
spec:
  ingressClassName: alb
  rules:
   - http:
      paths:
      - path: /test
        pathType: Prefix
        backend:
          service:
            name: service-a
            port:
              number: 88

支援Rewrite重寫

當前ALB支援Rewrite重寫,通過ALB Ingress只需要在註解中配置alb.ingress.kubernetes.io/rewrite-target: /path/${2} 即可。規則如下:

  • rewrite-target註解中,${number}類型的變數需要在路徑為Prefix類型的path上配置。

  • path預設無法配置正則符號,例如*?等,您需要通過配置rewrite-target註解使用正則符號。

  • path必須以 / 開頭。

說明

ALB的Rewrite重寫支援Regex替換,規則如下:

  • 您可以在Ingress的path中寫入一個或多個Regex,支援寫入多個(),但是rewrite-target註解中重寫路徑最多可以配置${1}${2}${3}變數中的一個或多個,最多可擷取三個變數。

  • Rewrite重寫支援Regex匹配的結果作為參數自由組合,自由拼接出您想要的重寫規則。

  • Rewrite重寫通過Regex替換的邏輯是:用戶端的請求匹配到Regex,Regex中有多個(),且rewrite-target註解含有${1}${2}${3}變數中的一個或多個。

例如Ingress的path配置為/sys/(.*)/(.*)/aaarewrite-target註解配置為/${1}/${2}。當用戶端發送請求的路徑為/sys/ccc/bbb/aaa時,path會匹配到/sys/(.*)/(.*)/aaarewrite-target註解生效會把${1}替換為ccc${2}替換為bbb,最終後端伺服器接收到的請求路徑為/ccc/bbb

1.19及之後版本叢集

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/use-regex: "true" # 允許path欄位使用Regex。
    alb.ingress.kubernetes.io/rewrite-target: /path/${2} # 該註解支援Regex替換。
  name: rewrite-ingress
spec:
  ingressClassName: alb
  rules:
  - host: demo.alb.ingress.top
    http:
      paths:
      - path: /something(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: rewrite-svc
            port:
              number: 9080

1.19版本之前叢集

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/use-regex: "true" # 允許path欄位使用Regex。
    alb.ingress.kubernetes.io/rewrite-target: /path/${2} # 該註解支援Regex替換。
  name: rewrite-ingress
spec:
  ingressClassName: alb
  rules:
    - host: demo.alb.ingress.top
      http:
        paths:
          - backend:
              serviceName: rewrite-svc
              servicePort: 9080
            path: /something(/|$)(.*)
            pathType: Prefix

配置自訂監聽連接埠

當前支援Ingress配置自訂監聽連接埠。通過該方式,可以將服務同時暴露80連接埠和443連接埠,配置樣本如下:

重要

ALB不支援直接在Ingress中建立新的監聽。為確保Ingress能夠正常工作,您需要先在AlbConfig中建立所需的監聽連接埠和協議,然後在Ingress中將這些監聽與服務關聯起來。關於如何建立ALB監聽,請參見通過AlbConfig配置ALB監聽

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-svc
            pathType: ImplementationSpecific

配置轉寄規則優先順序

預設情況下,Ingress按照以下規則進行ALB轉寄規則優先順序排序:

  • 不同Ingress按照namespace/name的字典順序優先順序進行排列,字典順序小的優先順序高。

  • 同一個Ingress按照rule欄位先後順序進行排序,配置在上面的優先順序高。

如果您不想修改Ingress的namespace/name欄位,可以配置以下Ingress註解定義ALB轉寄規則優先順序:

說明

同一個監聽內規則優先順序必須唯一。您可以使用alb.ingress.kubernetes.io/order標識Ingress之間的優先順序順序,取值範圍為1~1000,值越小表示優先順序越高。Ingress預設標識為數字10。

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-svc
            pathType: ImplementationSpecific

通過註解實現灰階發布

ALB提供複雜路由處理能力,支援基於Header、Cookie以及權重的灰階發布功能。灰階發布功能可以通過設定註解來實現,為了啟用灰階發布功能,需要設定註解alb.ingress.kubernetes.io/canary: "true",通過不同註解可以實現不同的灰階發布功能:

說明
  • 灰階優先順序順序:基於Header>基於Cookie>基於權重(從高到低)。

  • 灰階過程中不能刪除原有的規則,否則會導致服務異常。待灰階驗證無誤後,將原有Ingress中的後端服務Service更新為新的Service,最後將灰階的Ingress刪除。

  • alb.ingress.kubernetes.io/canary-by-headeralb.ingress.kubernetes.io/canary-by-header-value:匹配的Request Header的值,該規則允許您自訂Request Header的值,但必須與alb.ingress.kubernetes.io/canary-by-header一起使用。

    • 當請求中的headerheader-value與設定的值匹配時,請求流量會被分配到灰階服務入口。

    • 對於其他header值,將會忽略header,並通過灰階優先順序將請求流量分配到其他規則設定的灰階服務。

    當請求Header為location: hz時將訪問灰階服務;其他Header將根據灰階權重將流量分配給灰階服務。配置樣本如下:

    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
  • alb.ingress.kubernetes.io/canary-by-cookie:基於Cookie的流量切分。

    • 當配置的cookie值為always時,請求流量將被分配到灰階服務入口。

    • 當配置的cookie值為never時,請求流量將不會分配到灰階服務入口。

    說明

    基於Cookie的灰階不支援設定自訂,只有alwaysnever

    請求的Cookie為demo=always時將訪問灰階服務。配置樣本如下:

    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
  • alb.ingress.kubernetes.io/canary-weight:佈建要求到指定服務的百分比(值為0~100的整數)。

    配置灰階服務的權重為50%,樣本如下:

    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支援通過註解實現會話保持:

  • alb.ingress.kubernetes.io/sticky-session:是否啟用會話保持。取值:truefalse;預設值:false

  • alb.ingress.kubernetes.io/sticky-session-type:Cookie的處理方式。取值:InsertServer;預設值:Insert

    • Insert:植入Cookie。用戶端第一次訪問時,負載平衡會在返回請求中植入Cookie(即在HTTP或HTTPS響應報文中插入SERVERID),下次用戶端攜帶此Cookie訪問時,負載平衡服務會將請求定向轉寄給之前記錄到的後端伺服器。

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

    說明

    當前伺服器組StickySessionEnabledtrue時,該參數生效。

  • alb.ingress.kubernetes.io/cookie-timeout:Cookie逾時時間。單位:秒;取值:1~86400;預設值:1000

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"
    alb.ingress.kubernetes.io/cookie-timeout: "1800"
spec:
  ingressClassName: alb
  rules:
  - http:
      paths:
      #配置Context Path。
      - path: /tea2
        backend:
          service:
            name: tea-svc
            port: 
             number: 80
      # 配置Context Path。
       - path: /coffee2
         backend:
           service:
              name: coffee-svc
              port: 
               number: 80

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"
    alb.ingress.kubernetes.io/cookie-timeout: "1800"
spec:
  ingressClassName: alb
  rules:
  - http:
      paths:
      #配置Context Path。
      - path: /tea2
        backend:
          serviceName: tea-svc
          servicePort: 80
      #配置Context Path。
      - path: /coffee2
        backend:
          serviceName: coffee-svc
          servicePort: 80

指定伺服器組負載平衡演算法

ALB Ingress支援通過設定Ingress註解alb.ingress.kubernetes.io/backend-scheduler指定伺服器組負載平衡演算法。配置樣本如下:

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均無需配置此參數。
  name: cafe-ingress
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-svc
            pathType: ImplementationSpecific

調度演算法alb.ingress.kubernetes.io/backend-scheduler取值說明:

  • wrr:預設值,權重值越高的後端伺服器,被輪詢到的機率也越高。

  • wlc:根據每台後端伺服器設定的權重值和後端伺服器的實際負載(即串連數)進行輪詢。當權重值相同時,當前串連數越小的後端伺服器被輪詢到的機率越高。

  • sch:源IP一致性Hash。

  • uch:URL參數一致性Hash。ALB Ingress支援伺服器組負載平衡演算法為uch時,通過註解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

允許通過瀏覽器訪問伺服器資源的網站。網站之間使用半形逗號(,)分割。 單個value值必須以http://或者https://開頭後跟一個正確網域名稱,或者一級的泛網域名稱。

預設值:*,樣本:alb.ingress.kubernetes.io/cors-allow-origin: "https://example.com:4443, http://aliyundoc.com, https://example.org:1199"

alb.ingress.kunbernetes.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,緩解突發流量造成的影響。配置樣本如下:

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

參數

說明

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

是否啟用慢啟動功能。

  • true:啟用慢啟動功能。

  • false:不啟用慢啟動功能。

預設不開啟。

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

慢啟動完成流量逐步增加所花費的時間,時間越長,流量增加的速度越慢,單位秒(s)。

取值範圍:[30, 900]。

預設值:30

串連優雅中斷

在Pod進入Terminating狀態時,ALB Ingress會將Pod從後端移除。在這種情況下,Pod已建立的串連中可能還有進行中的請求。如果ALB Ingress立即關閉所有串連,可能造成業務出現錯誤。通過使用串連優雅中斷能力,ALB Ingress可以在Pod被從後端移除後,在特定時間中保持串連的開啟,保證業務在當前請求處理完成後平滑下線。串連優雅中斷的具體工作模式如下:

  • 串連優雅中斷不開啟時,Pod進入Terminating狀態時,ALB Ingress會將Pod從後端移除,並立即關閉所有與此Pod的串連。

  • 串連優雅中斷開啟時,Pod進入Terminating狀態時,ALB Ingress會保持串連中的請求開啟,但不再接受新的請求:

    • 如果Pod有進行中的請求,ALB Ingress會在優雅中斷逾時時間到達時關閉所有串連並移除Pod。

    • 如果Pod在逾時時間到達前處理完所有請求,ALB Ingress將會立即將Pod移除。

重要

在串連優雅停機時間結束前,ALB Ingress不會主動關閉與Pod的串連,但無法保證Pod處於運行狀態。您可通過對Pod配置spec.terminationGracePeriodSeconds或使用preStop Hook,以控制Pod在Terminating狀態中的可用性。

您可參照下方的樣本配置串連優雅中斷:

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

參數

說明

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

是否開啟串連優雅中斷。

  • true:開啟優雅中斷。

  • false:不開啟優雅中斷。

預設不開啟。

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

優雅中斷逾時時間,單位秒(s)。

取值範圍:[0, 900]。

預設值:300