在ACK Serverless叢集中,ALB Ingress對叢集服務(Service)中外部可訪問的API對象進行管理,提供七層負載平衡能力。本文介紹如何使用ALB Ingress將來自不同網域名稱或URL路徑的請求轉寄給不同的後端伺服器組、將HTTP訪問重新導向至HTTPS及實現灰階發布等功能。
前提條件
已建立一個ACK Serverless叢集,叢集的VPC需要配置NAT Gateway,從而可以訪問外網,下載容器鏡像。具體操作,請參見Container Service Serverless 版使用快速入門。
- 已通過Kubectl工具串連叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
已建立AlbConfig,具體操作,請參見建立AlbConfig。
基於網域名稱轉寄請求
通過建立一個簡單的Ingress,根據指定的正常網域名稱或空網域名稱轉寄請求,樣本如下。
基於正常網域名稱轉寄請求
以下 YAML 樣本將路由路徑配置為 /hello,訪問 demo.domain.ingress.top/hello 時會轉寄到後端服務。
部署以下模板,分別建立Service、Deployment和Ingress,將訪問請求通過Ingress的網域名稱轉寄至Service。
執行以下命令,通過指定的正常網域名稱訪問服務。
替換ADDRESS為ALB執行個體對應的網域名稱地址,可通過
kubectl get ing擷取。curl -H "host: demo.domain.ingress.top" <ADDRESS>/hello預期輸出:
{"hello":"coffee"}
基於空網域名稱轉寄請求
以下 YAML 樣本將網域名稱配置為空白,路由路徑配置為 /hello,訪問<ADDRESS>/hello時會轉寄到後端服務。
部署以下模板,建立Ingress。
執行以下命令,通過空網域名稱訪問服務。
替換ADDRESS為ALB執行個體對應的網域名稱地址,可通過
kubectl get ing擷取。curl <ADDRESS>/hello預期輸出:
{"hello":"coffee"}
基於URL路徑轉寄請求
ALB Ingress支援按照URL轉寄請求,可以通過匹配規則(pathType)欄位設定不同的URL匹配策略。pathType支援以下三種匹配方式。
完整匹配(
Exact):完全符合請求URL路徑。預設(
ImplementationSpecific):由Ingress控制器實現的具體邏輯決定,在ALB Ingress Controller中為完整匹配(Exact)。若未指定path欄位,ALB Ingress會預設使用/作為path。首碼匹配(
Prefix):匹配請求URL路徑的首碼部分。
pathType設定為Exact或Prefix時,必須將path設定為非空的絕對路徑。否則,Ingress資源將因校正失敗而無法建立。URL匹配策略可能存在衝突的情況,此時將會按照轉寄規則優先順序進行排序,然後再轉寄請求,詳情請參見配置轉寄規則優先順序。
簡單路徑(/、/foo、/foo/)
匹配方式
規則路徑(路由規則)
請求路徑(使用者訪問)
是否命中此規則
首碼匹配(Prefix)
/
/(匹配所有規則)
是
/foo
/foo
/foo/
是
/foo/
/foo
/foo/
是
/aaa
/ccc
否,未匹配首碼。
完整匹配(Exact)或預設(ImplementationSpecific)
/foo
/foo
是
/bar
否
/foo/
否
/foo/
/foo
否
分層路徑(/aaa/bb、/aaa/bbb、/aaa/bbb/)
匹配方式
規則路徑(路由規則)
請求路徑(使用者訪問)
是否命中此規則
首碼匹配(Prefix)
/aaa/bb
/aaa/bbb
否
/aaa/bbb
/aaa/bbb
是
/aaa/bbb/
/aaa/bbb
是,忽略規則路徑尾部斜線。
/aaa/bbb
/aaa/bbb/
是,匹配請求路徑尾部斜線。
/aaa/bbb/ccc
是,匹配請求路徑的子路徑。
同時設定兩條規則路徑
匹配方式
規則路徑(路由規則)
請求路徑(使用者訪問)
是否命中此規則
首碼匹配(Prefix)
/
/aaa
/aaa/ccc
是,請求路徑匹配規則路徑的
/首碼。/aaa
/
/aaa/ccc
是,請求路徑匹配規則路徑的
/aaa首碼。/ccc
是,請求路徑匹配規則路徑的
/首碼。/aaa
/bbb
/ccc
否,未匹配首碼。
三種匹配方式的樣本如下:
首碼匹配(Prefix)
URL路徑採用以/分隔的首碼匹配方式,匹配時區分大小寫,並按路徑中的每個元素逐級比較。
以下樣本 YAML 中,當路由規則配置為/時,所有以/開頭的路徑(如/hello等)都能被匹配和訪問。
部署以下模板,建立Ingress。
執行以下命令,訪問服務。
替換ADDRESS為ALB執行個體對應的網域名稱地址,可通過
kubectl get ing擷取。curl <ADDRESS>/hello
預期輸出:
{"hello":"coffee"}完整匹配(Exact)或預設(ImplementationSpecific)
在以下樣本 YAML 中,路由規則配置為 /hello 時,僅能匹配並訪問 /hello 路徑。
部署以下模板,建立Ingress。
執行以下命令,訪問服務。
替換ADDRESS為ALB執行個體對應的網域名稱地址,可通過
kubectl get ing擷取。curl <ADDRESS>/hello預期輸出:
{"hello":"coffee"}
配置健全狀態檢查
ALB Ingress支援配置健全狀態檢查,可以通過設定以下註解來實現。
註解樣本如下:
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:
... ...參數 | 描述 | 預設值 |
| 是否開啟後端伺服器組的健全狀態檢查。
|
|
| 健全狀態檢查路徑。 |
|
| 健全狀態檢查使用的協議。
|
|
| HTTP協議版本,
|
|
| 健全狀態檢查的方法。
重要
|
|
| 健全狀態檢查狀態代碼。僅當探測請求成功且返回指定狀態代碼時,才認為該後端伺服器狀態正常。 可以填入以下選項中的任意一個或多個組合,多個狀態代碼用英文半形逗號(,)分隔:
|
|
| 健全狀態檢查狀態代碼,僅當探測請求成功且返回指定狀態代碼時,才認為該後端伺服器狀態正常。與 選擇性參數依賴於
|
|
| 健全狀態檢查逾時時間,單位秒(s)。取值範圍:[1, 300]。 |
|
| 健全狀態檢查間隔周期,單位秒(s)。取值範圍:[1, 50]。 |
|
| 健全狀態檢查成功多少次判定為成功。取值範圍:[2, 10]。 |
|
| 健全狀態檢查失敗多少次判定為失敗。取值範圍:[2, 10]。 |
|
| 健全狀態檢查使用的連接埠。 |
說明
|
配置HTTP重新導向至HTTPS
ALB Ingress通過設定註解alb.ingress.kubernetes.io/ssl-redirect: "true",可以將HTTP請求重新導向到HTTPS 443連接埠。
僅支援配置在監聽連接埠為80的HTTP轉寄規則上。
僅支援與自訂轉寄動作:
RemoveHeader、InsertHeader、跨域Cors相關註解配合使用。配置此註解需要保證AlbConfig中已配置443連接埠的HTTPS監聽,請參見通過AlbConfig配置ALB監聽。
1.19及之後版本叢集
apiVersion: v1
kind: Service
metadata:
name: demo-service-ssl
namespace: default
spec:
ports:
- name: port1
port: 80
protocol: TCP
targetPort: 8080
selector:
app: demo-ssl
sessionAffinity: None
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-ssl
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: demo-ssl
template:
metadata:
labels:
app: demo-ssl
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/alb-sample/cafe:v1
imagePullPolicy: IfNotPresent
name: demo-ssl
ports:
- containerPort: 8080
protocol: TCP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/ssl-redirect: "true"
name: demo-ssl
namespace: default
spec:
ingressClassName: alb
tls:
- hosts:
- ssl.alb.ingress.top
rules:
- host: ssl.alb.ingress.top
http:
paths:
- backend:
service:
name: demo-service-ssl
port:
number: 80
path: /
pathType: Prefix1.19版本之前叢集
apiVersion: v1
kind: Service
metadata:
name: demo-service-ssl
namespace: default
spec:
ports:
- name: port1
port: 80
protocol: TCP
targetPort: 8080
selector:
app: demo-ssl
sessionAffinity: None
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-ssl
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: demo-ssl
template:
metadata:
labels:
app: demo-ssl
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/alb-sample/cafe:v1
imagePullPolicy: IfNotPresent
name: demo-ssl
ports:
- containerPort: 8080
protocol: TCP
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/ssl-redirect: "true"
name: demo-ssl
namespace: default
spec:
ingressClassName: alb
tls:
- hosts:
- ssl.alb.ingress.top
rules:
- host: ssl.alb.ingress.top
http:
paths:
- backend:
serviceName: demo-service-ssl
servicePort: 80
path: /
pathType: Prefix支援後端HTTPS和gRPC協議
當前 ALB 支援 HTTPS 和 gRPC 作為後端協議,您只需在 Ingress 中添加以下註解。
Ingress建立後,後端協議不支援修改,如果您需要變更協議,請刪除重建Ingress。
參數 | 描述 | YAML樣本 |
|
| |
配置Regex
使用註解alb.ingress.kubernetes.io/use-regex:"true"啟用正則模式,並在自訂轉寄條件或轉寄動作中配置相應的Regex。
註解僅在pathType: Prefix的路徑規則下生效。
參數 | 描述 | |
| 啟用Regex。 | |
| 配置自訂轉寄條件。更多詳情請參見轉寄條件介紹。
|
正則匹配規則說明:
匹配對象 | 首碼 | 規則樣本 | 用戶端路徑 | 是否命中 | 說明 |
網域名稱 | 以 |
| test.EXAMPLE.com | 是 | 網域名稱支援不區分大小寫正則匹配。 |
路徑 | 以 |
| /API | 是 | 路徑支援不區分大小寫正則匹配。 |
以 |
| /Api | 否 | 路徑支援區分大小寫正則匹配。 |
配置重寫
ALB Ingress支援重寫(Rewrite)功能,在接收到用戶端請求後,修改請求中的Path部分,再發送給後端Service。重寫通過以下兩個Annotation實現:
alb.ingress.kubernetes.io/rewrite-target: /<path>/${number}:啟用重寫,並指定重寫後的路徑。重要使用
${number}格式表示從原路徑中通過Regex擷取的變數,可以配置為${1}、${2}、${3}中的一個或多個,最多可從原路徑中擷取三個變數。Ingress的
pathType需設定為Prefix
alb.ingress.kubernetes.io/use-regex:是否在path中使用Regex,配置rewrite-target後預設開啟。"true":使用Regex。"false":不使用Regex。如果path中有特殊符號(“%#;!()[]^,”\"),Ingress資源會建立失敗。
配置樣本
樣本情境一:移除首碼
下方的YAML樣本中path: /something(/|$)(.*)通過Regex將用戶端請求的路徑分為了三個部分:
/something:匹配需要剝離的首碼。(/|$):第一擷取的群組,匹配/something後的/或$(路徑結尾)。(.*):第二擷取的群組,匹配/something/後的全部內容,在重寫後的路徑中通過${2}使用。
alb.ingress.kubernetes.io/rewrite-target註解中配置的重寫路徑為/(路徑標準首碼)+${2}(第二擷取的群組的內容),路徑的重寫效果如下:
用戶端原始路徑 | 是否匹配PathRegex | 重寫後路徑 |
| 匹配,第二擷取的群組為空白。 |
|
| 匹配,第二擷取的群組為空白。 |
|
| 匹配,第二擷取的群組的內容為 |
|
| 不匹配,在本樣本中未匹配到路由規則,ALB Ingress返回503狀態代碼。 | |
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: rewrite-ingress
annotations:
alb.ingress.kubernetes.io/use-regex: "true" # 允許path欄位使用Regex。
alb.ingress.kubernetes.io/rewrite-target: /${2} # 該註解支援Regex替換。
spec:
ingressClassName: alb
rules:
- host: demo.alb.ingress.top
http:
paths:
- path: /something(/|$)(.*)
pathType: Prefix
backend:
service:
name: rewrite-svc
port:
number: 9080樣本情境二:捕獲並重新排列多個部分
下方樣本捕獲路徑/items/(.*)/(.*)/(.*)中的多個部分並進行重新排列,並且在使用者無感的情況下更改了URL的格式(改為類POST形式)。重寫路徑為/(路徑標準首碼)+${2}(第二擷取的群組的內容)+?code=+${3}(第三擷取的群組的內容),路徑的重寫效果如下:
樣本中明確要求路徑中有四個分段,使用這種方式要求用戶端使用的路徑為固定格式。
用戶端原始路徑 | 是否匹配PathRegex | 重寫後路徑 |
| 匹配,第二擷取的群組的內容為 |
|
| 匹配,第二擷取的群組的內容為 |
|
| 不匹配,在本樣本中未匹配到路由規則,ALB Ingress返回503狀態代碼。 | |
| 不匹配,在本樣本中未匹配到路由規則,ALB Ingress返回503狀態代碼。 | |
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: rewrite-ingress
annotations:
alb.ingress.kubernetes.io/use-regex: "true" # 允許path欄位使用Regex。
alb.ingress.kubernetes.io/rewrite-target: /${2}?code=${3} # 該註解支援Regex替換。
spec:
ingressClassName: alb
rules:
- host: demo.alb.ingress.top
http:
paths:
- path: /items/(.*)/(.*)/(.*)
pathType: Prefix
backend:
service:
name: rewrite-svc
port:
number: 9080樣本情境三:將多個路徑重寫到單一路徑
下方樣本通過同時對多個路徑(/app-a(/|$)(.*)和/app-b(/|$)(.*))進行正則匹配,將多個路徑重寫到一個單一路徑。重寫路徑為/app-c/+${2}(第二擷取的群組的內容),路徑的重寫效果如下:
用戶端原始路徑 | 是否匹配PathRegex | 重寫後路徑 |
| 匹配,第二擷取的群組的內容為 |
|
| 匹配,第二擷取的群組的內容為 |
|
| 匹配,第二擷取的群組為空白。 |
|
| 不匹配,在本樣本中未匹配到路由規則,ALB Ingress返回503狀態代碼。 | |
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: rewrite-ingress
annotations:
alb.ingress.kubernetes.io/use-regex: "true" # 允許path欄位使用Regex。
alb.ingress.kubernetes.io/rewrite-target: /app-c/${2} # 該註解支援Regex替換。
spec:
ingressClassName: alb
rules:
- host: demo.alb.ingress.top
http:
paths:
- path: /app-a(/|$)(.*)
pathType: Prefix
backend:
service:
name: rewrite-svc
port:
number: 9080
- path: /app-b(/|$)(.*)
pathType: Prefix
backend:
service:
name: rewrite-svc
port:
number: 9080樣本情境四:重寫網域名稱
alb.ingress.kubernetes.io/rewrite-target 註解僅支援更改路徑,如需更改URL中的其他部分,例如網域名稱與參數,請使用自訂轉寄規則。
驗證重寫規則匹配
使用sed命令可以提前測試用戶端使用的特定路徑是否匹配path中配置的Regex,並查看重寫後的新路徑。
以樣本情境二:捕獲並重新排列多個部分中的捕獲路徑/items/(.*)/(.*)/(.*)和重寫規則/${2}?code=${3}為例:
將下方的樣本命令儲存到
path2.txt:/items/electronics/computers/554 /items/produce/fruits/12 /items/headphones/5 /drinks/41查看路徑是否匹配,以及重寫後的路徑:
下方命令中對樣本中的pathRegex(
/items/(.*)/(.*)/(.*))和重寫後的路徑(/${2}?code=${3})進行了改寫,在sed命令中特殊字元/前需要使用逸出字元\,擷取的群組內容的寫法由${2}改為\2。sed -E 's#\/items\/(.*)\/(.*)\/(.*)#Matched: [&] ---> Rewritten: [/\2?code=\3]#' path2.txt預期輸出如下,前兩條路徑匹配重寫規則,會被重寫到新的路徑;後兩條路徑不匹配,不會被重寫。
Matched: [/items/electronics/computers/554] ---> Rewritten: [/computers?code=554] Matched: [/items/produce/fruits/12] ---> Rewritten: [/fruits?code=12] /items/headphones/5 /drinks/41
配置自訂監聽連接埠
ALB Ingress 支援通過註解自訂監聽連接埠,可實現服務同時暴露 80(HTTP)和 443(HTTPS)連接埠。
ALB不支援直接在Ingress中建立新的監聽。為確保Ingress能夠正常工作,您需要先在AlbConfig中建立所需的監聽連接埠和協議,然後在Ingress中將這些監聽與服務關聯起來。關於如何建立ALB監聽,請參見通過AlbConfig配置ALB監聽。
參數 | 描述 | YAML樣本 |
| 使服務同時監聽 80 和 443 連接埠。 | |
配置轉寄規則優先順序
預設情況下,ALB 轉寄規則的優先順序排序依據如下:
不同Ingress按照
namespace/name的字典順序優先順序進行排列,字典順序小的優先順序高。先比較 namespace,若相同則再比 name,各字元逐一比較。
同一個Ingress按照
rule欄位先後順序進行排序,配置在上面的優先順序高。rules: - host: www.example.com http: ... - host: www.test.com http: ...
若不修改Ingress的namespace/name欄位,可以配置以下Ingress註解定義ALB轉寄規則優先順序:
參數 | 描述 | 取值範圍 | YAML樣本 |
| 定義 ALB 轉寄規則的優先順序,值越小優先順序越高。 同一個監聽內規則優先順序必須唯一。 | [1,1000] 預設值:10 | |
通過註解實現灰階發布
ALB支援複雜路由處理,具備基於 Header、Cookie 及權重的灰階發布能力。可通過配置以下相關註解靈活實現各類灰階發布策略。關於灰階發布最佳實務,請參見通過ALB Ingress實現灰階發布。
參數 | 描述 | 說明 |
| 開啟灰階發布能力 |
|
基於指定Header實現灰階流量分配
參數
描述
YAML樣本
alb.ingress.kubernetes.io/canary-by-header該規則允許自訂請求的 Header 及其對應值,需同時配置兩個註解。
當請求中的
header和header-value與設定的值匹配時,請求流量會被分配到灰階服務入口。其他不匹配的請求會根據灰階優先順序分配到後續規則對應的灰階服務。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/order: "1" alb.ingress.kubernetes.io/canary: "true" alb.ingress.kubernetes.io/canary-by-header: "location" alb.ingress.kubernetes.io/canary-by-header-value: "hz" name: demo-canary spec: ... ...alb.ingress.kubernetes.io/canary-by-header-value當請求中的 Header 包含
location: hz時,流量將被路由到灰階服務;其餘請求則會根據灰階權重策略分配到對應的灰階服務。配置樣本如下。基於指定Cookie實現灰階流量分配
參數
Cookie取值
YAML樣本
alb.ingress.kubernetes.io/canary-by-cookiealways:請求流量將全部分配到灰階服務入口never:請求流量不會分配到灰階服務入口
基於Cookie的灰階不支援設定自訂,只有
always和never。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/order: "2" alb.ingress.kubernetes.io/canary: "true" alb.ingress.kubernetes.io/canary-by-cookie: "demo" name: demo-canary-cookie ... ...要求標頭中有
Cookie: demo=always,則流量路由到灰階服務;如果要求標頭中有Cookie: demo=never,則流量不會路由到灰階服務。配置樣本如下。按權重進行流量分配
參數
描述
YAML樣本
alb.ingress.kubernetes.io/canary-weight佈建要求到指定服務的百分比。取值範圍:0~100的整數。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/order: "3" alb.ingress.kubernetes.io/canary: "true" alb.ingress.kubernetes.io/canary-weight: "50" name: demo-canary-weight配置灰階服務的權重為50%,樣本如下:
通過註解實現會話保持
ALB Ingress支援通過以下註解實現會話保持。
註解樣本如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cafe-ingress-v3
annotations:
alb.ingress.kubernetes.io/sticky-session: "true"
alb.ingress.kubernetes.io/sticky-session-type: "Server" # 支援自訂cookie時,植入cookie類型需為Server。
alb.ingress.kubernetes.io/cookie-timeout: "1800"
alb.ingress.kubernetes.io/cookie: "test"
spec:
... ...參數 | 描述 | 預設值 |
| 是否啟用會話保持。
|
|
| Cookie的處理方式。
說明 當前伺服器組 |
|
| Cookie 逾時時間(單位:秒)取值:1~86400;
| 1000 |
| 自訂Cookie值。
| "" |
指定伺服器組負載平衡演算法
ALB Ingress 可通過以下註解指定伺服器組的負載平衡演算法,具體取值及說明見下表。
參數 | 取值 | 描述 | |
|
| 加權輪詢,權重高的後端伺服器被輪詢到機率更高(預設值)。 | |
| 根據每台後端伺服器設定的權重值和後端伺服器的實際負載(即串連數)進行輪詢。權重相同則優先選擇串連數少的伺服器。 | ||
| 源IP一致性Hash,基於用戶端源IP請求做雜湊分配,同一IP分配至同一後端伺服器。 | ||
| 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參數 | 說明 |
| 允許通過瀏覽器訪問的網站。使用半形逗號(,)分割。 值必須以http://或者https://開頭,後跟一個正確網域名稱,或者一級的泛網域名稱。預設值: |
| 允許跨域方法,不區分大小寫。跨域方法之間使用半形逗號(,)分割。 預設值: |
| 允許跨域傳播的要求標頭,只能輸入字母、數字、底線(_)和短劃線(-)。要求標頭之間使用半形逗號(,)分割。 預設值: |
| 允許暴露的Header列表,允許輸入字母、數字、底線(_)、短劃線(-)和星號(*)。Header之間使用半形逗號(,)分割。 預設值: |
| 設定跨域訪問時是否允許攜帶憑證資訊。 預設值: |
| 對於非簡單請求,設定OPTIONS預檢請求在瀏覽器的最大緩衝時間(秒),取值範圍[-1, 172800]。 預設值: |
後端長連結
傳統負載平衡採用短連結訪問後端伺服器組,每次請求都需建立和斷開TCP串連,成為高效能系統的瓶頸。後端長連結支援極大減少了串連資源消耗,大幅提高處理效能。您可以在ALB Ingress中通過註解alb.ingress.kubernetes.io/backend-keepalive開啟後端長連結。參考樣本如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: alb-ingress
annotations:
alb.ingress.kubernetes.io/backend-keepalive: "true"
spec:
ingressClassName: alb
rules:
- host: demo.alb.ingress.top
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: cloud-nodeport
port:
number: 80支援QPS限速
ALB本身支援轉寄規則的QPS限速功能,限速值要求在1~100000之間。當前在ALB Ingress只需要設定alb.ingress.kubernetes.io/traffic-limit-qps註解即可。參考樣本如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cafe-ingress
annotations:
alb.ingress.kubernetes.io/traffic-limit-qps: "50"
spec:
ingressClassName: alb
rules:
- host: demo.alb.ingress.top
http:
paths:
- path: /tea
pathType: ImplementationSpecific
backend:
service:
name: tea-svc
port:
number: 80
- path: /coffee
pathType: ImplementationSpecific
backend:
service:
name: coffee-svc
port:
number: 80後端慢啟動
在新增Pod加入Service後端後,如果ALB Ingress立即將流量分配至新增Pod,可能會導致瞬時的CPU或記憶體高壓,導致訪問異常。通過使用慢啟動,ALB Ingress可以逐步將流量轉移至新增Pod,緩解突發流量造成的影響。配置樣本如下:
參數 | 說明 | YAML樣本 |
| 是否啟用慢啟動功能,預設不開啟。
| |
| 慢啟動完成後,流量逐步增加的時間越長,流量提升的速度越慢。該參數以秒(s)為單位,取值範圍為 [30, 900],預設值為 30 秒。 |
串連優雅中斷
當Pod進入Terminating狀態時,ALB Ingress會將其從後端伺服器組中移除,ALB與該Pod已建立的串連不會立即中斷,用戶端訪問時仍持續有請求轉寄至這些後端伺服器,可能會導致Pod內的業務長期無法下線或出現請求錯誤。為了避免該問題,可以使用ALB的串連優雅中斷功能,當Pod被移除或健全狀態檢查異常時,ALB Ingress會保持一定時間內的正常傳輸,並在到達停機時間後主動中斷連線,保障業務平穩下線。更多詳情,請參見通過ALB串連優雅中斷實現業務平穩下線。
在串連優雅停機時間結束前,ALB Ingress無法保證Pod處於運行狀態。請為Pod配置spec.terminationGracePeriodSeconds或使用preStop Hook,以控制Pod在Terminating狀態中的可用性。
參數 | 描述 | YAML樣本 |
| 是否開啟串連優雅中斷,預設不開啟。
| |
| 優雅中斷逾時時間,單位為秒(s),取值範圍為 [0, 900],預設值為 300 秒 |