全部產品
Search
文件中心

Container Service for Kubernetes:通過控制台或Annotations自訂ALB Ingress的轉寄規則

更新時間:Dec 31, 2025

ALB Ingress支援自訂轉寄規則。轉寄規則包含轉寄條件和轉寄動作。您可以自訂轉寄條件,指定請求的網域名稱、路徑、要求標頭、查詢字串、要求方法、Cookie、源IP等。您也可以自訂轉寄動作,配置固定響應、重新導向、插入要求標頭、刪除要求標頭、流量鏡像、轉寄至後端多伺服器組和重寫。您可通過控制台或在Ingress資源中通過配置Annotations欄位來配置自訂轉寄規則。

適用情境

已安裝ALB Ingress Controller組件,且組件為v2.5.0及以上版本。具體操作,請參見管理組件

轉寄條件

重要
  • 轉寄規則的條件條目上限為10個,一旦達到規定數量上限,您將無法再添加更多的條件。

  • 轉寄條件ResponseHeader和ResponseStatusCode僅在自訂回應程式向轉寄規則中有效。

轉寄條件介紹

ALB Ingress支援在alb.ingress.kubernetes.io/conditions.<Service的名稱>註解中配置轉寄條件。不同的路由規則塊之間是與的關係,同一個路由規則塊中的值是或的關係,例如,如果是兩個不同的Header規則塊,那麼這兩個規則塊是與的關係,但是同一個Header規則塊中設定的值是或的關係。詳細的路由規則說明如下。

轉寄條件

描述

網域名稱

匹配請求網域名稱,只有正確的網域名稱的請求才能訪問服務。樣本如下。

alb.ingress.kubernetes.io/conditions.service-name: | # 請注意:此註解名稱中的"service-name"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄條件將生效至相應後端服務。
  [{
      "type": "Host",
      "hostConfig": {
        "values": [
          "anno.example.com"
        ]
      }
  }]
  • type:匹配類型。設定為Host,表示匹配網域名稱。

  • HostConfig:匹配的具體網域名稱。如果設定了多個網域名稱,則網域名稱之間是或的關係。

路徑

匹配請求路徑,只有正確的路徑的請求才能訪問服務。樣本如下。

alb.ingress.kubernetes.io/conditions.service-name: | # 請注意:此註解名稱中的"service-name"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄條件將生效至相應後端服務。
  [{
    "type": "Path",
    "pathConfig": {
      "values": [
        "/pathvalue1",
        "/pathvalue2"
      ]
    }
  }]
  • type:匹配類型。設定為Path,表示匹配請求路徑。

  • pathConfig:匹配的具體路徑。如果設定了多個路徑,則路徑之間是或的關係。

Header

匹配請求Header,只有正確的Header的請求才能訪問服務。樣本如下。

alb.ingress.kubernetes.io/conditions.service-name: | # 請注意:此註解名稱中的"service-name"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄條件將生效至相應後端服務。
  [{
    "type": "Header",
    "headerConfig": {
      "key": "headername",
      "values": [
        "headervalue1",
        "headervalue2"
      ]
     }
  }]
  • type:匹配類型。設定為Header,表示匹配要求標頭中的Header。

  • headerConfig:Header的索引值對。如果設定了多個Header值,則Header之間是或的關係。

查詢字串

匹配查詢字串, 只有包含正確的查詢字串的請求才能訪問服務。樣本如下。

alb.ingress.kubernetes.io/conditions.service-name: | # 請注意:此註解名稱中的"service-name"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄條件將生效至相應後端服務。
  [{
    "type": "QueryString",
    "queryStringConfig": {
      "values": [
        {
           "key":"querystringkey1",
           "value":"querystringvalue2"
        }
      ]
    }
  }]
  • type:匹配類型。設定為QueryString,表示匹配請求的查詢字串。

  • queryStringConfig:查詢字串的索引值對。鍵字元長度取值為[1,100],值字元長度取值為[1,100],支援小寫字母、可見字元和萬用字元星號(*)和英文半形問號(?),不支援空格和#[]{}\|<>&。如果設定了多個查詢字串,則查詢字串之間是或的關係。

使用情境與樣本請參見情境三:基於查詢字串、多個Header、多個路徑實現流量分發

要求方法

匹配要求方法,只有正確的要求方法的請求才能訪問服務。樣本如下。

alb.ingress.kubernetes.io/conditions.service-name: | # 請注意:此註解名稱中的"service-name"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄條件將生效至相應後端服務。
  [{
    "type": "Method",
    "methodConfig": {
      "values": [
        "GET",
        "HEAD"
      ]
    }
  }]
  • type:匹配類型。設定為Method,表示匹配要求方法。

  • methodConfig:具體的要求方法,支援GET、POST、PUT、DELETE、HEAD、OPTIONS和PATCH。如果設定了多個要求方法,則要求方法之間是或的關係。

Cookie

匹配Cookie,只有包含正確的Cookie的請求才能訪問服務。樣本如下。

alb.ingress.kubernetes.io/conditions.service-name: | # 請注意:此註解名稱中的"service-name"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄條件將生效至相應後端服務。
  [{
    "type": "Cookie",
    "cookieConfig": {
      "values": [
        {
           "key":"cookiekey1",
           "value":"cookievalue2"
        }
      ]
     }
  }]
  • type:匹配類型。設定為Cookie,表示匹配Cookie。

  • cookieConfig:Cookie的索引值對。鍵字元長度取值為[1,100],值字元長度取值為[1,100],支援小寫字母、可見字元和萬用字元星號(*)和英文半形問號(?),不支援空格和#[]{}\|<>&。如果設定了多個Cookie,則Cookie之間是或的關係。

使用情境與樣本請參見情境二:基於網域名稱、要求方法、Cookie實現流量分發

SourceIP

匹配請求源IP,只有正確的源IP的請求才能訪問服務。樣本如下。

alb.ingress.kubernetes.io/conditions.service-name: | # 請注意:此註解名稱中的"service-name"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄條件將生效至相應後端服務。
  [{
    "type": "SourceIp",
    "sourceIpConfig": {
      "values": [
        "192.168.0.0/16",
        "172.16.0.0/16"
      ]
    }
  }]
  • type:匹配類型。設定為SourceIP,表示匹配請求的源IP。

  • sourceIpConfig:請求的IP地址。如果設定了多個請求IP,則請求IP之間是或的關係。

使用情境與樣本請參見情境一:基於SourceIP和Header實現流量分發

ResponseHeader

匹配響應Header,只對攜帶正確的Header的響應執行轉寄動作。請注意與回應程式向轉寄動作及回應程式向轉寄規則註解alb.ingress.kubernetes.io/rule-direction.<service-name>: Response配合使用。樣本如下。

alb.ingress.kubernetes.io/conditions.service-name: | # 請注意:此註解名稱中的"service-name"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄條件將生效至相應後端服務。
  [{
    "type": "ResponseHeader",
    "headerConfig": {
      "key": "responseHeaderConfig",
      "values": [
        "headervalue1",
        "headervalue2"
      ]
     }
  }]
  • type:匹配類型。設定為ResponseHeader,表示匹配回應標頭中的Header。

  • headerConfig:Header的索引值對。如果設定了多個Header值,則Header之間是或的關係。

ResponseStatusCode

匹配響應狀態代碼,只有返回正確的狀態代碼才能訪問服務。請注意與回應程式向轉寄動作及回應程式向轉寄規則註解alb.ingress.kubernetes.io/rule-direction.<service-name>: Response配合使用。樣本如下。

alb.ingress.kubernetes.io/conditions.service-name: | # 請注意:此註解名稱中的"service-name"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄條件將生效至相應後端服務。
  [{
    "type": "ResponseStatusCode",
    "responseStatusCodeConfig": {
      "values": [
        "statuscode1",
        "statuscode2"
      ]
    }
  }]
  • type:匹配類型。設定為ResponseStatusCode,表示匹配響應狀態代碼。

  • responseStatusCodeConfig:具體的響應狀態代碼。如果設定了多個響應狀態代碼,則響應狀態代碼之間是或的關係。

情境一:基於SourceIP和Header實現流量分發

重要

同一條轉寄規則的自訂條件設定的SourceIp數量限制為5個。

以下代碼塊定義了當請求的IP、Header和路徑符合配置時,才能實現目標流量分發。

即當請求源IP為192.168.0.0/16或172.16.0.0/16中的IP地址,請求Header中包含gray-hello,值必須為value1value2,請求路徑為/hello,請求才能路由到gray-hello-svc服務,否則將路由到其他服務。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
   alb.ingress.kubernetes.io/order: "1"
   alb.ingress.kubernetes.io/conditions.gray-hello-svc: | # 請注意:此註解名稱中的"gray-hello-svc"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄條件將生效至相應後端服務。
     [{
       "type": "Header",
       "headerConfig": {
          "key":"gray-hello",
           "values": [
              "value1",
              "value2"
           ]
       }
      },
      {
         "type": "SourceIp",
         "sourceIpConfig": {
           "values": [
             "192.168.0.0/16",
             "172.16.0.0/16"
           ]
         }
     }]
  name: gray-hello-ingress
spec:
  ingressClassName: alb
  rules:
   - http:
      paths:
      - path: /hello
        pathType: ImplementationSpecific
        backend:
          service:
            name: gray-hello-svc # 請注意:spec.rules中配置的後端服務名稱與自訂轉寄條件註解中所配置的"gray-hello-svc"需對應一致,註解中所配置的轉寄條件將生效至相應後端服務。
            port:
              number: 88

alb.ingress.kubernetes.io/order:標識Ingress的優先順序,數字越小,優先順序越高。

情境二:基於網域名稱、要求方法、Cookie實現流量分發

以下代碼塊定義了只有當請求的網域名稱、要求方法和Cookie符合配置時,才能實現目標流量分發。

即當要求方法為GETHEAD,請求網域名稱為example.com*.edu,請求Cookie的鍵為cookiekey1,值為cookievalue1,請求路徑為/test時,請求才能路由到service-a服務,否則將路由到service-b服務。

說明

基於網域名稱的轉寄規則支援泛網域名稱匹配。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
   alb.ingress.kubernetes.io/conditions.service-a: | # 請注意:此註解名稱中的"service-a"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄條件將生效至相應後端服務。
     [{
       "type": "Cookie",
       "cookieConfig": {
         "values": [
           {
             "key":"cookiekey1",
             "value":"cookievalue1"
           }
        ]
       }
      },
      {
       "type": "Method",
       "methodConfig": {
         "values": [
           "GET",
           "HEAD"
         ]
       }
      },
     {
       "type": "Host",
       "hostConfig": {
           "values": [
              "example.com",
              "*.edu" 
           ]
       }
      }]
  name: ingress-example
spec:
  ingressClassName: alb
  rules:
   - http:
      paths:
      - path: /test
        pathType: ImplementationSpecific
        backend:
          service:
            name: service-a # 請注意:spec.rules中配置的後端服務名稱與自訂轉寄條件註解中所配置的"service-a"需對應一致,註解中所配置的轉寄條件將生效至相應後端服務。
            port:
              number: 88
      - path: /test
        pathType: ImplementationSpecific
        backend:
          service:
            name: service-b
            port:
              number: 88

情境三:基於查詢字串、多個Header、多個路徑實現流量分發

以下代碼塊定義了只有當請求的查詢字串、Header、路徑符合配置時,才能實現目標流量分發。

即當請求路徑是/pathvalue1/pathvalue2/test,查詢字串的鍵為querystringkey1,值為querystringvalue2,請求Header中必須包含headerkey1headerkey2,請求Header中包含headerkey1,值必須為headervalue1headervalue2,請求Header包含headerkey2,值必須為headervalue3headervalue4,才能路由到service-a服務,否則將路由到service-b服務。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
   alb.ingress.kubernetes.io/conditions.service-a: | # 請注意:此註解名稱中的"service-a"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄條件將生效至相應後端服務。
     [{
       "type": "Path",
       "pathConfig": {
           "values": [
              "/pathvalue1",
              "/pathvalue2"
           ]
       }
      },
      {
       "type": "QueryString",
       "queryStringConfig": {
         "values": [
           {
             "key":"querystringkey1",
             "value":"querystringvalue2"
           }
        ]
       }
      },
     {
       "type": "Header",
       "headerConfig": {
          "key":"headerkey1",
           "values": [
              "headervalue1",
              "headervalue2"
           ]
       }
     },
     {
       "type": "Header",
       "headerConfig": {
          "key":"headerkey2",
           "values": [
              "headervalue3",
              "headervalue4"
           ]
       }
     }]
  name: ingress-example
spec:
  ingressClassName: alb
  rules:
   - http:
      paths:
      - path: /test
        pathType: ImplementationSpecific
        backend:
          service:
            name: service-a # 請注意:spec.rules中配置的後端服務名稱與自訂轉寄條件註解中所配置的"service-a"需對應一致,註解中所配置的轉寄條件將生效至相應後端服務。
            port:
              number: 88
      - path: /test
        pathType: ImplementationSpecific
        backend:
          service:
            name: service-b
            port:
              number: 88

轉寄動作

轉寄動作介紹

ALB Ingress支援使用alb.ingress.kubernetes.io/actions.<服務名稱>註解配置請求方向和回應程式向的轉寄動作。支援固定響應、重新導向、插入要求標頭、刪除要求標頭、流量鏡像、轉寄至後端多伺服器組和重寫。通過定義這些轉寄動作,您可以在ALB Ingress中靈活地管理請求和響應的轉寄規則。

重要
  • alb.ingress.kubernetes.io/actions.<服務名稱>確保註解中的服務名稱與rule欄位backend下的服務名稱一致。

  • 確保在同一條轉寄規則中,只使用重新導向、固定響應、轉寄至多伺服器組等其中一種終結類型的轉寄動作。

  • 配置重新導向、固定響應、轉寄至多伺服器組時,backend.service.port.name必須設定為use-annotation

請求方向的轉寄動作

轉寄動作

描述

固定響應

設定通過ALB給用戶端返回固定響應內容,可以設定響應狀態代碼,本文內容和本文類型。樣本如下。

alb.ingress.kubernetes.io/actions.service-name: | # 請注意:此註解名稱中的"service-name"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄動作將對應生效。
  [{
      "type": "FixedResponse",
      "FixedResponseConfig": {
          "contentType": "text/plain",
          "httpCode": "503",
          "content": "503 error text"
      }
  }]
  • type:轉寄動作類型,設定為FixedResponse,表示配置固定響應。

  • contentType:響應本文類型。

  • httpCode:響應狀態代碼。

  • content:響應本文。

固定響應的情境樣本,請參見情境一:基於網域名稱的轉寄條件和動作,轉寄至指定的服務

重新導向

通過HTTP 3xx狀態代碼,指導用戶端跳轉到其他地址訪問服務。樣本如下。

alb.ingress.kubernetes.io/actions.service-name: | # 請注意:此註解名稱中的"service-name"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄動作將對應生效。
  [{
      "type": "Redirect",
      "RedirectConfig": {
          "host": "${host}",
          "path": "/test",
          "port": "443",
          "protocol": "https",
          "query": "querystring",
          "httpCode": "301"
      }
  }]
  • type:轉寄動作類型,設定為Redirect,表示配置重新導向。

  • host:跳轉的網域名稱。

  • path:跳轉的路徑。

  • port:跳轉的連接埠。

  • protocol:跳轉的協議。

  • query:跳轉的查詢字串。

  • httpCode:跳轉後的狀態代碼。

重要

hostpathportprotocolquery是特殊參數,可配置為使用原請求中的預設值,但需至少有一項配置為非預設值。以host為例,設定為${host}、空置("host": "")、不填寫此項時,都表明使用原請求中的值。

重新導向的情境樣本,請參見情境二:使用301重新導向到HTTPS連接埠

流量鏡像

設定流量鏡像轉寄伺服器組ID,將複製請求轉寄至流量鏡像伺服器組。樣本如下。

重要
  • 流量鏡像轉寄動作只能和轉寄、寫入Header、刪除Header、流量限速共存,不能和重寫、固定響應、重新導向共存。

  • 流量鏡像伺服器組只支援通過ServerGroupID掛載。

alb.ingress.kubernetes.io/actions.service-name: | # 請注意:此註解名稱中的"service-name"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄動作將對應生效。
      [{
          "type": "TrafficMirror",
          "TrafficMirrorConfig": {
              "TargetType" : "ForwardGroupMirror",
              "MirrorGroupConfig": {
                  "ServerGroupTuples" : [{
                      "ServerGroupID": "sgp-2auud2fxj1r46*****"
                  }]
              }
           }
      }]
  • type:轉寄動作類型,設定為TrafficMirror,表示配置流量鏡像功能。

  • TargetType:鏡像的目標類型,當前只支援ForwardGroupMirror類型,即鏡像請求至伺服器組。

  • ServerGroupID:流量鏡像伺服器組ID。

流量鏡像的情境樣本,請參見情境四:流量鏡像至伺服器組

轉寄至後端多伺服器組

設定將ALB請求轉寄至後端多個伺服器組,可以通過ServerGroupID指定後端掛載的伺服器組,也可以通過ServiceName+ServicePort建立或掛載伺服器組。可以佈建要求轉寄至各後端伺服器組的權重,也支援開啟伺服器組間會話保持。

重要
  • 標準版ALB執行個體最多掛載5個伺服器組。

  • 如果同時通過ServerGroupIDServiceName+ServicePort掛載伺服器組,優先根據ServerGroupID匹配後端伺服器組。

  • 開啟伺服器組間會話保持後,ALB Ingress會將屬於同一會話的請求轉寄到同一後端。

alb.ingress.kubernetes.io/actions.service-name: | # 請注意:此註解名稱中的"service-name"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄動作將對應生效。
       [{
           "type": "ForwardGroup",
           "ForwardConfig": {
             "ServerGroups" : [{
               "ServiceName": "tea-svc",
               "Weight": 30,
               "ServicePort": 80
             },
             {
               "ServiceName": "coffee-svc",
               "Weight": 20,
               "ServicePort": 80
             },
             {
               "ServerGroupID": "sgp-71aexb9y93ypo*****",
               "Weight": 20
             },
             {
               "ServerGroupID": "sgp-slygpbvm2cydo*****",
               "Weight": 30
             }],
             "ServerGroupStickySession": {
              "Enabled": true,
              "Timeout": 80
             }
           }
       }]
  • type:轉寄動作類型,設定為ForwardGroup,表示配置轉寄至後端多伺服器組。

  • ForwardConfig:後端轉寄伺服器組具體參數。如果設定了多個伺服器組,請求按照權重轉寄至各伺服器組。

  • ServerGroupID:伺服器組ID。

  • ServiceName:服務的名稱。

  • ServicePort:服務的連接埠。

  • Weight:請求轉寄至各伺服器組權重。

  • Enabled:是否開啟伺服器組間會話保持。

  • Timeout:伺服器組間會話保持逾時時間。

轉寄至多伺服器組的情境樣本,請參見情境五:請求轉寄至多個後端伺服器組

重寫

設定ALB支援重寫,在接到用戶端請求後,可以修改請求的網域名稱、路徑和查詢字串再轉寄到後端。

重要
  • 重寫轉寄動作與註解項rewrite-target衝突,不可以重複。

  • 重寫目前不可與固定響應和重新導向轉寄動作共用。

alb.ingress.kubernetes.io/actions.service-name: | # 請注意:此註解名稱中的"service-name"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄動作將對應生效。
       [{
           "type": "Rewrite",
           "RewriteConfig": {
               "Host": "demo.domain.ingress.top",
               "Path": "/test",
               "Query": "querystring"
           }
       }]
  • type:轉寄動作類型,設定為Rewrite使用重寫。

  • host:重寫後請求使用的網域名稱,設定為${host}、不填寫值("host": "")、或不配置此項時,表明使用原請求中的值。

  • path:重寫後請求使用的路徑,設定為${path}、不填寫值("path": "")、或不配置此項時,表明使用原請求中的值。

  • query:重寫後請求的查詢字串,設定為${query}、不填寫值("query": "")、或不配置此項時,表明使用原請求中的值。

重要

hostpathquery是特殊參數,可配置為使用原請求中的預設值,但需至少有一項配置為非預設值。以host為例,設定為${host}、空置("host": "")、不填寫此項時,都表明使用原請求中的值。

重寫的情境樣本,請參見情境六:重寫請求配置資訊

插入要求標頭

設定頭欄位名稱和頭欄位內容,將覆蓋請求中已有的頭變數。樣本如下。

alb.ingress.kubernetes.io/actions.service-name: | # 請注意:此註解名稱中的"service-name"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄動作將對應生效。
  [{
      "type": "InsertHeader",
      "InsertHeaderConfig": {
          "key": "key",
          "value": "value",
          "valueType": "UserDefined"
      }
  }]
  • type:轉寄動作類型,設定為InsertHeader,表示配置插入要求標頭。

  • key:要求標頭的欄位名稱。

  • value:要求標頭的欄位內容。

  • valueType:實值型別。

插入要求標頭的情境樣本,請參見情境三:插入source: alibaba要求標頭

刪除要求標頭

刪除頭欄位名稱和頭欄位內容。樣本如下。

alb.ingress.kubernetes.io/actions.service-name: | # 請注意:此註解名稱中的"service-name"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄動作將對應生效。
     [{
         "type": "RemoveHeader",
         "RemoveHeaderConfig": {
             "key": "key"
         }
     }]

type:轉寄動作類型,設定為RemoveHeader,表示配置刪除要求標頭。

key:要求標頭的欄位名稱。

QPS限速

設定ALB的轉寄規則時,可以同時配置總體請求速率限制和基於用戶端源IP的請求速率限制。

具體配置樣本如下:

重要
  • QPS限速轉寄動作需要和轉寄至伺服器組同時使用。

  • 當X-Forwarded-For請求標題中包含多個IP地址時,例如X-Forwarded-For: <client-ip-address>, <proxy1>, <proxy2>, …,最左邊的地址是真實用戶端IP,如果您需要使用基於用戶端源IP限速功能,您需要在監聽開啟尋找真實用戶端源IP開關,以便ALB從X-Forwarded-For頭欄位中尋找真實用戶端源IP。更多資訊,請參見XForwardedForConfig

 annotations:
    alb.ingress.kubernetes.io/actions.service-name: | # 請注意:此註解名稱中的"service-name"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄動作將對應生效。
      [{
          "type": "TrafficLimit",
          "TrafficLimitConfig": {
              "QPS": "1000",
              "QPSPerIp": "100"
          }
      }]
  • type:指定轉寄動作的類型,此處設定為TrafficLimit,表示這是一個限速配置。

  • QPS:總體請求速率限制,即每秒可以處理的請求次數,取值範圍是[1,1000000]。當請求速率超出設定的規格後,超出部分的建立串連請求將被拒絕,並且用戶端將收到HTTP狀態代碼503。

  • QPSPerIp:表示基於每個用戶端源IP的請求速率限制,取值範圍是[1,1000000]。當同時設定了QPS(總體限速)和QPSPerIp(基於用戶端源IP的限速)時,後者的值必須小於前者。當請求速率超出了設定的規格後,超出部分的請求將被拒絕,並且用戶端將收到HTTP狀態代碼503。

回應程式向的轉寄動作

轉寄動作

描述

插入要求標頭

設定頭欄位名稱和頭欄位內容,將覆蓋請求中已有的頭變數。樣本如下。

alb.ingress.kubernetes.io/actions.service-name: | # 請注意:此註解名稱中的"service-name"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄動作將對應生效。
  [{
      "type": "InsertHeader",
      "InsertHeaderConfig": {
          "key": "key",
          "value": "value",
          "valueType": "UserDefined"
      }
  }]
  • type:轉寄動作類型,設定為InsertHeader,表示配置插入要求標頭。

  • key:要求標頭的欄位名稱。

  • value:要求標頭的欄位內容。

  • valueType:實值型別。

在回應程式向修改要求標頭的情境樣本,請參見情境七:基於ResponseHeader對回應程式向的要求標頭進行修改情境八:基於響應狀態代碼對回應程式向的要求標頭進行修改

刪除要求標頭

刪除頭欄位名稱和頭欄位內容。樣本如下。

alb.ingress.kubernetes.io/actions.service-name: | # 請注意:此註解名稱中的"service-name"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄動作將對應生效。
     [{
         "type": "RemoveHeader",
         "RemoveHeaderConfig": {
             "key": "key"
         }
     }]

type:轉寄動作類型,設定為RemoveHeader,表示配置刪除要求標頭。

key:要求標頭的欄位名稱。

情境一:設定固定響應503狀態代碼和內容

控制台

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇網路 > 路由

  3. 路由頁面,單擊建立 Ingress,在建立 Ingress對話方塊配置路由。

    配置項

    說明

    樣本值

    網關類型

    可按需選擇ALB IngressMSE IngressNginx Ingress三種網關類型。

    關於三種網關的差異,請參見Nginx Ingress、ALB Ingress和MSE Ingress對比

    ALB應用型負載平衡

    名稱

    自訂路由名稱。

    ingress

    Ingress Class

    關聯的IngressClass的名稱。

    alb

    規則

    單擊+ 添加規則可新增多個路由規則。

    • 網域名稱:自訂網域名。

    • 路徑映射:配置如下配置項。

      • 路徑基於URL路徑轉寄請求

      • 匹配規則

        • 首碼匹配(Prefix):匹配請求URL路徑的首碼部分。

        • 完整匹配(Exact):完全符合請求URL路徑。

        • 預設(ImplementationSpecific):由Ingress控制器實現的具體邏輯決定,ALB Ingress使用完整匹配(Exact)的邏輯。

      • 服務名稱:選擇目標服務,即K8s內的Service。

      • 連接埠:選擇服務需要暴露的連接埠。

    • Ingress支援同一個網域名稱下配置多條路徑。單擊+ 添加路徑新增路徑。

    • 網域名稱:不填寫

    • 路徑映射

      • 路徑:/

      • 匹配規則:預設(首碼匹配Prefix)

      • 服務名稱:response-503

      • 連接埠:80

    自訂轉寄規則

    開啟自訂轉寄規則,可精細化管理入站流量。

    說明

    轉寄規則的條件條目上限為10個。

    • 轉寄條件下拉框中選擇:

      • 網域名稱

        匹配請求網域名稱,如果設定了多個網域名稱,則網域名稱之間是或的關係。設定後會添加註釋alb.ingress.kubernetes.io/conditions.host-example

      • 路徑

        匹配請求路徑,如果設定了多個路徑,則路徑之間是或的關係。設定後會添加註釋alb.ingress.kubernetes.io/conditions.path-example

      • HTTP標題

        以索引值對形式匹配請求的頭部資訊。例如,鍵是headername值是headervalue1。如果設定了多個Header值,則Header之間是或的關係。設定後會添加註釋alb.ingress.kubernetes.io/conditions.http-header-example

    • 轉寄動作下拉框中選擇:

      返回固定響應

      設定通過ALB給用戶端返回固定響應內容,可以設定響應狀態代碼,本文內容和本文類型。按需求配置響應狀態代碼響應本文類型(可選)響應本文(可選)

      響應本文類型

      • text/plain:表示無格式的內容類型。

      • text/css:表示XML格式的內容。

      • text/html:表示HTML格式的內容。

      • application/javascript:表示JavaScript格式的內容。

      • application/json:表示JSON格式內容類型。

    • 轉寄條件:選擇路徑。(保持預設)

    • 轉寄動作返回固定響應

      • 響應狀態代碼:503

      • 響應本文類型(可選)text/plain

      • 響應本文(可選):error

    其他配置保持預設。

  4. 配置成功後,單擊確定

kubectl

以下代碼塊定義了請求服務時,將返回503狀態代碼和503 error text

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: default
  name: ingress
  annotations:
    alb.ingress.kubernetes.io/actions.service-name: | # 請注意:此註解名稱中的"service-name"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄動作將對應生效。
      [{
          "type": "FixedResponse",
          "FixedResponseConfig": {
              "contentType": "text/plain",
              "httpCode": "503",
              "content": "503 error text"
          }
      }]
spec:
  ingressClassName: alb
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: service-name  # 請注意:此處配置的後端服務名稱與自訂轉寄動作註解alb.ingress.kubernetes.io/actions.service-name中所配置的"service-name"需對應一致,註解中所配置的轉寄動作將生效至相應後端服務。
                port:
                  name: use-annotation # servicePort的名稱必須為use-annotation。

情境二:使用301重新導向到HTTPS連接埠

以下代碼塊定義了請求服務時,將重新導向到服務的HTTPS連接埠。

重新導向

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: default
  name: ingress
  annotations:
    alb.ingress.kubernetes.io/actions.redirect: | # 請注意:此註解名稱中的"redirect"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄動作將對應生效。
      [{
          "type": "Redirect",
          "RedirectConfig": {
              "host": "demo.domain.ingress.top",
              "path": "/test",
              "port": "443",
              "protocol": "https",
              "query": "querystring",
              "httpCode": "301"
          }
      }]
spec:
  ingressClassName: alb
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: redirect # 請注意:此處配置的後端服務名稱與自訂轉寄動作註解alb.ingress.kubernetes.io/actions.redirect中所配置的"redirect"需對應一致,註解中所配置的轉寄動作將生效至相應後端服務。
                port:
                  name: use-annotation # servicePort的名稱必須為use-annotation。

多重新導向

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: default
  name: ingress
  annotations:
    alb.ingress.kubernetes.io/listen-ports: |
     [{"HTTP": 8001}]
    alb.ingress.kubernetes.io/actions.redirect-1: |
      [{
          "type": "Redirect",
          "RedirectConfig": {
              "host": "demo.domain.ingress.top",
              "path": "/test",
              "port": "443",
              "protocol": "https",
              "query": "querystring",
              "httpCode": "301"
          }
      }]
    alb.ingress.kubernetes.io/actions.redirect-2: |
      [{
          "type": "Redirect",
          "RedirectConfig": {
              "host": "demo.domain.ingress.top",
              "path": "/test",
              "port": "443",
              "protocol": "https",
              "httpCode": "301"
          }
      }]
spec:
  ingressClassName: ml-test-ingressclass-rolechain-2
  rules:
    - http:
        paths:
          - path: /foo
            pathType: Prefix
            backend:
              service:
                name: redirect-1
                port:
                  name: use-annotation 
          - path: /bar
            pathType: Prefix
            backend:
              service:
                name: redirect-2
                port:
                  name: use-annotation

情境三:插入source: alibaba要求標頭

以下代碼塊定義了請求服務時,將使用source: alibaba覆蓋原有要求標頭。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: default
  name: ingress
  annotations:
    alb.ingress.kubernetes.io/actions.insert-header: | # 請注意:此註解名稱中的"insert-header"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄動作將對應生效。
      [{
          "type": "InsertHeader",
          "InsertHeaderConfig": {
              "key": "source",
              "value": "alibaba",
              "valueType": "UserDefined"
          }
      }]
spec:
  ingressClassName: alb
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: insert-header # 請注意:此處配置的後端服務名稱與自訂轉寄動作註解alb.ingress.kubernetes.io/actions.insert-header中所配置的"insert-header"需對應一致,註解中所配置的轉寄動作將生效至相應後端服務。
                port:
                  number: 80

情境四:流量鏡像至伺服器組

以下代碼塊定義了請求服務時,將提取複寫到流量鏡像伺服器組

登入應用型負載平衡ALB控制台,在左側導覽列選擇應用型負載平衡 ALB > 伺服器組,在伺服器組頁面擷取伺服器組ID。伺服器組

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: traffic-mirror-ingress
  annotations:
  # mirror-svc必須為下方填入的backend.service之一。
  # ALB Ingress會將轉寄至mirror-svc的流量鏡像到"ServerGroupID"中填入的後端伺服器
  # 如果有多個Service需要配置流量鏡像,請為每個Service分別填寫一條annotation
   alb.ingress.kubernetes.io/actions.mirror-svc: | # 請注意:此註解名稱中的"mirror-svc"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄動作將對應生效。
       [{
           "type": "TrafficMirror",
           "TrafficMirrorConfig": {
              "TargetType" : "ForwardGroupMirror",
              "MirrorGroupConfig": {
                  "ServerGroupTuples" : [{
                      "ServerGroupID": "sgp-2auud2fxj1r46*****"
                  }]
              }
           }
       }]
spec:
  ingressClassName: alb
  rules:
   - host: demo.domain.ingress.top
     http:
      paths:
      - path: /test
        pathType: Prefix
        backend:
          service:
            name: mirror-svc # 請注意:此處配置的後端服務名稱與自訂轉寄動作註解alb.ingress.kubernetes.io/actions.mirror-svc中所配置的"mirror-svc"需對應一致,註解中所配置的轉寄動作將生效至相應後端服務。
            port:
              number: 80

情境五:請求轉寄至多個後端伺服器組

控制台

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇網路 > 路由

  3. 路由頁面,單擊建立 Ingress,在建立 Ingress對話方塊配置路由。

    配置項

    說明

    樣本值

    網關類型

    可按需選擇ALB IngressMSE IngressNginx Ingress三種網關類型。

    關於三種網關的差異,請參見Nginx Ingress、ALB Ingress和MSE Ingress對比

    ALB應用型負載平衡

    名稱

    自訂路由名稱。

    forward-ingress

    Ingress Class

    關聯的IngressClass的名稱。

    alb

    規則

    單擊+ 添加規則可新增多個路由規則。

    • 網域名稱:自訂網域名。

    • 路徑映射:配置如下配置項。

      • 路徑基於URL路徑轉寄請求

      • 匹配規則

        • 首碼匹配(Prefix):匹配請求URL路徑的首碼部分。

        • 完整匹配(Exact):完全符合請求URL路徑。

        • 預設(ImplementationSpecific):由Ingress控制器實現的具體邏輯決定,ALB Ingress使用完整匹配(Exact)的邏輯。

      • 服務名稱:選擇目標服務,即K8s內的Service。

      • 連接埠:選擇服務需要暴露的連接埠。

    • Ingress支援同一個網域名稱下配置多條路徑。單擊+ 添加路徑新增路徑。

    • 網域名稱:demo.domain.ingress.top

    • 路徑映射

      • 路徑:/path

      • 匹配規則:預設(首碼匹配Prefix)

      • 服務名稱:forward

      • 連接埠:80

    自訂轉寄規則

    開啟自訂轉寄規則,可精細化管理入站流量。

    說明

    轉寄規則的條件條目上限為10個。

    • 轉寄條件下拉框中選擇:

      • 網域名稱

        匹配請求網域名稱,如果設定了多個網域名稱,則網域名稱之間是或的關係。設定後會添加註釋alb.ingress.kubernetes.io/conditions.host-example

      • 路徑

        匹配請求路徑,如果設定了多個路徑,則路徑之間是或的關係。設定後會添加註釋alb.ingress.kubernetes.io/conditions.path-example

      • HTTP標題

        以索引值對形式匹配請求的頭部資訊。例如,鍵是headername值是headervalue1。如果設定了多個Header值,則Header之間是或的關係。設定後會添加註釋alb.ingress.kubernetes.io/conditions.http-header-example

    • 轉寄動作下拉框中選擇:

      轉寄至

      轉寄到後端多伺服器組。在服務名稱中,請選擇目標服務。在連接埠中,選擇目標連接埠號碼。然後自訂配置權重值。

      說明
      • 如果是Flannel網路外掛程式叢集則不支援ClusterIP類型服務。

      • 選擇轉寄至時,無需配置規則中的路徑映射。

    • 轉寄條件:選擇網域名稱。網域名稱:demo.domain.ingress.top

    • 轉寄動作轉寄至

      • 服務名稱:tea-svc

      • 連接埠:80

      • 配置權重:80

    • 添加服務

      • 服務名稱:coffee-svc

      • 連接埠:80

      • 配置權重:20

    其他配置保持預設。

  4. 配置完成,在建立Ingress頁面的左下角,單擊確定。

kubectl

以下代碼塊定義了請求服務時,將請求轉寄至叢集內的多個服務。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: forward-ingress
  annotations:
  # 註解中的服務為叢集中事實存在的服務,且服務名稱必須和rule欄位backend下的服務名稱一致。
    alb.ingress.kubernetes.io/actions.service-name: | # 請注意:此註解名稱中的"service-name"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄動作將對應生效。
       [{
           "type": "ForwardGroup",
           "ForwardConfig": {
             "ServerGroups" : [{
               "ServiceName": "tea-svc",
               "Weight": 80,
               "ServicePort": 80
             },
             {
               "ServiceName": "coffee-svc",
               "Weight": 20,
               "ServicePort": 80
             }]
           }
       }]
spec:
  ingressClassName: alb
  rules:
   - host: demo.domain.ingress.top
     http:
      paths:
      - path: /path
        pathType: Prefix
        backend:
          service:
            name: service-name # 請注意:此處配置的後端服務名稱與自訂轉寄動作註解alb.ingress.kubernetes.io/actions.service-name中所配置的"service-name"需對應一致,註解中所配置的轉寄動作將生效至相應後端服務。
            port:
              name: use-annotation # servicePort的名稱必須為use-annotation。

情境六:重寫請求配置資訊

使用Rewrite重寫可以修改使用者訪問路徑,但無法修改網域名稱。通過使用自訂轉寄規則,ALB Ingress可以修改請求中的網域名稱、路徑和查詢參數,再轉寄給後端服務,適用於URL簡化、對用戶端無感的重新導向、隱藏後端技術實現等情境。下方的樣本中,通過alb.ingress.kubernetes.io/actions.service-name Annotation配置了重寫。

下方樣本中,用戶端使用的URL為https://example.com/api/users,經過重寫後,URL變更為https://example.org/users,使用用戶端原始的請求Query。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: default
  name: rewrite-ingress
  annotations:
    alb.ingress.kubernetes.io/actions.service-name: | # 此註解名稱中的"service-name"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄動作將對應生效。
       [{
           "type": "Rewrite",
           "RewriteConfig": {
               "Host": "example.org", 
               "Path": "/users", 
               "Query": "${query}" # ${query}表示使用用戶端原始的請求Query 
           }
       }]
spec:
  ingressClassName: alb
  rules:
    - host: example.com
      http:
        paths:
          - path: /api/users
            pathType: ImplementationSpecific
            backend:
              service:
                name: service-name # 此處配置的後端服務名稱與自訂轉寄動作註解alb.ingress.kubernetes.io/actions.service-name中所配置的"service-name"需對應一致,註解中所配置的轉寄動作將生效至相應後端服務。
                port: 
                  number: 80

情境七:基於ResponseHeader對回應程式向的要求標頭進行修改

重要
  • 自訂的ALB ingress轉寄規則在預設情況下為請求方向,如果您希望建立回應程式向的轉寄規則,則需要將註解項 alb.ingress.kubernetes.io/rule-direction.<Service的名稱> 配置為Response(該註解項預設配置為Request)。

  • 當建立回應程式向的轉寄規則時,backend.service.port.name必須設定為use-annotation

以下代碼塊定義了當匹配到ResponseHeader時,即Header中包含response-hello,值必須為value1value2,那麼將在Header中插入新的要求標頭source: alibaba

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
   alb.ingress.kubernetes.io/rule-direction.response-header: Response
   alb.ingress.kubernetes.io/conditions.response-header: | # 請注意:此註解名稱中的"response-header"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄條件將對應生效。
     [{
         "type": "ResponseHeader",
         "responseHeaderConfig": {
            "key": "response-hello",
            "values": [
               "value1",
               "value2"
            ]
         }
     }]
   alb.ingress.kubernetes.io/actions.response-header: | # 請注意:此註解名稱中的"response-header"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄動作將對應生效。
     [{
         "type": "InsertHeader",
         "InsertHeaderConfig": {
             "key": "source",
             "value": "alibaba",
             "valueType": "UserDefined"
         }
     }]
  name: response-header
spec:
  ingressClassName: alb
  rules:
   - http:
      paths:
      - path: /
        pathType: ImplementationSpecific
        backend:
          service:
            name: response-header # 請注意:此處配置的後端服務名稱與自訂轉寄條件/動作註解中所配置的"response-header"需對應一致,註解中所配置的轉寄條件/動作將生效至相應後端服務。
            port:
              name: use-annotation # servicePort的名稱必須為use-annotation。

情境八:基於響應狀態代碼對回應程式向的要求標頭進行修改

重要
  • 自訂的ALB ingress轉寄規則在預設情況為請求方向,如果您希望建立回應程式向的轉寄規則,則需要將註解項 alb.ingress.kubernetes.io/rule-direction.<Service的名稱> 配置為Response(該註解項預設配置為Request)。

  • 當建立回應程式向的轉寄規則時,backend.service.port.name必須設定為use-annotation

以下代碼塊定義了僅當響應狀態代碼為200或300時,才會對要求標頭執行移除操作(將response-hello從請求Header中移除)。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
   alb.ingress.kubernetes.io/rule-direction.response-hello: Response
   alb.ingress.kubernetes.io/conditions.response-hello: | # 請注意:此註解名稱中的"response-hello"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄條件將對應生效。
     [{
       "type": "ResponseStatusCode",
       "responseStatusCodeConfig": {
         "values": [
             "200",
             "300"
         ]
       }
     }]
   alb.ingress.kubernetes.io/actions.response-hello: | # 請注意:此註解名稱中的"response-hello"必須與spec.rules中配置的後端服務名稱對應一致,註解中所配置的轉寄動作將對應生效。
     [{
         "type": "RemoveHeader",
         "RemoveHeaderConfig": {
             "key": "response-hello"
         }
     }]
  name: response-hello
spec:
  ingressClassName: alb
  rules:
   - http:
      paths:
      - path: /*
        pathType: ImplementationSpecific
        backend:
          service:
            name: response-hello # 請注意:此處配置的後端服務名稱與自訂轉寄條件/動作註解中所配置的"response-hello"需對應一致,註解中所配置的轉寄條件/動作將生效至相應後端服務。
            port:
              name: use-annotation # servicePort的名稱必須為use-annotation。

轉寄條件與動作實踐

情境一:基於網域名稱的轉寄條件和動作,轉寄至指定的服務

在本節中,介紹如何在ACK控制台中,通過基於網域名稱的轉寄條件和配置相應的轉寄動作,將流量轉寄至指定的服務。

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集列表

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇網路 > 路由

  3. 路由頁面,單擊建立 Ingress,在建立 Ingress對話方塊配置路由。

    配置項

    說明

    樣本值

    網關類型

    可按需選擇ALB IngressMSE IngressNginx Ingress三種網關類型。

    關於三種網關的差異,請參見Nginx Ingress、ALB Ingress和MSE Ingress對比

    ALB應用型負載平衡

    名稱

    自訂路由名稱。

    alb_ingress

    Ingress Class

    關聯的IngressClass的名稱。

    alb

    規則

    單擊+ 添加規則可新增多個路由規則。

    • 網域名稱:自訂網域名。

    • 路徑映射:配置如下配置項。

      • 路徑基於URL路徑轉寄請求

      • 匹配規則

        • 首碼匹配(Prefix):匹配請求URL路徑的首碼部分。

        • 完整匹配(Exact):完全符合請求URL路徑。

        • 預設(ImplementationSpecific):由Ingress控制器實現的具體邏輯決定,ALB Ingress使用完整匹配(Exact)的邏輯。

      • 服務名稱:選擇目標服務,即K8s內的Service。

      • 連接埠:選擇服務需要暴露的連接埠。

    • Ingress支援同一個網域名稱下配置多條路徑。單擊+ 添加路徑新增路徑。

    • 網域名稱:*.example.com

    • 路徑映射

      • 路徑:/tes

      • 匹配規則:預設(ImplementationSpecific)

      • 服務名稱:tea-svc

      • 連接埠:80

    自訂轉寄規則

    開啟自訂轉寄規則,可精細化管理入站流量。

    說明

    轉寄規則的條件條目上限為10個。

    • 轉寄條件下拉框中選擇:

      • 網域名稱

        匹配請求網域名稱,如果設定了多個網域名稱,則網域名稱之間是或的關係。設定後會添加註釋alb.ingress.kubernetes.io/conditions.host-example

      • 路徑

        匹配請求路徑,如果設定了多個路徑,則路徑之間是或的關係。設定後會添加註釋alb.ingress.kubernetes.io/conditions.path-example

        重要

        設定路徑轉寄條件後,控制台將會在Ingress中自動添加一條路徑為/created-by-<ALB-ID>的轉寄規則。

      • HTTP標題

        以索引值對形式匹配請求的頭部資訊。例如,鍵是headername值是headervalue1。如果設定了多個Header值,則Header之間是或的關係。設定後會添加註釋alb.ingress.kubernetes.io/conditions.http-header-example

    • 轉寄動作下拉框中選擇:

      • 轉寄至

        轉寄到後端多伺服器組。在服務名稱中,請選擇目標服務。在連接埠中,選擇目標連接埠號碼。然後自訂配置權重值。

        說明

    • 轉寄條件:選擇網域名稱路徑HTTP標題

      • 網域名稱:是example.com,單擊添加網域名稱,或test.com。

    • 轉寄動作:選擇轉寄至

      • 服務名稱:tea-svc

      • 連接埠:80

      • 權重:100

    其他配置,保持預設。

  4. 配置完成,在建立Ingress頁面的左下角,單擊確定。