ALB Ingress支持自定義轉發規則。轉發規則包含轉發條件和轉發動作。您可以自定義轉發條件,指定請求的域名、路徑、請求頭、查詢字符串、請求方法、Cookie、源IP等。您也可以自定義轉發動作,配置固定響應、重定向、插入請求頭、刪除請求頭、流量鏡像、轉發至后端多服務器組和重寫。本文介紹如何自定義ALB Ingress的轉發規則。
前提條件
已安裝ALB Ingress Controller組件,且組件為v2.5.0及以上版本。具體操作,請參見管理組件。
轉發條件
轉發規則的條件條目上限為10個,一旦達到規定數量上限,您將無法再添加更多的條件。
轉發條件ResponseHeader和ResponseStatusCode僅在自定義響應方向轉發規則中有效。
轉發條件介紹
ALB Ingress支持在alb.ingress.kubernetes.io/conditions.<Service的名稱>
注解中配置轉發條件。不同的路由規則塊是與的關系,同一個路由規則塊中的值是或的關系,例如,如果是兩個不同的Header規則塊,那這兩個規則塊是與的關系,但是同一個Header規則塊中設置的值是或的關系。詳細的路由規則說明如下。
轉發條件 | 描述 |
域名 | 匹配請求域名,只有正確的域名的請求才能訪問服務。示例如下。
|
路徑 | 匹配請求路徑,只有正確的路徑的請求才能訪問服務。示例如下。
|
Header | 匹配請求Header,只有正確的Header的請求才能訪問服務。示例如下。
|
查詢字符串 | 匹配查詢字符串, 只有包含正確的查詢字符串的請求才能訪問服務。示例如下。
|
請求方法 | 匹配請求方法,只有正確的請求方法的請求才能訪問服務。示例如下。
|
Cookie | 匹配Cookie,只有包含正確的Cookie的請求才能訪問服務。示例如下。
|
SourceIP | 匹配請求源IP,只有正確的源IP的請求才能訪問服務。示例如下。
|
ResponseHeader | 匹配響應Header,只對攜帶正確Header的響應執行轉發動作。示例如下。
|
ResponseStatusCode | 匹配響應狀態碼,只有返回正確的狀態碼才能訪問服務。示例如下。
|
場景一:基于SourceIP和Header實現流量分發
同一條轉發規則的自定義條件設置的SourceIp數量限制為5個。
以下代碼塊定義了僅當請求的IP、Header和路徑符合配置時,才能實現目標流量分發。
即當請求源IP為192.168.0.0/16或172.16.0.0/16中的IP地址,請求Header中包含gray-hello,值必須為value1或value2,請求路徑為/hello,請求才能路由到gray-hello服務,否則將路由到其他服務。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/order: "1"
alb.ingress.kubernetes.io/conditions.gray-hello: |
[{
"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
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /hello
pathType: ImplementationSpecific
backend:
service:
name: gray-hello
port:
number: 88
alb.ingress.kubernetes.io/order:標識Ingress的優先級,數字越小,優先級越高。
場景二:基于域名、請求方法、Cookie實現流量分發
以下代碼塊定義了僅當請求的域名、請求方法和Cookie符合配置時,才能實現目標流量分發。
即當請求方法為GET或HEAD,請求域名為www.hostvalue1.edu或www.hostvalue2.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: |
[{
"type": "Cookie",
"cookieConfig": {
"values": [
{
"key":"cookiekey1",
"value":"cookievalue1"
}
]
}
},
{
"type": "Method",
"methodConfig": {
"values": [
"GET",
"HEAD"
]
}
},
{
"type": "Host",
"hostConfig": {
"values": [
"www.hostvalue1.edu",
"www.hostvalue2.edu"
]
}
}]
name: ingress-example
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /test
pathType: ImplementationSpecific
backend:
service:
name: 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中必須包含headerkey1和headerkey2,請求Header中包含headerkey1,值必須為headervalue1或headervalue2,請求Header包含headerkey2,值必須為headervalue3或headervalue4,才能路由到service-a服務,否則將路由到service-b服務。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/conditions.service-a: |
[{
"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
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
下的服務名稱一致。在同一條轉發規則中,重定向、固定響應、轉發至多服務器組等終結類型的轉發動作不能同時使用。
配置重定向、固定響應、轉發至多服務器組時,
rule
字段backend
下的servicePort的名稱必須為use-annotation。
請求方向的轉發動作
轉發動作 | 描述 |
固定響應 | 設置通過ALB給客戶端返回固定響應內容,可以設置響應狀態碼,正文內容和正文類型。示例如下。
|
重定向 | 通過HTTP 3xx狀態碼,指導客戶端跳轉到其他地址訪問服務。示例如下。 重要 除了httpCode,重定向的其他參數不能都設置為默認值。
|
流量鏡像 | 設置流量鏡像轉發服務器組ID,將復制請求轉發至流量鏡像服務器組。示例如下。 重要
|
轉發至后端多服務器組 | 設置將ALB請求轉發至后端多個服務器組,可以通過ServerGroupID指定后端掛載的服務器組,也可以通過ServiceName+ServicePort創建或掛載服務器組。可以設置請求轉發至各后端服務器組的權重。示例如下。 重要
|
重寫 | 設置ALB支持重寫,將覆蓋請求的域名、路徑和字符串。示例如下。 重要
更多Rewrite重寫規則,請參見支持Rewrite重寫。 |
插入請求頭 | 設置頭字段名稱和頭字段內容,將覆蓋請求中已有的頭變量。示例如下。
|
刪除請求頭 | 刪除頭字段名稱和頭字段內容。示例如下。
|
響應方向的轉發動作
轉發動作 | 描述 |
插入請求頭 | 設置頭字段名稱和頭字段內容,將覆蓋請求中已有的頭變量。示例如下。
|
刪除請求頭 | 刪除頭字段名稱和頭字段內容。示例如下。
|
場景一:設置固定響應503狀態碼和內容
以下代碼塊定義了請求服務時,將返回503狀態碼和503 error text。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: default
name: ingress
annotations:
alb.ingress.kubernetes.io/actions.response-503: |
[{
"type": "FixedResponse",
"FixedResponseConfig": {
"contentType": "text/plain",
"httpCode": "503",
"content": "503 error text"
}
}]
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: response-503
port:
name: use-annotation
場景二:使用301重定向到HTTPS端口
以下代碼塊定義了請求服務時,將重定向到服務的HTTPS端口。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: default
name: ingress
annotations:
alb.ingress.kubernetes.io/actions.redirect: |
[{
"type": "Redirect",
"RedirectConfig": {
"host": "${host}",
"path": "${path}",
"port": "${port}",
"protocol": "https",
"query": "${query}",
"httpCode": "301"
}
}]
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: redirect
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: |
[{
"type": "InsertHeader",
"InsertHeaderConfig": {
"key": "source",
"value": "alibaba",
"valueType": "UserDefined"
}
}]
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: insert-header
port:
number: 80
場景四:流量鏡像至服務器組
以下代碼塊定義了請求服務時,將復制請求至流量鏡像服務器組。
登錄應用型負載均衡ALB控制臺,在左側導航欄選擇 ,在服務器組頁面獲取服務器組ID。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: traffic-mirror-ingress
annotations:
alb.ingress.kubernetes.io/actions.traffic-mirror: |
[{
"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: traffic-mirror
port:
number: 80
場景五:請求轉發至多個后端服務器組
以下代碼塊定義了請求服務時,將請求轉發至集群內多個服務。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: forward-ingress
annotations:
alb.ingress.kubernetes.io/actions.forward: |
[{
"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: forward
port:
name: use-annotation
場景六:重寫請求配置信息
以下代碼塊定義了請求服務時,重寫請求的域名、路徑和字符串。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: default
name: rewrite-ingress
annotations:
alb.ingress.kubernetes.io/actions.rewrite: |
[{
"type": "Rewrite",
"RewriteConfig": {
"Host": "demo.domain.ingress.top",
"Path": "/test",
"Query": "queryString"
}
}]
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /path
pathType: Prefix
backend:
service:
name: rewrite
port:
port: 80
場景七:基于ResponseHeader對響應方向的請求頭進行修改
自定義的ALB ingress轉發規則在默認情況下為請求方向,如果您希望創建響應方向的轉發規則,則需要將注解項
alb.ingress.kubernetes.io/rule-direction.<Service的名稱>
配置為Response(該注解項默認配置為Request)。當創建響應方向的轉發規則時,
ingressSpec.rules.backend
字段下的servicePort
的名稱必須為use-annotation
。
以下代碼塊定義了當匹配到ResponseHeader
時,即Header中包含response-hello
,值必須為value1
或value2
,那么將在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: |
[{
"type": "ResponseHeader",
"responseHeaderConfig": {
"key": "response-hello",
"values": [
"value1",
"value2"
]
}
}]
alb.ingress.kubernetes.io/actions.response-header: |
[{
"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
port:
name: use-annotation
場景八:基于響應狀態碼對響應方向的請求頭進行修改
自定義的ALB ingress轉發規則在默認情況為請求方向,如果您希望創建響應方向的轉發規則,則需要將注解項
alb.ingress.kubernetes.io/rule-direction.<Service的名稱>
配置為Response(該注解項默認配置為Request)。當創建響應方向的轉發規則時,
ingressSpec.rules.backend
字段下的servicePort
的名稱必須為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: |
[{
"type": "ResponseStatusCode",
"responseStatusCodeConfig": {
"values": [
"200",
"300"
]
}
}]
alb.ingress.kubernetes.io/actions.response-hello: |
[{
"type": "RemoveHeader",
"RemoveHeaderConfig": {
"key": "response-hello"
}
}]
name: response-hello
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /*
pathType: ImplementationSpecific
backend:
service:
name: response-hello
port:
name: use-annotation