ALBConfig是由ALB Ingress Controller提供的CRD資源,ALB Ingress Controller使用ALBConfig來配置ALB執行個體和監聽。本文介紹如何建立、修改、更新ALBConfig以及開啟Log Service等操作。
前提條件
已建立兩個不同可用性區域的交換器,且與叢集處於同一VPC。具體操作,請參見建立和管理交換器。
注意事項
推薦優先使用命令
kubectl edit直接修改、更新資源的配置。如果必須使用kubectl apply命令來修改、更新資源,請在執行kubectl apply命令之前先執行kubectl diff命令預覽變更點,確保變更符合預期,然後再執行kubectl apply命令將變更應用到Kubernetes叢集。低版本Nginx Ingress Controller無法識別Ingress資源中的
spec.ingressClassName欄位。如果叢集中同時存在Nginx Ingress和ALB Ingress,會存在ALB Ingress被低版本Nginx Ingress Controller幹擾或配置覆蓋的風險。因此,請及時升級Nginx Ingress Controller版本,或通過Annotation註解項指定ALB Ingress對應的ingressClass。具體操作,請參見ALB Ingress服務進階用法。
建立ALBConfig
一個ALBConfig對應一個ALB執行個體,但一個ALBConfig可對應多個Ingress,即ALBConfig與Ingress是一對多的對應關係。如需使用多個ALB執行個體,可以通過建立多個ALBConfig實現。建立ALBConfig操作如下。
建立並拷貝以下內容到alb-test.yaml檔案中,用於建立ALBConfig。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb-demo spec: config: name: alb-test addressAllocatedMode: Dynamic # Dynamic和Fixed可選,通過該參數可指定ALB執行個體的IP模式。 addressType: Internet zoneMappings: # 為保障業務高可用,請至少選擇2個或以上不同可用性區域的交換器 - vSwitchId: vsw-uf6ccg2a9g71hx8go**** # 替換為實際的交換器ID(所屬可用性區域1) - vSwitchId: vsw-uf6nun9tql5t8nh15**** # 替換為實際的交換器ID(所屬可用性區域2,必須與前面不同) listeners: - port: 80 protocol: HTTP參數
說明
spec.config.name
(可選)表示ALB執行個體的名稱。
spec.config.addressType
(必選)表示負載平衡的地址類型。取值如下:
Internet(預設值):負載平衡具有公網IP地址,DNS網域名稱被解析到公網IP,因此可以在公網環境下訪問。
Intranet:負載平衡只有私網IP地址,DNS網域名稱被解析到私網IP,因此只能被負載平衡所在VPC的內網環境訪問。
spec.config.zoneMappings
(必選)用於設定ALB Ingress交換器ID。在多個可用性區域的地區中,至少需要指定兩個不同可用性區域交換器ID。對於只包含單個可用性區域的地區,指定一個交換器ID即可。指定的交換器必須在ALB當前所支援的可用性區域內,且與叢集處於同一VPC。關於ALB Ingress支援的地區與可用性區域,請參見ALB支援的地區與可用性區域。
重要不支援更新ALB執行個體的地址類型及可用性區域。即ALBConfig中的
addressType和zoneMappings參數僅在建立ALBConfig時生效,不支援更新。spec.config.addressAllocatedMode(可選)在ALBConfig中,可以通過addressAllocatedMode參數指定ALB執行個體IP模式。取值:
Dynamic:動態IP模式。
Fixed:固定IP模式。
為叢集安裝ALB Ingress Controller組件時,系統將會預設建立ALBConfig。配置參數除vSwitchId外,其他參數將會按照以下的預設配置建立。
執行以下命令,建立ALBConfig。
kubectl apply -f alb-test.yaml預期輸出:
albconfig.alibabacloud.com/alb-demo created執行以下命令,查看ALBConfig名稱。
kubectl -n kube-system get AlbConfig預期輸出:
NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE alb-demo alb-****** alb-******.<regionID>.alb.aliyuncs.com 443/HTTPS 11055487-cn-<regionID> 2d
更新ALBConfig
在Kubernetes中,kubectl apply命令的語義為覆蓋式更新;kubectl edit命令的語義為在之前對象的基礎上進行累加式更新。已經通過ALBConfig建立的ALB執行個體,更改執行個體配置時推薦使用kubectl edit命令進行增量式更新。更新ALBConfig操作如下。
執行以下命令,查看ALBConfig名稱。
kubectl -n kube-system get AlbConfig預期輸出:
NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE alb-demo alb-****** alb-******.<regionID>.alb.aliyuncs.com 443/HTTPS 11055487-cn-<regionID> 2d執行如下命令,更新對應的ALBConfig。
重要優先推薦使用
kubectl edit命令直接更新資源的配置。如果必須使用kubectl apply命令來更新資源,請在執行kubectl apply命令之前先執行kubectl diff命令預覽變更點,確保變更符合預期,然後再使用kubectl apply命令將變更應用到Kubernetes叢集。通過
kubectl apply命令對ALBConfig進行覆蓋式更新時,如果對應ALBConfig的YAML檔案中沒有listeners相關配置,不會對存量監聽產生影響;如果有監聽配置,會按照當前配置調諧監聽,因此需要將使用到的全量監聽列表寫全,例如80和443等常見監聽。
kubectl -n kube-system edit AlbConfig alb-demo在ALBConfig設定檔中,更新相關內容。例如,將ALBConfig的名稱更新為
test。... spec: config: name: test # 輸入更新後的名稱。 ...
使用IngressClass關聯ALBConfig與Ingress
ALBConfig通過Kubernetes中標準的IngressClass資源與Ingress進行關聯。需要先建立IngressClass,然後關聯ALBConfig。
建立並拷貝以下內容到alb.yaml檔案中,用於建立IngressClass。
apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: alb spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb-demo執行以下命令,建立IngressClass。
kubectl apply -f alb.yaml預期輸出:
ingressclass.networking.k8s.io/alb created建立並拷貝以下內容到ingress.yaml檔案中。通過
ingressClassName參數指定名稱為alb的IngressClass關聯ALBConfig。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: cafe-ingress 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執行以下命令,建立Ingress。
kubectl apply -f ingress.yaml預期輸出:
ingress.networking.k8s.io/cafe-ingress created
完成上述步驟,就可以使用IngressClass關聯ALBConfig與Ingress。
修改ALB執行個體的名稱
執行以下命令,可修改ALB執行個體的名稱。
kubectl -n kube-system edit AlbConfig alb-demo在設定檔中修改config.name的值,儲存之後,新名稱自動生效。
...
spec:
config:
name: test # 輸入修改後的名稱。
...使用IPv6地址
在建立ALB執行個體時,通過ALBConfig中addressIpVersion欄位指定DualStack即可開啟IPv6支援。
addressIpVersion欄位僅在建立執行個體階段生效,後續不能修改。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb-demo
spec:
config:
addressIpVersion: DualStack
...指定TLS安全性原則
當前ALBConfig配置HTTPS監聽時,支援指定TLS安全性原則。TLS安全性原則包含自訂策略和系統預設策略,更多資訊,請參見TLS安全性原則。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb-demo
spec:
config:
#...
listeners:
- port: 443
protocol: HTTPS
securityPolicyId: tls_cipher_policy_1_1
#...開啟Log Service訪問日誌
如果希望ALB Ingress能夠收集訪問日誌Access Log,可以在ALBConfig中指定logProject和logStore。
logProject需要手動建立,不支援自動建立。建立logProject的具體操作,請參見管理Project。logStore命名需要以alb_開頭,若指定logStore不存在,系統則會自動建立。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb-demo
spec:
config:
accessLogConfig:
logProject: "k8s-log-xz92lvykqj1siwvif****"
logStore: "alb_****"
#...儲存命令之後,可以在Log Service控制台單擊目標LogStore,查看收集的訪問日誌。
複用已有ALB執行個體
如果希望複用已有ALB執行個體,需要在建立ALBConfig時指定ALB執行個體ID,且已有的ALB執行個體必須是通過應用型負載平衡ALB控制台建立的標準版或WAF增強版執行個體。不支援複用基礎版ALB執行個體。同一執行個體僅支援被一個叢集複用,不支援多個叢集複用同一ALB執行個體。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: reuse-alb
spec:
config:
id: **** # 通過ALB控制台建立的標準版或WAF增強版ALB執行個體ID。
forceOverride: false
listenerForceOverride: false參數說明如下:
參數 | 說明 |
id |
重要 在複用模式下,不建議手動修改監聽名稱,以免錯誤地將監聽置於或脫離ACS的管理。由ALBConfig建立或更新的監聽由ACS管理,且監聽名稱的預設格式為 |
forceOverride | 表示複用模式下是否強制覆蓋ALB執行個體屬性。
|
listenerForceOverride | 表示複用模式下是否強制覆蓋監聽屬性。
|
建立監聽
在複用情境中,通過修改ALBConfig來新增監聽或編輯現有監聽的設定。執行命令kubectl edit albconfig <Albconfig_Name>,在ALBConfig中設定port和protocol即可建立對應的監聽器。port和protocol是監聽的唯一屬性。一旦修改了port、protocol以及其他監聽的屬性,系統將會刪除原有的監聽,然後建立一個新的監聽來替代它。
HTTP協議自動相容WebSocket,不需要特殊設定。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb-demo
spec:
config:
...
listeners:
- port: 80
protocol: HTTP # protocol的可選項為HTTP、HTTPS、QUIC。
...建立並使用多個ALB執行個體
如果希望使用多個ALB執行個體,在Ingress中通過spec.ingressClassName指定不同的IngressClass即可。
建立並拷貝以下內容到alb-demo2.yaml檔案中,用於建立ALBConfig。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: demo spec: config: name: alb-demo2 # ALB執行個體名稱。 addressType: Internet # 負載平衡具有公網IP地址。 zoneMappings: # 為保障業務高可用,請至少選擇2個或以上不同可用性區域的交換器 - vSwitchId: vsw-uf6ccg2a9g71hx8go**** # 替換為實際的交換器ID(所屬可用性區域1) - vSwitchId: vsw-uf6nun9tql5t8nh15**** # 替換為實際的交換器ID(所屬可用性區域2,必須與前面不同)執行以下命令,建立ALBConfig。
kubectl apply -f alb-demo2.yaml預期輸出:
AlbConfig.alibabacloud.com/demo created建立並拷貝以下內容到alb.yaml檔案中,用於建立IngressClass。
apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: alb-demo2 spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: demo執行以下命令,建立IngressClass。
kubectl apply -f alb.yaml預期輸出:
ingressclass.networking.k8s.io/alb-demo2 created建立並拷貝以下內容到
ingress.yaml檔案中。通過ingressClassName參數指定不同的ALB執行個體。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: demo namespace: default spec: ingressClassName: alb-demo2 rules: - host: "" http: paths: - backend: service: name: demo-service port: number: 80 path: /hello pathType: ImplementationSpecific
設定監聽串連請求逾時時間
在ALBConfig中可以指定監聽,設定串連請求逾時時間(單位為秒,取值範圍為[1,180])。若在逾時時間內後端伺服器一直沒有響應,負載平衡將放棄等待,給用戶端返回HTTP 504錯誤碼。如果不指定串連請求逾時時間,則預設為60秒。YAML樣本如下。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: default
spec:
config:
...
listeners:
- port: 80
protocol: HTTP
requestTimeout: 60
...使用資料壓縮功能
在ALBConfig中,可以指定監聽,設定資料壓縮是否開啟。gzipEnabled取值如下:
true:對特定檔案類型進行壓縮。
false:不會對任何檔案類型進行壓縮。
目前Brotli支援壓縮所有類型,Gzip支援壓縮的類型包括text/xml、text/plain、text/css、application/javascript、application/x-javascript、application/rss + xml、application/atom + xml、application/xml和application/json。
關閉資料壓縮的YAML樣本如下:
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: default
spec:
config:
...
listeners:
- port: 80
protocol: HTTP
gzipEnabled: false
...擷取來訪者真實IP
在ALBConfig中可以通過X-Forwarded-For頭欄位擷取來訪者的真實IP。XForwardedForEnabled的取值如下:
true:擷取來訪者的真實IP。
false:不擷取來訪者的真實IP。
僅HTTP和HTTPS監聽支援配置此參數。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: default
spec:
config:
#...
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForEnabled: true
#...擷取執行個體的監聽協議
在ALBConfig中可以通過XForwardedForProtoEnabled欄位擷取執行個體的監聽協議。取值如下:
true:擷取執行個體的監聽協議。
false:不擷取執行個體的監聽協議。
僅HTTP和HTTPS監聽支援配置此參數。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: default
spec:
config:
...
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForProtoEnabled: true
...擷取Server Load Balancer執行個體的ID
在ALBConfig中可以通過SLB-ID頭欄位擷取Server Load Balancer執行個體的ID。XForwardedForSLBIdEnabled取值如下:
true:擷取Server Load Balancer執行個體的ID。
false:不擷取Server Load Balancer執行個體的ID。
僅HTTP和HTTPS監聽支援配置此參數。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: default
spec:
config:
...
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForSLBIdEnabled: true
...擷取執行個體的監聽連接埠
在ALBConfig中可以通過X-Forwarded-Port頭欄位擷取執行個體的監聽連接埠。XForwardedForSLBPortEnabled取值如下:
true:擷取執行個體的監聽連接埠。
false:不擷取執行個體的監聽連接埠。
僅HTTP和HTTPS監聽支援配置此參數。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: default
spec:
config:
...
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForSLBPortEnabled: true
...擷取Server Load Balancer執行個體用戶端的連接埠
在ALBConfig中可以通過X-Forwarded-Client-srcport頭欄位擷取Server Load Balancer執行個體用戶端的連接埠。XForwardedForClientSrcPortEnabled取值如下:
true:擷取Server Load Balancer執行個體用戶端的連接埠。
false:不擷取Server Load Balancer執行個體用戶端的連接埠。
僅HTTP和HTTPS監聽支援配置此參數。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: default
spec:
config:
...
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForClientSrcPortEnabled: true
...設定ACL存取控制
通過ALBConfig可以為ALB監聽啟用存取控制功能,通過設定入方向的允許或拒絕規則,對用戶端請求精確控制,管理請求轉寄。關於ACL的更多資訊,請參見存取控制。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: default
spec:
config:
#...
listeners:
- port: 80
protocol: HTTPS
aclConfig:
aclEntries:
- 127.0.0.1/32
aclType: White
#...部分參數說明如下:
aclType:用於設定監聽的ACL為黑名單或白名單。取值為Black和White,分別表示黑名單和白名單。
aclEntries:用於設定存取控制條目IP位址區段,例如127.0.0.1/32。
刪除ALB執行個體
一個ALB執行個體對應一個ALBConfig, 因此可以通過刪除ALBConfig實現刪除ALB執行個體,但前提是先需要刪除ALBConfig關聯的所有Ingress。
kubectl delete -n kube-system AlbConfig alb-demoalb-demo可以替換為實際需要刪除的ALBConfig。
刪除複用ALB執行個體的ALBConfig
如果希望刪除複用ALB執行個體的ALBConfig,請按照以下操作步驟操作。
刪除該ALBConfig關聯的所有Ingress。
kubectl delete -n <NAMESPACE> ingress <INGRESS_NAME> # 將<INGRESS_NAME>和<NAMESPACE>替換為要刪除的Ingress的名稱和命名空間。使用
kubectl edit命令修改ALBConfig,刪除此ALBConfig的所有監聽,即刪除spec.listeners欄位下的所有條目。重要若叢集中安裝的ALB Ingress Controller組件版本為v2.10.0-aliyun.1及以前版本,請執行該操作。否則,請跳過該步驟。
刪除ALBConfig。
kubectl -n kube-system delete AlbConfig alb-demo # 請將alb-demo替換為實際需要刪除的AlbConfig。