AlbConfig是由ALB Ingress Controller提供的CRD資源,ALB Ingress Controller使用AlbConfig配置ALB執行個體和監聽。本文介紹如何建立、修改、更新AlbConfig以及開啟Log Service等操作。
功能索引
ALB執行個體配置 | |
監聽配置 |
前提條件
已為叢集安裝ALB Ingress Controller組件。具體操作,請參見管理ALB Ingress Controller組件。
說明若需要在ACK專有叢集中通過ALB Ingress訪問服務,在部署服務前需要為ALB Ingress Controller授權。具體操作,請參見為ACK專有叢集授予ALB Ingress Controller存取權限。
已建立兩個不同可用性區域的交換器,並且與叢集處於同一VPC。具體操作,請參見建立和管理交換器。
已通過kubectl工具串連叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
注意事項
推薦優先使用
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。具體操作,請參見升級Nginx Ingress Controller組件或ALB Ingress服務進階用法。
建立AlbConfig
一個AlbConfig對應一個ALB執行個體,如果您需要使用多個ALB執行個體,可以通過建立多個AlbConfig實現。建立AlbConfig操作如下。
如果您在安裝ALB Ingress Controller組件時,為ALB雲原生網關執行個體來源選擇了建立或使用已有選項,Controller會自動建立一個名為“alb”的AlbConfig和名為“alb”的IngressClass資源。
建立並拷貝以下內容到alb.yaml檔案中,用於建立AlbConfig。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb spec: config: name: alb addressType: Internet zoneMappings: - vSwitchId: vsw-uf6ccg2a9g71hx8go**** # 替換為您的虛擬交換器的ID - vSwitchId: vsw-uf6nun9tql5t8nh15**** listeners: - port: 80 protocol: HTTP
參數
說明
spec.config.name
表示ALB執行個體的名稱。
spec.config.addressType
表示負載平衡的地址類型。取值如下:
Internet
(預設值):ALB執行個體會擁有公網IP地址,DNS網域名稱被解析到公網IP,因此可以在公網環境下訪問。Intranet
:ALB執行個體將只擁有私網IP地址,DNS網域名稱被解析到私網IP,因此只能在其所在的VPC內被訪問。
重要addressType
參數僅在建立AlbConfig時被解析,後續更新AlbConfig不產生效果。spec.config.zoneMappings
用於設定ALB Ingress使用的虛擬交換器ID。在多個可用性區域的地區中,您至少需要指定兩個處於不同可用性區域的交換器。對於只包含單個可用性區域的地區,指定一個交換器ID即可。指定的交換器必須在ALB當前所支援的可用性區域內,且與叢集處於同一VPC。關於ALB Ingress支援的地區與可用性區域,請參見ALB支援的地區與可用性區域。
重要在多個可用性區域的地區中,您至少需要指定兩個處於不同可用性區域的交換器。
zoneMappings
參數僅在建立AlbConfig時被解析,後續更新AlbConfig不產生效果。
為叢集安裝ALB Ingress Controller組件時,可以選擇建立預設的AlbConfig。AlbConfig的配置參數除
vSwitchID
外,其他參數將會按照以下的預設配置建立。執行以下命令,建立AlbConfig。
kubectl apply -f alb.yaml
預期輸出:
AlbConfig.alibabacloud.com/alb created
執行以下命令,查看AlbConfig資源。
kubectl get AlbConfig
預期輸出:
NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE alb alb-****** alb-******.<regionID>.alb.aliyuncs.com 28m
說明建立HTTPS監聽並為其配置認證後,
PORT&PROTOCOL
和CERTID
中才會顯示內容,內容為空白是正常現象。
複用已有ALB執行個體
如果您希望複用已有ALB執行個體,需要在建立AlbConfig時指定ALB執行個體ID,且已有的ALB執行個體必須是通過應用型負載平衡ALB控制台建立的標準版或WAF增強版執行個體。不支援複用基礎版ALB執行個體。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: reuse-alb
spec:
config:
id: **** # 通過ALB控制台建立的標準版或WAF增強版ALB執行個體ID。
forceOverride: false
listenerForceOverride: false
參數說明如下:
參數 | 說明 |
|
重要 在複用情境下,不建議您手動修改監聽名稱,以免錯誤地將監聽置於或脫離ACK的控制。由AlbConfig建立或更新的監聽由ACK管理,且監聽名稱的預設格式為 |
| 表示複用模式下是否強制覆蓋ALB執行個體屬性。
|
| 表示複用模式下是否強制覆蓋監聽屬性。
|
更新AlbConfig
對於已經通過AlbConfig建立的ALB執行個體,更改執行個體配置時推薦使用kubectl edit
命令進行更新。更新AlbConfig操作如下。
執行以下命令,查看AlbConfig名稱。
kubectl get AlbConfig
預期輸出:
NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE alb alb-****** alb-******.<regionID>.alb.aliyuncs.com 28m
執行以下命令編輯AlbConfig。
kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME>替換AlbConfig的名稱
在AlbConfig設定檔中,更新AlbConfig的相關內容。例如,修改
spec.config.name
欄位的參數,將ALB執行個體的名稱修改為new_alb
。... spec: config: name: new_alb # 更新後的名稱。 ...
使用IngressClass關聯AlbConfig與Ingress
ALB Ingress使用Kubernetes原生的IngressClass資源確定AlbConfig與Ingress的關聯。通過在IngressClass資源中填入
建立並拷貝以下內容到ingress_class.yaml檔案中,用於建立IngressClass。
1.19及之後版本叢集
apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: alb spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb # IngressClass關聯的AlbConfig的名稱
1.19版本之前叢集
apiVersion: networking.k8s.io/v1beta1 kind: IngressClass metadata: name: alb spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb
執行以下命令,建立IngressClass。
kubectl apply -f ingress_class.yaml
預期輸出:
ingressclass.networking.k8s.io/alb created
建立並拷貝以下內容到ingress.yaml檔案中。通過
ingressClassName
參數指定名稱為alb的IngressClass關聯AlbConfig。1.19及之後版本叢集
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: cafe-ingress spec: ingressClassName: alb # Ingress關聯的IngressClass的名稱 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 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
執行以下命令,建立Ingress。
kubectl apply -f ingress.yaml
預期輸出:
ingress.networking.k8s.io/cafe-ingress created
完成上述步驟,就可以使用IngressClass關聯AlbConfig與Ingress。
建立並使用多個ALB執行個體
如果您希望同時使用多個ALB執行個體,在Ingress資源中通過spec.ingressClassName
指定不同的IngressClass,即可將Ingress關聯到不同的ALB執行個體。
建立並拷貝以下內容到alb-2.yaml檔案中,用於建立AlbConfig。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb-2 spec: config: name: alb-2 # ALB執行個體名稱。 addressType: Internet # 負載平衡具有公網IP地址。 zoneMappings: - vSwitchId: vsw-uf6ccg2a9g71hx8go**** # 虛擬交換器的ID - vSwitchId: vsw-uf6nun9tql5t8nh15****
執行以下命令,建立AlbConfig。
kubectl apply -f alb-2.yaml
預期輸出:
AlbConfig.alibabacloud.com/alb-2 created
建立並拷貝以下內容到ingress_class2.yaml檔案中,用於建立IngressClass。
1.19及之後版本叢集
apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: alb-2 spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb-2 # IngressClass關聯的AlbConfig的名稱
1.19版本之前叢集
apiVersion: networking.k8s.io/v1beta1 kind: IngressClass metadata: name: alb-2 spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb-2 # IngressClass關聯的AlbConfig的名稱
執行以下命令,建立IngressClass。
kubectl apply -f ingress_class2.yaml
預期輸出:
ingressclass.networking.k8s.io/alb-2 created
建立並拷貝以下內容到ingress2.yaml檔案中。通過
ingressClassName
參數指定不同的ALB執行個體。下方的樣本中,就通過在ingressClassName
欄位中填入alb-2
,將Ingress關聯到了名為alb-2的IngressClass,以及這個IngressClass所關聯的,名為alb-2的ALB執行個體。1.19及之後版本叢集
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: cafe-ingress2 spec: ingressClassName: alb-2 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-ingress2 spec: ingressClassName: alb-2 rules: - http: paths: # 配置Context Path。 - path: /tea backend: serviceName: tea-svc servicePort: 80 # 配置Context Path。 - path: /coffee backend: serviceName: coffee-svc servicePort: 80
執行以下命令,建立Ingress。
kubectl apply -f ingress2.yaml
預期輸出:
ingress.networking.k8s.io/cafe-ingress2 created
使用IPv6地址
在建立ALB執行個體時,通過在addressIpVersion
欄位中填入DualStack
即可開啟雙棧,同時支援IPv4與IPv6。
addressIpVerison
參數僅在建立AlbConfig時被解析,後續更新AlbConfig不產生效果。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
addressIpVersion: DualStack # 開啟雙棧
...
指定TLS安全性原則
當前AlbConfig配置HTTPS監聽時,支援指定TLS安全性原則。TLS安全性原則包含自訂策略和系統預設策略,更多資訊,請參見TLS安全性原則。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
#...
listeners:
- port: 443
protocol: HTTPS
securityPolicyId: tls_cipher_policy_1_1 # 指定的安全性原則ID
#...
開啟Log Service訪問日誌
如果您希望ALB Ingress能夠收集訪問日誌Access Log,可以在AlbConfig中指定logProject
和logStore
。
建立叢集時,您選擇了自動建立或使用已有Log ServiceProject。您可登入Container Service管理主控台,在左側導覽列選擇叢集。在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇叢集資訊。然後,在叢集資源頁簽,查看叢集關聯的Log Service Project。
logStore
命名需要以alb_
開頭,若指定logStore
不存在,則會自動建立。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
accessLogConfig:
logProject: "k8s-log-xz92lvykqj1siwvif****"
logStore: "alb_****"
#...
您可以在叢集資源頁簽單擊Log Service Project右側的名稱,查看收集的訪問日誌。
刪除ALB執行個體
一個AlbConfig對應一個ALB執行個體, 因此,如果ALB執行個體使用AlbConfig建立,則可以通過刪除AlbConfig實現刪除ALB執行個體。
刪除AlbConfig前,請刪除其關聯的所有Ingress資源。
執行以下命令,刪除AlbConfig。
kubectl delete AlbConfig <AlbConfig_NAME> # <AlbConfig_NAME>替換AlbConfig的名稱
刪除複用ALB執行個體的AlbConfig
在建立AlbConfig時如果選擇複用已有ALB執行個體,因為執行個體並非通過AlbConfig建立,刪除AlbConfig並不會刪除ALB執行個體。如果您希望刪除複用ALB執行個體的AlbConfig,請按照以下操作步驟操作。
使用
kubectl edit
命令修改AlbConfig,刪除此AlbConfig的所有監聽,即刪除spec.listeners
欄位下的所有條目。重要若您叢集中安裝的ALB Ingress Controller組件版本為v2.10.0-aliyun.1及以前版本,請執行該操作。否則,請跳過該步驟。
執行以下命令,刪除AlbConfig。
重要刪除AlbConfig前,請刪除其關聯的所有Ingress資源。
kubectl delete AlbConfig <AlbConfig_NAME> # <AlbConfig_NAME>替換AlbConfig的名稱
建立監聽
監聽(Listeners)是ALB執行個體用來處理實際流量的頂層入口。只有建立了監聽,ALB執行個體才能對外開放連接埠,接收用戶端的請求。
在AlbConfig中設定port
和protocol
即可建立對應的監聽。一旦修改了port
、protocol
以及其他監聽的屬性,系統將會把原有的監聽刪除,然後建立一個新的監聽來替代它。
監聽可以使用三種應用程式層協議:HTTP、HTTPS、QUIC。
不同協議的多個監聽可以同時使用,但需要在Ingress資源中配置Annotation以保證Ingress同時適用於多個監聽。具體操作,請參見配置自訂監聽連接埠。
建立HTTP監聽
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
...
listeners:
- port: 80
protocol: HTTP # protocol的可選項為HTTP、HTTPS、QUIC。
...
HTTP協議自動相容WebSocket,不需要特殊設定即可。
建立HTTPS監聽
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
...
listeners:
- port: 443
protocol: HTTPS
...
使用HTTPS監聽時,需要配置認證。具體操作,請參見配置HTTPS認證以實現加密通訊。
建立QUIC監聽
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
...
listeners:
- port: 443
protocol: QUIC
...
使用QUIC監聽可以相容用戶端使用HTTP/3協議進行訪問。使用QUIC監聽的更多細節,請參見使用QUIC監聽相容HTTP/3協議。
設定監聽串連請求逾時時間
在AlbConfig中可以指定監聽,設定串連請求逾時時間(單位為秒,取值範圍為[1,180])。若在逾時時間內後端伺服器一直沒有響應,ALB執行個體將放棄等待,給用戶端返回HTTP 504錯誤碼。如果不指定串連請求逾時時間,則預設為60秒。YAML樣本如下。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
...
listeners:
- port: 80
protocol: HTTP
requestTimeout: 40 # 若不填入值,預設逾時時間為60秒
...
使用資料壓縮功能
開啟該功能後,ALB執行個體會對某些特定檔案類型進行壓縮。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: alb
spec:
config:
...
listeners:
- port: 80
protocol: HTTP
gzipEnabled: true
...
擷取用戶端真實IP
開啟此功能後,ALB執行個體在轉寄請求到後端服務時,在HTTP要求標頭中添加用戶端真實IP的欄位。XForwardedForEnabled
取值如下:
true
:擷取來訪者真實IP。false
:不擷取來訪者真實IP。
僅HTTP和HTTPS監聽支援配置此參數。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
#...
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForEnabled: true
#...
擷取用戶端的連接埠
開啟此功能後,ALB執行個體在轉寄請求到後端服務時,在HTTP要求標頭中添加用戶端連接埠欄位。XForwardedForClientSrcPortEnabled
取值如下:
true
:擷取Server Load Balancer執行個體用戶端的連接埠。false
:不擷取Server Load Balancer執行個體用戶端的連接埠。
僅HTTP和HTTPS監聽支援配置此參數。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
...
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForClientSrcPortEnabled: true
...
擷取ALB執行個體的監聽協議
開啟此功能後,ALB執行個體在轉寄請求到後端服務時,在HTTP要求標頭中添加ALB執行個體使用的監聽協議欄位。XForwardedForProtoEnabled
取值如下:
true
:擷取執行個體的監聽協議。false
:不擷取執行個體的監聽協議。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
...
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForProtoEnabled: true
...
擷取ALB執行個體的ID
開啟此功能後,ALB執行個體在轉寄請求到後端服務時,在HTTP要求標頭中添加ALB執行個體的ID欄位。XForwardedForSLBIdEnabled
取值如下:
true
:擷取Server Load Balancer執行個體的ID。false
:不擷取Server Load Balancer執行個體的ID。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
...
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForSLBIdEnabled: true
...
擷取ALB執行個體的監聽連接埠
開啟此功能後,ALB執行個體在轉寄請求到後端服務時,在HTTP要求標頭中添加執行個體的監聽連接埠欄位。XForwardedForSLBPortEnabled
取值如下:
true
:擷取執行個體的監聽連接埠。false
:不擷取執行個體的監聽連接埠。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
...
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForSLBPortEnabled: true
...
指定可信Proxy 伺服器的IP
在AlbConfig中通過XForwardedForClientSourceIpsEnabled
配置項允許ALB執行個體從X-Forwarded-For
頭部欄位中擷取真實用戶端IP。通過XForwardedForClientSourceIpsTrusted
配置項,可以指定一組可信Proxy 伺服器的IP。ALB執行個體將從X-Forwarded-For
欄位中的IP列表末尾開始向前遍曆,選擇第一個不在可信IP列表的IP作為用戶端的實際IP。
例如,X-Forwarded-For
中的值為<用戶端真實IP,代理IP-1,代理IP-2>
,您可以在XForwardedForClientSourceIpsTrusted
中填入代理IP-1
與代理IP-2
,以此擷取真實的用戶端IP。
僅HTTP和HTTPS監聽支援配置此參數。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
...
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForClientSourceIpsEnabled: true # true表示允許ALB從X-Forwarded-For頭欄位中尋找真實用戶端IP,此時必須配置XForwardedForClientSourceIpsTrusted寫入格式正確的內容;false表示不允許ALB從X-Forwarded-For頭欄位中尋找真實用戶端IP。
XForwardedForClientSourceIpsTrusted: 192.168.x.x;192.168.x.x/16 # 請輸入正確格式的IP或網段,並以 ; 分隔,IP或網段之間無需添加空格。僅在XForwardedForClientSourceIpsEnabled為true時生效。
...
設定ACL存取控制
通過AlbConfig可以為ALB監聽啟用存取控制功能,通過設定入方向的允許或拒絕規則,對用戶端請求精確控制,管理請求轉寄。關於ACL的更多資訊,請參見配置ACL實現存取控制。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
#...
listeners:
- port: 80
protocol: HTTP
aclConfig:
aclEntries:
- 127.0.0.1/32
aclType: White
#...
欄位說明如下:
aclType
:用於設定監聽的ACL為黑名單或白名單。取值為Black
和White
,分別表示黑名單和白名單。aclEntries
:用於設定存取控制條目IP位址區段,例如127.0.0.1/32。