在ACK叢集中,ALB Ingress對叢集服務(Service)中外部可訪問的API對象進行管理,提供七層負載平衡能力。本文介紹如何使用ALB Ingress將來自不同網域名稱或URL路徑的請求轉寄給不同的後端伺服器組、將HTTP訪問重新導向至HTTPS以及實現灰階發布等功能。
索引
功能分類 | 配置樣本 |
ALB Ingress配置 | 配置健全狀態檢查 |
連接埠/協議配置 | |
轉寄策略配置 | |
進階配置 | |
基於網域名稱轉寄請求
通過建立一個簡單的Ingress,根據指定的正常網域名稱或空網域名稱轉寄請求,樣本如下。
基於正常網域名稱轉寄請求
以下 YAML 樣本將路由路徑配置為 /hello,訪問 demo.domain.ingress.top/hello 時會轉寄到後端服務。
部署以下模板,分別建立Service、Deployment和Ingress,將訪問請求通過Ingress的網域名稱轉寄至Service。
展開查看樣本YAML
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: ClusterIP
---
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: ClusterIP
---
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
執行以下命令,通過指定的正常網域名稱訪問服務。
替換ADDRESS為ALB執行個體對應的網域名稱地址,可通過kubectl get ing擷取。
curl -H "host: demo.domain.ingress.top" <ADDRESS>/hello
基於空網域名稱轉寄請求
以下 YAML 樣本將網域名稱配置為空白,路由路徑配置為 /hello,訪問<ADDRESS>/hello時會轉寄到後端服務。
部署以下模板,建立Ingress。
展開查看樣本YAML
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: ClusterIP
---
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: ""
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: ClusterIP
---
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: ""
http:
paths:
- backend:
serviceName: demo-service
servicePort: 80
path: /hello
pathType: ImplementationSpecific
執行以下命令,通過空網域名稱訪問服務。
替換ADDRESS為ALB執行個體對應的網域名稱地址,可通過kubectl get ing擷取。
curl <ADDRESS>/hello
基於URL路徑轉寄請求
ALB Ingress支援按照URL轉寄請求,可以通過匹配規則(pathType)欄位設定不同的URL匹配策略。pathType支援以下三種匹配方式。
三種匹配方式的樣本如下:
首碼匹配(Prefix)
URL路徑採用以/分隔的首碼匹配方式,匹配時區分大小寫,並按路徑中的每個元素逐級比較。
以下樣本 YAML 中,當路由規則配置為/時,所有以/開頭的路徑(如/hello等)都能被匹配和訪問。
部署以下模板,建立Ingress。
展開查看樣本YAML
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
執行以下命令,訪問服務。
替換ADDRESS為ALB執行個體對應的網域名稱地址,可通過kubectl get ing擷取。
curl <ADDRESS>/hello
完整匹配(Exact)或預設(ImplementationSpecific)
在以下樣本 YAML 中,路由規則配置為 /hello 時,僅能匹配並訪問 /hello 路徑。
部署以下模板,建立Ingress。
展開查看樣本YAML
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
執行以下命令,訪問服務。
替換ADDRESS為ALB執行個體對應的網域名稱地址,可通過kubectl get ing擷取。
curl <ADDRESS>/hello
配置健全狀態檢查
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
pathType: ImplementationSpecific
backend:
service:
name: tea-svc
port:
number: 80
# 配置Context Path
- path: /coffee
pathType: ImplementationSpecific
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
註解樣本如下:
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:
... ...
參數 | 描述 | 預設值 |
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-protocol為HTTP或HTTPS時生效。 | HTTP1.1
|
alb.ingress.kubernetes.io/healthcheck-method
| 健全狀態檢查的方法。
重要 healthcheck-protocol為GRPC時,需要選擇POST或GET。
| HEAD
|
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
GRPC:取值範圍:[0, 99]。
支援範圍輸入,最多填入20個範圍值,多個範圍值使用半形逗號(,)分隔。
| HTTP或HTTPS
預設值:http_2xx GRPC
預設值:0
|
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通過配置以下註解,實現將 HTTP 要求重新導向至 HTTPS 443 連接埠。
重要 僅支援配置在監聽連接埠為80的HTTP轉寄規則上。
僅支援與自訂轉寄動作:RemoveHeader、InsertHeader、跨域Cors相關註解配合使用。
配置此註解需要保證AlbConfig中已配置443連接埠的HTTPS監聽,請參見通過AlbConfig配置ALB監聽。
展開查看完整樣本YAML
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
參數 | 描述 | 註解樣本 |
alb.ingress.kubernetes.io/ssl-redirect: "true"
| 將 HTTP 要求重新導向到 HTTPS 443 連接埠。 | apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/ssl-redirect: "true"
name: demo-ssl
... ...
|
支援後端HTTPS和gRPC協議
當前 ALB 支援 HTTPS 和 gRPC 作為後端協議,您只需在 Ingress 中添加以下註解。
展開查看完整YAML樣本
1.19及之後版本叢集
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/backend-protocol: "grpc"
name: demo-alb-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: demo-alb-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
說明 Ingress建立後,後端協議不支援修改,如果您需要變更協議,請刪除重建Ingress。
參數 | 描述 | YAML樣本 |
alb.ingress.kubernetes.io/backend-protocol
| https:後端服務使用 HTTPS 協議。 grpc:後端服務使用 gRPC 協議。 使用 Ingress 轉寄 gRPC 服務時,需為對應網域名稱配置 SSL 憑證,並通過 TLS 協議進行通訊。
| apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/backend-protocol: "grpc"
name: demo-alb-ingress
... ...
|
配置Regex
使用註解alb.ingress.kubernetes.io/use-regex:"true"啟用正則模式,並在自訂轉寄條件或轉寄動作中配置相應的Regex。
重要 註解僅在pathType: Prefix的路徑規則下生效。
展開查看完整YAML樣本
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/use-regex: "true" ## 允許使用Regex。
alb.ingress.kubernetes.io/conditions.<YOUR-SVC-NAME>: | ## <YOUR-SVC-NAME>需替換為實際的 Service 名稱,必須與下面 backend.service.name一致。
[{
"type": "Path",
"pathConfig": {
"values": [
"~*/pathvalue1", ## Regex前需要添加~*或~作為正則標誌。~*或~後的內容為實際生效的Regex。~*表示區分大小寫正則匹配,~表示不區分大小寫正則匹配。
"/pathvalue2" ## 精確匹配前無需添加~*。
]
}
}]
name: ingress-example
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /test-path-for-alb
pathType: Prefix
backend:
service:
name: <YOUR-SVC-NAME> ## 此處<YOUR-SVC-NAME>需和註解中的自訂轉寄條件註明的服務名稱保持一致,用於表示對應關係。
port:
number: 88
參數 | 描述 | |
alb.ingress.kubernetes.io/use-regex: "true"
| 啟用Regex。 | apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/use-regex: "true" ## 允許使用Regex。
alb.ingress.kubernetes.io/conditions.<YOUR-SVC-NAME>: | ## <YOUR-SVC-NAME>需替換為實際的 Service 名稱,必須與下面 backend.service.name一致。
[{
"type": "Path", ## 支援Host
"pathConfig": {
"values": [
"~*/pathvalue1", ## Regex前需要添加~*或~作為正則標誌。~*或~後的內容為實際生效的Regex。~*表示區分大小寫正則匹配,~表示不區分大小寫正則匹配。
"/pathvalue2" ## 精確匹配前無需添加~*。
]
}
}]
... ...
|
alb.ingress.kubernetes.io/conditions.<YOUR-SVC-NAME>
| 配置自訂轉寄條件。更多詳情請參見自訂ALB Ingress的轉寄規則。 <YOUR-SVC-NAME>需替換為實際的 Service 名稱,需要和下面backend.service.name一致。
|
正則匹配規則說明:
匹配對象 | 首碼 | 規則樣本 | 用戶端路徑 | 是否命中 | 說明 |
網域名稱 | 以 ~開頭 | ~test.example.com
| test.EXAMPLE.com | 是 | 網域名稱支援不區分大小寫正則匹配。 |
路徑 | 以 ~開頭 | ~/api
| /API | 是 | 路徑支援不區分大小寫正則匹配。 |
以 ~* 開頭 | ~*/api
| /Api | 否 | 路徑支援區分大小寫正則匹配。 |
配置重寫
ALB Ingress支援重寫(Rewrite)功能,在接收到用戶端請求後,修改請求中的Path部分,再發送給後端Service。重寫通過以下兩個Annotation實現:
配置樣本
樣本情境一:移除首碼
下方的YAML樣本中path: /something(/|$)(.*)通過Regex將用戶端請求的路徑分為了三個部分:
alb.ingress.kubernetes.io/rewrite-target註解中配置的重寫路徑為/(路徑標準首碼)+${2}(第二擷取的群組的內容),路徑的重寫效果如下:
用戶端原始路徑 | 是否匹配PathRegex | 重寫後路徑 |
/something
| 匹配,第二擷取的群組為空白。 | /
|
/something/
| 匹配,第二擷取的群組為空白。 | /
|
/something/new
| 匹配,第二擷取的群組的內容為new。 | /new
|
/something-new/item
| 不匹配,在本樣本中未匹配到路由規則,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 | 重寫後路徑 |
/items/electronics/computers/554
| 匹配,第二擷取的群組的內容為computers,第三擷取的群組的內容為554。 | /computers?code=554。
|
/items/produce/fruits/12
| 匹配,第二擷取的群組的內容為fruits,第三擷取的群組的內容為12。 | /fruits?code=12
|
/items/headphones/5
| 不匹配,在本樣本中未匹配到路由規則,ALB Ingress返回503狀態代碼。 |
/drinks/41
| 不匹配,在本樣本中未匹配到路由規則,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 | 重寫後路徑 |
/app-a/item1
| 匹配,第二擷取的群組的內容為item1。 | /app-c/item1
|
/app-a/item2
| 匹配,第二擷取的群組的內容為item2。 | /app-c/item2
|
/app-a或/app-a/
| 匹配,第二擷取的群組為空白。 | /app-c/
|
/drinks/41
| 不匹配,在本樣本中未匹配到路由規則,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)連接埠。
展開查看完整YAML樣本
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
pathType: ImplementationSpecific
重要 ALB不支援直接在Ingress中建立新的監聽。為確保Ingress能夠正常工作,您需要先在AlbConfig中建立所需的監聽連接埠和協議,然後在Ingress中將這些監聽與服務關聯起來。關於如何建立ALB監聽,請參見通過AlbConfig配置ALB監聽。
參數 | 描述 | YAML樣本 |
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]'
| 使服務同時監聽 80 和 443 連接埠。 | apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cafe-ingress
annotations:
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 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樣本
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
pathType: ImplementationSpecific
參數 | 描述 | 取值範圍 | YAML樣本 |
alb.ingress.kubernetes.io/order
| 定義 ALB 轉寄規則的優先順序,值越小優先順序越高。 同一個監聽內規則優先順序必須唯一。 | [1,1000] 預設值:10 | apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cafe-ingress
annotations:
alb.ingress.kubernetes.io/order: "2"
spec:
... ...
|
通過註解實現灰階發布
ALB支援複雜路由處理,具備基於 Header、Cookie 及權重的灰階發布能力。可通過配置以下相關註解靈活實現各類灰階發布策略。關於灰階發布最佳實務,請參見通過ALB Ingress實現灰階發布。
參數 | 描述 | 說明 |
alb.ingress.kubernetes.io/canary: "true"
| 開啟灰階發布能力 | |
通過註解實現會話保持
ALB Ingress支援通過以下註解實現會話保持。
展開查看完整YAML樣本
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" # 支援自訂cookie時,植入cookie類型需為Server。
alb.ingress.kubernetes.io/cookie-timeout: "1800"
alb.ingress.kubernetes.io/cookie: "test"
spec:
ingressClassName: alb
rules:
- http:
paths:
- backend:
service:
name: tea-svc
port:
number: 80
path: /tea2
pathType: ImplementationSpecific
- backend:
service:
name: coffee-svc
port:
number: 80
path: /coffee2
pathType: ImplementationSpecific
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" # 支援自訂cookie時,植入cookie類型需為Server。
alb.ingress.kubernetes.io/cookie-timeout: "1800"
alb.ingress.kubernetes.io/cookie: "test"
spec:
ingressClassName: alb
rules:
- http:
paths:
#配置Context Path。
- path: /tea2
pathType: ImplementationSpecific
backend:
serviceName: tea-svc
servicePort: 80
#配置Context Path。
- path: /coffee2
pathType: ImplementationSpecific
backend:
serviceName: coffee-svc
servicePort: 80
註解樣本如下:
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:
... ...
參數 | 描述 | 預設值 |
alb.ingress.kubernetes.io/sticky-session
| 是否啟用會話保持。 | false
|
alb.ingress.kubernetes.io/sticky-session-type
| Cookie的處理方式。 Insert:植入Cookie。用戶端第一次訪問時,負載平衡會在返回請求中植入Cookie(即在HTTP或HTTPS響應報文中插入SERVERID),下次用戶端攜帶此Cookie訪問時,負載平衡服務會將請求定向轉寄給之前記錄到的後端伺服器。
Server:重寫Cookie。負載平衡發現使用者自訂了Cookie,將會對原來的Cookie進行重寫,下次用戶端攜帶新的Cookie訪問時,負載平衡服務會將請求定向轉寄給之前記錄到的後端伺服器。
說明 當前伺服器組StickySessionEnabled為true時,該參數生效。伺服器組參數詳情請參見建立伺服器組。 | Insert
|
alb.ingress.kubernetes.io/cookie-timeout
| Cookie 逾時時間(單位:秒)取值:1~86400; sticky-session-type配置為Insert時,此註解生效。
| 1000 |
alb.ingress.kubernetes.io/cookie
| 自訂Cookie值。 sticky-session-type配置為Server時,此註解必填,不允許為空白。
| "" |
指定伺服器組負載平衡演算法
ALB Ingress 可通過以下註解指定伺服器組的負載平衡演算法,具體取值及說明見下表。
展開查看完整YAML樣本
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均無需配置此參數。
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
pathType: ImplementationSpecific
參數 | 取值 | 描述 | |
alb.ingress.kubernetes.io/backend-scheduler
| wrr
| 加權輪詢,權重高的後端伺服器被輪詢到機率更高(預設值)。 | 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均無需配置此參數。
spec:
... ...
|
wlc
| 根據每台後端伺服器設定的權重值和後端伺服器的實際負載(即串連數)進行輪詢。權重相同則優先選擇串連數少的伺服器。 |
sch
| 源IP一致性Hash,基於用戶端源IP請求做雜湊分配,同一IP分配至同一後端伺服器。 |
uch
| URL參數一致性Hash。 通過註解alb.ingress.kubernetes.io/backend-scheduler-uch-value指定URL參數進行一致性Hash。 |
跨網域設定
ALB Ingress 支援通過以下註解參數控制跨域行為。可指定允許訪問的網站、要求方法、請求和回應標頭、憑證攜帶及預檢(OPTIONS)緩衝時間,滿足不同安全和業務情境下的跨域訪問需求。
展開查看完整YAML樣本
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"
alb.ingress.kubernetes.io/cors-allow-origin: "允許跨域的網域名稱"
spec:
ingressClassName: alb
rules:
- host: demo.alb.ingress.top
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: cloud-nodeport
port:
number: 80
註解樣本如下:
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"
alb.ingress.kubernetes.io/cors-allow-origin: "允許跨域的網域名稱"
spec:
... ...
參數 | 描述 | 預設值 |
alb.ingress.kubernetes.io/enable-cors
| 啟用 CORS 跨網域設定。 | 預設值:"true" |
alb.ingress.kubernetes.io/cors-allow-origin
| 允許通過瀏覽器訪問伺服器資源的網站。 網站之間使用英文半形逗號(,)分割。 單個value值必須以http://或者https://開頭後跟一個正確網域名稱,或者一級的泛網域名稱。不支援使用IP地址。 | |
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
| 允許跨域傳播的要求標頭。 支援配置為*或配置一個或多個 value 值,多個 value 值用半形逗號(,)隔開。單個 value 值只允許包含大小寫字母、數字,不能以底線(_)和短劃線(-)開頭或結尾,最大長度限制為 32 個字元。 | 預設值: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列表, 支援配置為*或配置一個或多個 value 值,多個 value 值用半形逗號(,)隔開。單個 value 值只允許包含大小寫字母、數字,不能以底線(_)和短劃線(-)開頭或結尾,最大長度限制為 32 個字元。 | |
alb.ingress.kubernetes.io/cors-allow-credentials
| 設定跨域訪問時是否允許攜帶憑證資訊。 | |
alb.ingress.kubernetes.io/cors-max-age
| 對於非簡單請求,設定OPTIONS預檢請求在瀏覽器的最大緩衝時間(秒),取值範圍[0, 172800]。 | 預設值:172800 |
後端長串連
傳統的負載平衡會採用短連結的方式訪問後端伺服器組,每一條請求都需要經歷TCP層面的建立串連和中斷連線,使網路連接成為這類高效能系統的瓶頸,通過負載平衡的後端長串連支援,極大地減少了處理串連層面的資源消耗,從而大幅度提高處理效能。參考樣本如下:
展開查看完整YAML樣本
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
參數 | 描述 | YAML樣本 |
alb.ingress.kubernetes.io/backend-keepalive: "true"
| 開啟後端長串連。開啟後,減少每次請求的 TCP 串連建立和斷開,降低資源消耗,提升高效能系統處理能力。 | apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: alb-ingress
annotations:
alb.ingress.kubernetes.io/backend-keepalive: "true"
spec:
|
伺服器組支援IPv6掛載
在為伺服器組啟用IPv6掛載後,如需同時將IPv4和IPv6類型的Pod掛載至伺服器組,需確保叢集已啟用雙棧能力,更多詳情請參見建立ACK託管叢集。
說明 以下是開啟IPv6掛載的限制:
如果伺服器組所在的VPC未開啟IPv6功能,則無法啟用伺服器組的IPv6掛載功能。
當通過自訂轉寄動作掛載IP類型或Function Compute類型的伺服器組時,不支援開啟IPv6掛載功能。
關聯IPv4類型ALB執行個體的Ingress,不支援開啟伺服器組的IPv6掛載功能。
展開查看完整執行個體YAML
apiVersion: v1
kind: Service
metadata:
name: tea-svc
annotations:
spec:
# 配置雙棧時ipFamilies需要配置為IPv4或IPv6,ipFamilyPolicy需要配置為RequireDualStack或PreferDualStack。
ipFamilyPolicy: RequireDualStack
ipFamilies:
- IPv4
- IPv6
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
app: tea
type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: tea
spec:
replicas: 2
selector:
matchLabels:
app: tea
template:
metadata:
labels:
app: tea
spec:
containers:
- name: tea
image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest
ports:
- containerPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cafe-ingress
annotations:
alb.ingress.kubernetes.io/enable-ipv6: "true"
spec:
ingressClassName: alb
rules:
- host: demo.alb.ingress.top
http:
paths:
- path: /tea
pathType: Prefix
backend:
service:
name: tea-svc
port:
number: 80
Service 和 ALB Ingress 需按雙棧要求進行配置。建立支援雙棧的 ALB 執行個體後,伺服器組可同時掛載 IPv4 和 IPv6 類型的後端伺服器。
設定物件 | 配置參數 | 取值 | 描述 | YAML樣本 |
Service | ipFamilies
| | 指定 Service 可用的 IP 位址類型。 | apiVersion: v1
kind: Service
metadata:
name: tea-svc
annotations:
spec:
# 配置雙棧時ipFamilies需要配置為IPv4或IPv6,ipFamilyPolicy需要配置為RequireDualStack或PreferDualStack。
ipFamilyPolicy: RequireDualStack
ipFamilies:
- IPv4
- IPv6
... ...
|
ipFamilyPolicy
| RequireDualStack
PreferDualStack
| 設定 Service 的 IP 策略,支援雙棧。 |
ALB Ingress | alb.ingress.kubernetes.io/enable-ipv6
| "true"
| 啟用伺服器組的 IPv6 掛載功能。 | apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cafe-ingress
annotations:
alb.ingress.kubernetes.io/enable-ipv6: "true"
spec:
... ...
|
支援QPS限速
ALB本身支援轉寄規則的QPS限速功能,需配置以下註解即可實現 QPS 限速。
展開查看完整YAML樣本
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
註解 | 描述 | YAML樣本 |
alb.ingress.kubernetes.io/traffic-limit-qps
| 設定轉寄規則的 QPS 限速上限。取值範圍:[1,1000000] | apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cafe-ingress
annotations:
alb.ingress.kubernetes.io/traffic-limit-qps: "50"
spec:
... ...
|
後端慢啟動
在新增Pod加入Service後端後,如果ALB Ingress立即將流量分配至新增Pod,可能會導致瞬時的CPU或記憶體高壓,導致訪問異常。通過使用慢啟動,ALB Ingress可以逐步將流量轉移至新增Pod,緩解突發流量造成的影響。配置樣本如下:
展開查看完整YAML樣本
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
參數 | 說明 | YAML樣本 |
alb.ingress.kubernetes.io/slow-start-enabled
| 是否啟用慢啟動功能,預設不開啟。 true:啟用慢啟動功能。
false:不啟用慢啟動功能。
| 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
... ...
|
alb.ingress.kubernetes.io/slow-start-duration
| 慢啟動完成後,流量逐步增加的時間越長,流量提升的速度越慢。該參數以秒(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樣本
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
參數 | 描述 | YAML樣本 |
alb.ingress.kubernetes.io/connection-drain-enabled
| 是否開啟串連優雅中斷,預設不開啟。 true:開啟優雅中斷。
false:不開啟優雅中斷。
| 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
... ...
|
alb.ingress.kubernetes.io/connection-drain-timeout
| 優雅中斷逾時時間,單位為秒(s),取值範圍為 [0, 900],預設值為 300 秒 |
關閉跨可用性區域(AZ)
預設情況下,ALB啟用跨可用性區域(AZ)的負載平衡,這意味著在同一地區的不同可用性區域之間,流量會被均勻分配至後端服務。如果關閉了ALB伺服器組的跨AZ負載平衡,則流量將僅在同一地區內的同一可用性區域的後端服務之間分配。
重要 如果您需要關閉跨AZ負載平衡,請確保ALB在每個可用性區域中都配置可用的後端服務,並確保這些伺服器的資源充足。為避免對業務產生影響,請謹慎進行此操作。
您可參照下方的樣本配置關閉跨AZ:
展開查看完整YAML樣本
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: alb-ingress
namespace: default
annotations:
alb.ingress.kubernetes.io/cross-zone-enabled: "false"
spec:
ingressClassName: alb
rules:
- host: alb.ingress.alibaba.com
http:
paths:
- path: /test
pathType: Prefix
backend:
service:
name: tea-svc
port:
number: 80
參數 | 描述 | YAML樣本 |
alb.ingress.kubernetes.io/cross-zone-enabled
| 是否關閉跨AZ轉寄,預設開啟。 true:開啟跨AZ轉寄。
false:關閉跨AZ轉寄。
| apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: alb-ingress
namespace: default
annotations:
alb.ingress.kubernetes.io/cross-zone-enabled: "false"
... ...
|