在Kubernetes集群中,ALB Ingress對集群服務(Service)中外部可訪問的API對象進行管理,提供七層負載均衡能力。本文介紹如何使用ALB Ingress將來自不同域名或URL路徑的請求轉發給不同的后端服務器組、將HTTP訪問重定向至HTTPS以及實現灰度發布等功能。
索引
前提條件
已創建ACK托管集群或ACK專有集群,Kubernetes版本為1.18及以上版本。具體操作,請參見創建ACK托管集群、創建ACK專有集群。
已創建兩個不同可用區的交換機,并且與集群處于同一VPC。具體操作,請參見創建和管理交換機。
已為集群安裝ALB Ingress Controller組件。具體操作,請參見管理ALB Ingress Controller組件。
說明若需要在ACK專有集群中通過ALB Ingress訪問服務,在部署服務前需要為ALB Ingress Controller授權。具體操作,請參見為ACK專有集群授予ALB Ingress Controller訪問權限。
已創建AlbConfig。具體操作,請參見創建AlbConfig。
基于域名轉發請求
通過創建一個簡單的Ingress,根據指定的正常域名或空域名轉發請求,示例如下。
基于正常域名轉發請求
部署以下模板,分別創建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
執行以下命令,通過指定的正常域名訪問服務。
替換ADDRESS為ALB實例對應的域名地址,可通過
kubectl get ing
獲取。curl -H "host: demo.domain.ingress.top" <ADDRESS>/hello
預期輸出:
{"hello":"coffee"}
基于空域名轉發請求
部署以下模板,創建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
執行以下命令,通過空域名訪問服務。
替換ADDRESS為ALB實例對應的域名地址,可通過
kubectl get ing
獲取。curl <ADDRESS>/hello
預期輸出:
{"hello":"coffee"}
基于URL路徑轉發請求
ALB Ingress支持按照URL轉發請求,可以通過匹配規則(pathType
)字段設置不同的URL匹配策略。pathType
支持完整匹配(Exact)、默認(ImplementationSpecific)和前綴匹配(Prefix)三種匹配方式。
URL匹配策略可能存在沖突的情況,此時將會按照轉發規則優先級進行排序,然后再轉發請求,詳情請參見配置轉發規則優先級。
匹配方式 | 規則路徑 | 請求路徑 | 路徑和請求路徑是否匹配 |
Prefix | / | (所有路徑) | 是 |
Prefix | /foo |
| 是 |
Prefix | /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/ccc | 是,請求路徑匹配規則路徑的 |
Prefix | 同時設置兩個規則路徑:
| /aaa/ccc | 是,請求路徑匹配規則路徑的 |
Prefix | 同時設置兩個規則路徑:
| /ccc | 是,請求路徑匹配規則路徑的 |
Prefix | /aaa | /ccc | 否,未匹配前綴 |
Exact或ImplementationSpecific | /foo | /foo | 是 |
Exact或ImplementationSpecific | /foo | /bar | 否 |
Exact或ImplementationSpecific | /foo | /foo/ | 否 |
Exact或ImplementationSpecific | /foo/ | /foo | 否 |
三種匹配方式的示例如下:
Exact
部署以下模板,創建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
執行以下命令,訪問服務。
替換ADDRESS為ALB實例對應的域名地址,可通過
kubectl get ing
獲取。curl <ADDRESS>/hello
預期輸出:
{"hello":"coffee"}
(默認)ImplementationSpecific
在ALB Ingress中與Exact
做相同處理。
部署以下模板,創建Ingress。
執行以下命令,訪問服務。
替換ADDRESS為ALB實例對應的域名地址,可通過
kubectl get ing
獲取。
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
curl <ADDRESS>/hello
預期輸出:
{"hello":"coffee"}
Prefix
以/
分隔的URL路徑進行前綴匹配。匹配區分大小寫,并且對路徑中的元素逐個完成匹配。
部署以下模板,創建Ingress。
執行以下命令,訪問服務。
替換ADDRESS為ALB實例對應的域名地址,可通過
kubectl get ing
獲取。
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
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 | 是否開啟后端服務器組的健康檢查。
默認值: |
alb.ingress.kubernetes.io/healthcheck-path | 健康檢查路徑。 默認值: |
alb.ingress.kubernetes.io/healthcheck-protocol | 健康檢查使用的協議。
默認值: |
alb.ingress.kubernetes.io/healthcheck-httpversion | HTTP協議版本,
默認值: |
alb.ingress.kubernetes.io/healthcheck-method | 健康檢查的方法。
默認值: 重要
|
alb.ingress.kubernetes.io/healthcheck-httpcode | 健康檢查狀態碼。僅當探測請求成功且返回指定狀態碼時,才認為該后端服務器狀態正常。 可以填入以下選項中的任意一個或多個組合,多個狀態碼用英文半角逗號(,)分隔:
默認值: |
alb.ingress.kubernetes.io/healthcheck-code | 健康檢查狀態碼,僅當探測請求成功且返回指定狀態碼時,才認為該后端服務器狀態正常。 與 可選參數依賴于
|
alb.ingress.kubernetes.io/healthcheck-timeout-seconds | 健康檢查超時時間,單位秒(s)。 取值范圍:[1, 300]。 默認值: |
alb.ingress.kubernetes.io/healthcheck-interval-seconds | 健康檢查間隔周期,單位秒(s)。 取值范圍:[1, 50]。 默認值: |
alb.ingress.kubernetes.io/healthy-threshold-count | 健康檢查成功多少次判定為成功。 取值范圍:[2, 10]。 默認值: |
alb.ingress.kubernetes.io/unhealthy-threshold-count | 健康檢查失敗多少次判定為失敗。 取值范圍:[2, 10]。 默認值: |
alb.ingress.kubernetes.io/healthcheck-connect-port | 健康檢查使用的端口。 默認值: 說明
|
配置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/(.*)/(.*)/aaa
,rewrite-target
注解配置為/${1}/${2}
。當客戶端發送請求的路徑為/sys/ccc/bbb/aaa
時,path
會匹配到/sys/(.*)/(.*)/aaa
,rewrite-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-header
和alb.ingress.kubernetes.io/canary-by-header-value
:匹配的Request Header的值,該規則允許您自定義Request Header的值,但必須與alb.ingress.kubernetes.io/canary-by-header
一起使用。當請求中的
header
和header-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的灰度不支持設置自定義,只有
always
和never
。請求的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
:是否啟用會話保持。取值:true
或false
;默認值:false
。alb.ingress.kubernetes.io/sticky-session-type
:Cookie的處理方式。取值:Insert
或Server
;默認值:Insert
。Insert
:植入Cookie。客戶端第一次訪問時,負載均衡會在返回請求中植入Cookie(即在HTTP或HTTPS響應報文中插入SERVERID),下次客戶端攜帶此Cookie訪問時,負載均衡服務會將請求定向轉發給之前記錄到的后端服務器。Server
:重寫Cookie。負載均衡發現用戶自定義了Cookie,將會對原來的Cookie進行重寫,下次客戶端攜帶新的Cookie訪問時,負載均衡服務會將請求定向轉發給之前記錄到的后端服務器。
說明當前服務器組
StickySessionEnabled
為true
時,該參數生效。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
參數 | 說明 |
| 允許通過瀏覽器訪問服務器資源的站點。站點之間使用英文半角逗號(,)分割。 單個value值必須以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,緩解突發流量造成的影響。配置示例如下:
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 | 是否啟用慢啟動功能。
默認不開啟。 |
alb.ingress.kubernetes.io/slow-start-duration | 慢啟動完成流量逐步增加所花費的時間,時間越長,流量增加的速度越慢,單位秒(s)。 取值范圍:[30, 900]。 默認值: |
連接優雅中斷
在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 | 是否開啟連接優雅中斷。
默認不開啟。 |
alb.ingress.kubernetes.io/connection-drain-timeout | 優雅中斷超時時間,單位秒(s)。 取值范圍:[0, 900]。 默認值: |