日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

ALB Ingress服務高級用法

在Kubernetes集群中,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: 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

支持后端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路徑上編寫正則表達式。配置示例如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
   alb.ingress.kubernetes.io/use-regex: "true" # 允許path字段使用正則表達式。
   alb.ingress.kubernetes.io/conditions.service-a: | # 該注解中的服務為集群中已存在的服務,且服務名稱必須和rule字段backend下的服務名稱保持一致。
     [{
       "type": "Path",
       "pathConfig": {
           "values": [
              "~*^/pathvalue1", # 正則表達式前需要添加~*作為正則標志,~*后的內容為實際生效的正則表達式。
              "/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重寫支持正則表達式替換,規則如下:

  • 您可以在Ingress的path中寫入一個或多個正則表達式,支持寫入多個(),但是rewrite-target注解中重寫路徑最多可以配置${1}${2}${3}變量中的一個或多個,最多可獲取三個變量。

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

  • Rewrite重寫通過正則表達式替換的邏輯是:客戶端的請求匹配到正則表達式,正則表達式中有多個(),且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字段使用正則表達式。
    alb.ingress.kubernetes.io/rewrite-target: /path/${2} # 該注解支持正則表達式替換。
  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字段使用正則表達式。
    alb.ingress.kubernetes.io/rewrite-target: /path/${2} # 該注解支持正則表達式替換。
  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.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

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

默認值: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