本文說明如何設定及使用 Google Distributed Cloud 的邊界閘道通訊協定 (BGP) 搭配組合式負載平衡器。這個負載平衡模式支援透過叢集的外部邊界閘道通訊協定 (eBGP) 通告 ServiceType
LoadBalancer
虛擬 IP 位址 (VIP)。在這種情況下,叢集網路是自主系統,透過對等互連與另一個自主系統 (外部網路) 互連。
具備 BGP 功能的隨附負載平衡器適用於所有叢集類型,但管理員叢集僅支援這項功能的控制層負載平衡部分。
使用 BGP 進行套裝組合負載平衡功能具有下列優點:
- 使用 N 向主動/主動負載平衡功能,可提供更快的容錯移轉速度,並更有效率地使用可用頻寬。
- 支援第 3 層通訊協定,可與相容於 eBGP 的第三方機架頂端 (ToR) 交換器和路由器搭配運作。
- 讓執行進階軟體定義網路 (SDN) 堆疊的資料中心,將第 3 層邊界一路推送到叢集。
使用 BGP 進行套裝組合負載平衡的運作方式
下列各節簡要說明搭配 BGP 的組合式負載平衡器運作方式。
BGP 對等互連
使用 BGP 進行套裝組合負載平衡時,系統會啟動多個與基礎架構的 BGP 連線。BGP 必須符合下列技術規定:
- 控制層 VIP 和服務 VIP 的對等互連工作階段是分開的。
- 控制層對等互連工作階段是從控制層節點的 IP 位址啟動。
- 服務對等互連工作階段是從您在
NetworkGatewayGroup
自訂資源中指定的浮動 IP 位址啟動。 - GDC 控制器的網路閘道會管理浮動 IP 位址。
- 以 BGP 為基礎的套裝組合負載平衡僅支援 eBGP 對等互連。
- 系統預設支援多跳對等互連。
- 系統不支援 BGP 工作階段的 MD5 密碼。
- 系統不支援以 IPv6 為基礎的對等互連工作階段。
- 向任何對等互連裝置宣傳的路由,預期會重新分配到整個網路,並可從叢集中的任何其他位置存取。
- 建議在對等互連工作階段中使用接收模式的 BGP
ADD-PATH
功能。 - 從每個對等互連裝置放送多個路徑,可實現主動/主動負載平衡。
- 請為網路啟用等價多路徑路由 (ECMP),這樣就能使用多個路徑,將流量分散到一組負載平衡器節點。
控制層負載平衡
叢集中的每個控制層節點都會與基礎架構中的一或多個對等互連建立 BGP 工作階段。我們要求每個控制層節點至少要有一個對等互連節點。在叢集設定檔中,您可以設定哪些控制層節點要連線至哪些外部對等互連。
下圖顯示控制平面對等互連的範例。叢集在一個子網路中有兩個控制層節點,另一個子網路則有一個。每個子網路都有外部對等互連 (TOR),Google Distributed Cloud 控制層節點會與其 TOR 對等互連。
服務負載平衡
除了從每個控制層節點啟動的對等互連工作階段外,還會為 LoadBalancer
服務啟動額外的對等互連工作階段。這些對等互連工作階段不是直接從叢集節點 IP 位址啟動,而是使用浮動 IP 位址。
支援設有externalTrafficPolicy=Local
網路政策的服務。不過,externalTrafficPolicy=Local
設定取決於工作負載,且每當支援服務的 Pod 從節點完全新增或移除時,都會導致路由更新。這項路徑更新行為可能會導致等價多路徑 (ECMP) 轉送變更流量,進而造成流量下降。
浮動 IP 位址
服務負載平衡需要您在叢集節點子網路中預留浮動 IP 位址,以用於 BGP 對等互連。叢集至少需要一個浮動 IP 位址,但建議您保留至少兩個位址,確保 BGP 工作階段的高可用性。浮動 IP 位址是在 NetworkGatewayGroup
自訂資源 (CR) 中指定,可納入叢集設定檔。
浮動 IP 位址可免除將 BGP 揚聲器 IP 位址對應至節點的疑慮。GDC 控制器的網路閘道會負責將 NetworkGatewayGroup
指派給節點,並管理浮動 IP 位址。如果節點故障,GDC 控制器的網路閘道會重新指派浮動 IP 位址,確保外部對等互連裝置有確定的 IP 位址可供對等互連。
外部對等互連
如要進行資料層負載平衡,可以使用在叢集設定檔的 loadBalancer.controlPlaneBGP
部分中,為控制層對等互連指定的相同外部對等互連。或者,您也可以指定不同的 BGP 對等互連。
如要為資料平面對等互連指定不同的 BGP 對等互連點,請將 BGPLoadBalancer
和 BGPPeer
資源規格附加至叢集設定檔。如果未指定這些自訂資源,系統會自動將控制層對等互連用於資料層。
您可以在 BGPPeer
自訂資源中,指定用於對等互連工作階段的外部對等互連點,並將該資源新增至叢集設定檔。BGPPeer
資源包含標籤,可供對應的 BGPLoadBalancer
自訂資源識別。您可以在 BGPLoadBalancer
自訂資源的 peerSelector
欄位中指定相符的標籤,選取要使用的 BGPPeer
。
GDC 控制器的網路閘道會嘗試與預留浮動 IP 位址集中的每個外部對等互連建立工作階段 (工作階段數量可設定)。建議您至少指定兩個外部對等互連,確保 BGP 工作階段的高可用性。為服務負載平衡指定的每個外部對等互連,都必須設定為與 NetworkGatewayGroup
自訂資源中指定的每個浮動 IP 位址對等互連。
負載平衡器節點
叢集中的一部分節點會用於負載平衡,也就是說,這些節點會宣傳自己能夠接受連入的負載平衡流量。這組節點預設為控制層節點集區,但您可以在叢集設定檔的 loadBalancer
區段中指定其他節點集區。如果您指定節點集區,系統會將該集區用於負載平衡器節點,而非控制層節點集區。
浮動 IP 位址 (做為 BGP 揚聲器) 可能會在負載平衡器節點上執行,也可能不會。浮動 IP 位址會指派給相同子網路中的節點,並從該處啟動對等互連,無論該節點是否為負載平衡器節點。不過,透過 BGP 放送的下一個躍點一律是負載平衡器節點。
對等互連拓撲範例
下圖顯示使用 BGP 對等互連的服務負載平衡範例。兩個浮動 IP 位址分別指派給各自子網路中的節點。已定義兩個外部對等互連。每個浮動 IP 都會與兩個外部對等互連體對等互連。
設定 BGP 負載平衡器
以下各節說明如何設定叢集和外部網路,以搭配 BGP 使用隨附的負載平衡器。
規劃與外部基礎架構的整合
如要搭配 BGP 使用套裝組合的負載平衡器,您必須設定外部基礎架構:
外部基礎架構必須設定為與叢集中的每個控制層節點對等互連,才能設定控制層通訊。這些對等互連工作階段用於宣傳 Kubernetes 控制層 VIP。
外部基礎架構必須設定為與一組預留的浮動 IP 位址對等互連,以進行資料平面通訊。浮動 IP 位址用於 Service VIP 的 BGP 對等互連。建議您使用兩個浮動 IP 位址和兩個對等互連,確保 BGP 工作階段的高可用性。如要瞭解如何預留浮動 IP,請參閱使用 BGP 設定叢集,以進行隨附的負載平衡。
設定基礎架構後,請將 BGP 對等互連資訊新增至叢集設定檔。您建立的叢集可以與外部基礎架構啟動對等互連工作階段。
設定叢集,使用 BGP 進行套裝組合負載平衡
建立叢集時,您可以在叢集設定檔中啟用及設定套裝組合負載平衡,並使用 BGP。在叢集設定檔中,啟用進階網路功能並更新 loadBalancer
區段。您也可以附加下列三項自訂資源的規格:
NetworkGatewayGroup
:指定用於服務 BGP 對等互連工作階段的浮動 IP 位址。BGPLoadBalancer
:使用標籤選取器指定用於 BGP 負載平衡的對等互連。BGPPeer
:指定個別對等互連,包括用於選取目的的標籤,適用於 BGP 對等互連工作階段。
下列操作說明將介紹如何設定叢集和三項自訂資源,以透過 BGP 設定組合式負載平衡。
在
clusterNetwork
區段中,將advancedNetworking
欄位新增至叢集設定檔,並設為true
。這個欄位可啟用進階網路功能,特別是 Network Gateway Group 資源。
apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: bm namespace: CLUSTER_NAMESPACE spec: ... clusterNetwork: advancedNetworking: true
將
CLUSTER_NAMESPACE
替換為叢集的命名空間。根據預設,Google Distributed Cloud 的叢集命名空間是叢集名稱,並以cluster-
為前置字串。舉例來說,如果叢集名稱為test
,命名空間就是cluster-test
。在叢集設定檔的
loadBalancer
區段中,將mode
設為bundled
,並新增type
欄位,值為bgp
。這些欄位值可啟用以 BGP 為基礎的套裝組合負載平衡。
... loadBalancer: mode: bundled # type can be 'bgp' or 'layer2'. If no type is specified, we default to layer2. type: bgp ...
如要指定控制平面的 BGP 對等互連資訊,請在
loadBalancer
區段中新增下列欄位:... # AS number for the cluster localASN: CLUSTER_ASN # List of BGP peers used for the control plane peering sessions. bgpPeers: - ip: PEER_IP asn: PEER_ASN # optional; if not specified, all CP nodes connect to all peers. controlPlaneNodes: # optional - CP_NODE_IP ...
更改下列內容:
CLUSTER_ASN
:要建立的叢集自治系統編號。PEER_IP
:外部對等互連裝置的 IP 位址。PEER_ASN
:包含外部對等互連裝置的網路自治系統號碼。CP_NODE_IP
:(選用) 連線至外部對等互連的控制層節點 IP 位址。如果您未指定任何控制層節點,所有控制層節點都可以連線至外部對等互連。如果您指定一或多個 IP 位址,只有指定的節點會參與對等互連工作階段。
您可以指定多個外部對等互連,
bgpPeers
會採用對應清單。建議您至少指定兩個外部對等互連,確保 BGP 會話具有高可用性。如需多個對等互連的範例,請參閱「設定範例」。設定
loadBalancer.ports
、loadBalancer.vips
和loadBalancer.addressPools
欄位 (顯示預設值)。... loadBalancer: ... # Other existing load balancer options remain the same ports: controlPlaneLBPort: 443 # When type=bgp, the VIPs are advertised over BGP vips: controlPlaneVIP: 10.0.0.8 ingressVIP: 10.0.0.1 addressPools: - name: pool1 addresses: - 10.0.0.1-10.0.0.4 ...
指定要用於資料層負載平衡的叢集節點。
您可以依需求選擇執行這個步驟。如果未取消註解
nodePoolSpec
區段,控制層節點會用於資料層負載平衡。... # Node pool used for load balancing data plane (nodes where incoming traffic # arrives. If not specified, this defaults to the control plane node pool. # nodePoolSpec: # nodes: # - address: <Machine 1 IP> ...
設定
NetworkGatewayGroup
自訂資源,保留浮動 IP 位址:浮動 IP 位址用於對等互連工作階段,以進行資料層負載平衡。
... --- apiVersion: networking.gke.io/v1 kind: NetworkGatewayGroup metadata: name: default namespace: CLUSTER_NAMESPACE spec: floatingIPs: - FLOATING_IP nodeSelector: # optional - NODE_SELECTOR ...
更改下列內容:
CLUSTER_NAMESPACE
:叢集的命名空間。根據預設,Google Distributed Cloud 的叢集命名空間是叢集名稱,並以cluster-
為前置字串。舉例來說,如果叢集名稱為test
,則命名空間為cluster-test
。FLOATING_IP
:叢集子網路的 IP 位址。您必須至少指定一個 IP 位址,但建議至少指定兩個 IP 位址。NODE_SELECTOR
:(選用) 標籤選取器,用於識別要與外部對等互連建立對等互連工作階段的節點,例如機架頂端 (ToR) 交換器。如果不需要,請移除這個欄位。
請確認
NetworkGatewayGroup
自訂資源命名為default
,並使用叢集命名空間。如要查看NetworkGatewayGroup
自訂資源規格的範例,請參閱「設定範例」。(選用) 設定
BGPLoadBalancer
自訂資源,指定用於資料平面負載平衡的對等互連:... --- apiVersion: networking.gke.io/v1 kind: BGPLoadBalancer metadata: name: default namespace: CLUSTER_NAMESPACE spec: peerSelector: PEER_LABEL: "true" ...
更改下列內容:
CLUSTER_NAMESPACE
:叢集的命名空間。根據預設,Google Distributed Cloud 的叢集命名空間是叢集名稱,並以cluster-
為前置字串。舉例來說,如果叢集名稱為test
,則命名空間為cluster-test
。PEER_LABEL
:用於識別要用於負載平衡的對等互連。任何具有相符標籤的BGPPeer
自訂資源,都會指定每個對等互連的詳細資料。
確認
BGPLoadBalancer
自訂資源命名為default
,並使用叢集命名空間。如果未指定BGPLoadBalancer
自訂資源,系統會自動使用控制層對等互連進行資料層負載平衡。如需完整範例,請參閱「設定範例」。(選用) 設定一或多個
BGPPeer
自訂資源,為資料平面指定外部對等互連:... --- apiVersion: networking.gke.io/v1 kind: BGPPeer metadata: name: BGP_PEER_NAME namespace: CLUSTER_NAMESPACE labels: PEER_LABEL: "true" spec: localASN: CLUSTER_ASN peerASN: PEER_ASN peerIP: PEER_IP sessions: SESSION_QTY selectors: # Optional gatewayRefs: - GATEWAY_REF ...
更改下列內容:
BGP_PEER_NAME
:對等互連的名稱。CLUSTER_NAMESPACE
:叢集的命名空間。根據預設,Google Distributed Cloud 的叢集命名空間是叢集名稱,並以cluster-
為前置字串。舉例來說,如果叢集名稱為test
,則命名空間為cluster-test
。PEER_LABEL
:用於識別要將哪些對等互連用於負載平衡的標籤。這個標籤應與BGPLoadBalancer
自訂資源中指定的標籤相符。CLUSTER_ASN
:要建立的叢集自治系統編號。PEER_IP
:外部對等互連裝置的 IP 位址。建議您至少指定兩個外部對等互連,但至少要指定一個。PEER_ASN
:包含外部對等互連裝置的網路自治系統號碼。SESSION_QTY
:要為這個對等互連建立的連線數。建議您至少建立兩個工作階段,確保在其中一個節點發生故障時,仍能與對等互連裝置保持連線。GATEWAY_REF
:(選用) 用於對等互連的 NetworkGatewayGroup 資源名稱。如果未設定,則可以使用任何或所有閘道資源。搭配 NetworkGatewayGroups 資源中的nodeSelector
欄位使用這項設定,即可選取要與特定外部對等互連 (例如 ToR 交換器) 的節點。如要選取多個 NetworkGatewayGroups,可以輸入多個項目,每行一個閘道。
您可以建立其他
BGPPeer
自訂資源,指定多個外部對等互連。建議您至少指定兩個外部對等互連 (兩個自訂資源),確保 BGP 工作階段的高可用性。如果您未指定BGPPeer
自訂資源,系統會自動使用控制層對等互連,達到資料層負載平衡。執行
bmctl cluster create
建立叢集時,系統會進行預檢。預檢會驗證控制層的 BGP 對等互連設定,並在建立叢集前,直接向管理工作站回報任何問題。成功後,新增的 BGP 負載平衡資源 (NetworkGatewayGroup、BGPLoadBalancer 和 BGPPeer) 會進入使用者叢集命名空間的管理員叢集。後續更新這些資源時,請使用管理員叢集 kubeconfig 檔案。管理員叢集隨後會協調使用者叢集的變更。如果您直接在使用者叢集上編輯這些資源,管理員叢集會在後續的協調作業中覆寫您的變更。
透過 BGP ADD-PATH
,為每個工作階段通告多個下一個中繼站
建議您使用 BGP ADD-PATH
功能進行對等互連工作階段,如 RFC 7911 所述。根據預設,BGP 協定只允許為單一前置字元向對等互連廣告宣傳單一下一個躍點。BGP ADD-PATH
可為相同前置字元宣傳多個後續躍點。如果 ADD-PATH
與以 BGP 為基礎的組合式負載平衡搭配使用,叢集可將多個叢集節點宣傳為負載平衡器服務 (前置字元) 的前端節點 (下一個躍點)。在網路中啟用 ECMP,讓流量分散到多個路徑。可將多個叢集節點宣傳為下一個躍點,藉此分散流量,進而提升負載平衡的資料平面容量擴充性。
如果外部對等裝置 (例如機架頂端 (ToR) 交換器或路由器) 支援 BGP ADD-PATH
,只要開啟接收擴充功能即可。使用 BGP 進行套裝組合負載平衡時,不需要 ADD-PATH
功能,但每個對等互連工作階段只能宣傳一個負載平衡節點,因此負載平衡器資料層容量會受到限制。如果沒有 ADD-PATH
,
Google Distributed Cloud 會從負載平衡器節點集區挑選要宣傳的節點,並嘗試將不同 VIP 的下一個躍點分散到不同節點。
將 BGP 對等互連限制為負載平衡器節點
Google Distributed Cloud 會自動在與浮動 IP 位址相同的子網路中,為任何節點指派浮動 IP 位址。即使這些 IP 位址未連上負載平衡器節點,仍會啟動 BGP 工作階段。這是設計上的行為,因為我們已將控制層 (BGP) 與資料層 (LB 節點集區) 分開。
如要限制可用於 BGP 對等互連的節點集,可以指定一個子網路,僅供負載平衡器節點使用。也就是說,您可以將該子網路中的所有節點設定為負載平衡器節點集區。接著,設定用於 BGP 對等互連的浮動 IP 位址時,請務必使用這個子網路的 IP 位址。Google Distributed Cloud 可確保浮動 IP 位址指派和 BGP 對等互連只會從負載平衡器節點進行。
使用雙堆疊網路設定 BGP 負載平衡
從 Google Distributed Cloud 1.14.0 版開始,以 BGP 為基礎的組合式負載平衡器支援 IPv6。隨著 IPv6 支援的推出,您可以在設定為雙重堆疊網路的叢集上,設定 IPv6 和雙重堆疊 LoadBalancer 服務。本節說明設定雙堆疊、使用 BGP 設定套裝組合負載平衡時,需要進行的變更。
如要啟用雙堆疊 LoadBalancer 服務,必須進行下列設定變更:
基礎叢集必須設定為雙重堆疊網路:
在叢集設定檔的
spec.clusterNetwork.services.cidrBlocks
下方,同時指定 IPv4 和 IPv6 服務 CIDR。定義適當的 ClusterCIDRConfig 資源,指定 Pod 的 IPv4 和 IPv6 CIDR 範圍。
如要進一步瞭解如何設定叢集以使用雙堆疊網路,請參閱「IPv4/IPv6 雙堆疊網路」。
在叢集設定檔的
spec.loadBalancer.addressPools
下方指定 IPv6 位址集區。如要讓 MetalLB 將 IP 位址分配給雙重堆疊服務,至少須有一個位址集區同時包含 IPv4 和 IPv6 格式的位址。
以下設定範例重點說明使用 BGP 進行雙重堆疊套裝組合負載平衡時,需要進行的變更:
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: bm
namespace: cluster-bm
spec:
...
clusterNetwork:
services:
cidrBlocks:
# Dual-stack Service IP addresses must be provided
- 10.96.0.0/16
- fd00::/112
...
loadBalancer:
mode: bundled
# type can be 'bgp' or 'layer2'. If no type is specified we default to layer2.
type: bgp
# AS number for the cluster
localASN: 65001
bgpPeers:
- ip: 10.8.0.10
asn: 65002
- ip: 10.8.0.11
asn: 65002
addressPools:
- name: pool1
addresses:
# Each address must be either in the CIDR form (1.2.3.0/24)
# or range form (1.2.3.1-1.2.3.5).
- "203.0.113.1-203.0.113.20"
- "2001:db8::1-2001:db8::20" # Note the additional IPv6 range
... # Other cluster config info omitted
---
apiVersion: networking.gke.io/v1
kind: NetworkGatewayGroup
metadata:
name: default
namespace: cluster-bm
spec:
floatingIPs:
- 10.0.1.100
- 10.0.2.100
---
apiVersion: baremetal.cluster.gke.io/v1alpha1
kind: ClusterCIDRConfig
metadata:
name: cluster-wide-1
namespace: cluster-bm
spec:
ipv4:
cidr: "192.168.0.0/16"
perNodeMaskSize: 24
ipv6:
cidr: "2001:db8:1::/112"
perNodeMaskSize: 120
使用 BGP 進行雙重堆疊套裝組合負載平衡的限制
將叢集設定為使用雙堆疊時,請注意下列限制:
系統不支援 IPv6 控制層負載平衡。
系統不支援 IPv6 BGP 工作階段,但可透過多通訊協定 BGP,在 IPv4 工作階段中播送 IPv6 路徑。
設定範例
以下各節將示範如何為不同選項或行為設定以 BGP 為基礎的負載平衡。
將所有節點設為使用相同對等互連
如下圖所示,這項設定會產生一組可供所有節點存取的外部對等互連 (10.8.0.10
和 10.8.0.11
)。指派給資料層節點的控制層節點 (10.0.1.10
、10.0.1.11
和 10.0.2.10
) 和浮動 IP 位址 (10.0.1.100
和 10.0.2.100
) 都會連線至對等互連。
保留給 loadBalancer
服務對等互連的任一浮動 IP 位址 (10.0.1.100
或 10.0.2.100
),都可連線至相同的外部對等互連。浮動 IP 位址可指派給位於相同子網路的節點。
如下列叢集設定範例所示,您可以為控制層節點設定對等互連,bgpPeers
,而不指定 controlPlaneNodes
。如果未指定對等互連的節點,所有控制層節點都會連線至所有對等互連。
在 NetworkGatewayGroup
自訂資源中,指定要用於服務負載平衡對等互連工作階段的浮動 IP 位址。在這個範例中,由於未指定 BGPLoadBalancer
,控制層對等互連會自動用於資料層 BGP 工作階段。
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: bm
namespace: cluster-bm
spec:
...
loadBalancer:
mode: bundled
# type can be 'bgp' or 'layer2'. If no type is specified, we default to layer2.
type: bgp
# AS number for the cluster
localASN: 65001
bgpPeers:
- ip: 10.8.0.10
asn: 65002
- ip: 10.8.0.11
asn: 65002
... (other cluster config omitted)
---
apiVersion: networking.gke.io/v1
kind: NetworkGatewayGroup
metadata:
name: default
namespace: cluster-bm
spec:
floatingIPs:
- 10.0.1.100
- 10.0.2.100
設定特定控制層節點,與特定外部對等互連節點建立對等互連
如下圖所示,這項設定會導致兩個控制層節點 (10.0.1.10
和 10.0.1.11
) 與一個外部對等互連 (10.0.1.254
) 對等互連。第三個控制層節點 (10.0.2.10
) 則與另一個外部對等互連 (10.0.2.254
) 對等互連。如果您不希望所有節點都連線至所有對等互連,這項設定就非常實用。舉例來說,您可能希望控制層節點只與對應的機架頂端 (ToR) 交換器對等互連。
保留給服務負載平衡對等互連工作階段的浮動 IP 位址 (10.0.1.100
或 10.0.2.100
) 都能連線至相同的外部對等互連。浮動 IP 位址可指派給同一個子網路中的節點。
如下列叢集設定範例所示,您可以在 bgpPeers
區段中,為對等互連指定 controlPlaneNodes
欄位中的 IP 位址,限制哪些控制層節點可以連線至特定對等互連。
在 NetworkGatewayGroup
自訂資源中,指定要用於服務負載平衡對等互連工作階段的浮動 IP 位址。在這個範例中,由於未指定 BGPLoadBalancer
,控制層對等互連會自動用於資料層 BGP 工作階段。
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: bm
namespace: cluster-bm
spec:
...
loadBalancer:
mode: bundled
# type can be 'bgp' or 'layer2'. If no type is specified, we default to layer2.
type: bgp
# AS number for the cluster
localASN: 65001
bgpPeers:
- ip: 10.0.1.254
asn: 65002
controlPlaneNodes:
- 10.0.1.10
- 10.0.1.11
- ip: 10.0.2.254
asn: 65002
controlPlaneNodes:
- 10.0.2.10
... (other cluster config omitted)
---
apiVersion: networking.gke.io/v1
kind: NetworkGatewayGroup
name: default
namespace: cluster-bm
spec:
floatingIPs:
- 10.0.1.100
- 10.0.2.100
分別設定控制層和資料層
如下圖所示,這項設定會導致兩個控制層節點 (10.0.1.10
和 10.0.1.11
) 與一個外部對等互連 (10.0.1.254
),而第三個控制層節點 (10.0.2.11
) 則與另一個外部對等互連 (10.0.2.254
)。
第三個外部對等互連 (10.0.3.254
) 可透過任一浮動 IP 位址 (10.0.3.100
或 10.0.3.101
) 連線,這些 IP 位址是為服務負載平衡對等互連工作階段保留。浮動 IP 位址可指派給同一個子網路中的節點。
如下列叢集設定範例所示,您可以在 bgpPeers
區段中,為對等互連指定 controlPlaneNodes
欄位中的 IP 位址,限制哪些控制層節點可以連線至特定對等互連。
在 NetworkGatewayGroup
自訂資源中,指定要用於服務負載平衡對等互連工作階段的浮動 IP 位址。
如要設定資料平面負載平衡,請按照下列步驟操作:
在
BGPPeer
資源中指定資料層的外部對等互連,並新增用於選取對等互連的標籤,例如cluster.baremetal.gke.io/default-peer: "true"
。在
BGPLoadBalancer
資源中,為peerSelector
欄位指定相符的標籤。
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: bm
namespace: cluster-bm
spec:
...
loadBalancer:
mode: bundled
# type can be 'bgp' or 'layer2'. If no type is specified, we default to layer2.
type: bgp
# AS number for the cluster
localASN: 65001
bgpPeers:
- ip: 10.0.1.254
asn: 65002
controlPlaneNodes:
- 10.0.1.10
- 10.0.1.11
- ip: 10.0.2.254
asn: 65002
controlPlaneNodes:
- 10.0.2.11
... (other cluster config omitted)
---
apiVersion: networking.gke.io/v1
kind: NetworkGatewayGroup
name: default
namespace: cluster-bm
spec:
floatingIPs:
- 10.0.3.100
- 10.0.3.101
---
apiVersion: networking.gke.io/v1
kind: BGPLoadBalancer
metadata:
name: default
namespace: cluster-bm
spec:
peerSelector:
cluster.baremetal.gke.io/default-peer: "true"
---
apiVersion: networking.gke.io/v1
kind: BGPPeer
metadata:
name: bgppeer1
namespace: cluster-bm
labels:
cluster.baremetal.gke.io/default-peer: "true"
spec:
localASN: 65001
peerASN: 65002
peerIP: 10.0.3.254
sessions: 2
修改以 BGP 為基礎的負載平衡設定
建立叢集並設定使用 BGP 搭配組合式負載平衡後,部分設定可以更新,但部分設定在叢集建立後就無法更新。
後續更新 BGP 相關資源 (NetworkGatewayGroup、BGPLoadBalancer 和 BGPPeer) 時,請使用管理員叢集 kubeconfig 檔案。管理員叢集隨後會將變更同步至使用者叢集。如果您直接在使用者叢集上編輯這些資源,管理員叢集會在後續的協調作業中覆寫您的變更。
控制層
您可以在 Cluster
資源中更新控制層 BGP 對等互連資訊。您可以新增或移除控制層負載平衡部分中指定的對等互連。
以下各節將說明更新控制平面 BGP 對等互連資訊的最佳做法。
更新前檢查對等互連狀態
為盡量避免對等互連設定錯誤,請先檢查控制層 BGP 對等互連工作階段是否處於預期狀態,再進行變更。舉例來說,如果您預期所有 BGP 對等互連工作階段目前都處於執行狀態,請確認所有 bgp-advertiser
Pod 都回報 ready
,表示工作階段處於執行狀態。如果目前的狀態與預期不符,請先修正問題,再更新對等互連設定。
如要瞭解如何擷取控制層 BGP 工作階段詳細資料,請參閱「控制層 BGP 工作階段」。
以可控制的方式更新對等互連
如有可能,請一次更新一個對等互連裝置,藉此找出可能的問題:
- 新增或更新單一對等互連。
- 等待設定全面生效。
- 確認叢集可以連線至新的或更新的對等互連。
- 移除舊的或不需要的對等互連。
服務
如要更新位址集區和負載平衡器節點設定,請編輯 Cluster
資源中的 nodePoolSpec
。
叢集建立後,如要修改 BGP 對等互連設定,請編輯 NetworkGatewayGroup
和 BGPLoadBalancer
自訂資源。對這些自訂資源中的對等互連資訊所做的任何修改,都會反映在目標叢集中的負載平衡解決方案設定。
僅在管理叢集中的叢集命名空間內更新來源資源。對目標 (使用者) 叢集中的資源所做的任何修改都會遭到覆寫。
疑難排解
下列各節說明如何存取與 BGP 搭配使用的組合式負載平衡疑難排解資訊。
控制層 BGP 工作階段
叢集建立期間,系統會進行預檢來驗證控制層 BGP 對等互連設定。預檢會嘗試執行下列操作:
- 與每個對等互連點建立 BGP 連線。
- 通告控制層 VIP。
- 使用 VIP 確認控制層節點是否可連線。
如果叢集建立作業未通過預檢,請查看預檢記錄檔中的錯誤。預檢檢查記錄檔 (以日期為檔名) 位於 baremetal/bmctl-workspace/CLUSTER_NAME/log
目錄中。
在執行階段,控制層 BGP 揚聲器會在每個控制層節點上以靜態 Pod 形式執行,並將事件資訊寫入記錄檔。這些靜態 Pod 的名稱包含「bgpadvertiser」,因此請使用下列 kubectl get pods
指令查看 BGP 揚聲器 Pod 的狀態:
kubectl -n kube-system get pods | grep bgpadvertiser
如果 Pod 運作正常,回應內容應如下所示:
bgpadvertiser-node-01 1/1 Running 1 167m
bgpadvertiser-node-02 1/1 Running 1 165m
bgpadvertiser-node-03 1/1 Running 1 163m
使用下列指令查看 bgpadvertiser-node-01
Pod 的記錄:
kubectl -n kube-system logs bgpadvertiser-node-01
服務 BGP 工作階段
BGPSession
資源會提供目前 BGP 工作階段的相關資訊。如要取得工作階段資訊,請先取得目前的工作階段,然後擷取其中一個工作階段的 BGPSession
資源。
使用下列 kubectl get
指令列出目前的工作階段:
kubectl -n kube-system get bgpsessions
這項指令會傳回工作階段清單,如下列範例所示:
NAME LOCAL ASN PEER ASN LOCAL IP PEER IP STATE LAST REPORT
10.0.1.254-node-01 65500 65000 10.0.1.178 10.0.1.254 Established 2s
10.0.1.254-node-02 65500 65000 10.0.3.212 10.0.1.254 Established 2s
10.0.3.254-node-01 65500 65000 10.0.1.178 10.0.3.254 Established 2s
10.0.3.254-node-02 65500 65000 10.0.3.212 10.0.3.254 Established 2s
使用下列 kubectl describe
指令,取得 10.0.1.254-node-01
BGP 工作階段的 BGPSession
資源:
kubectl -n kube-system describe bgpsession 10.0.1.254-node-01
傳回的 BGPSession
資源應如下列範例所示:
Name: 10.0.1.254-node-01
Namespace: kube-system
Labels: <none>
Annotations: <none>
API Version: networking.gke.io/v1
Kind: BGPSession
Metadata:
(omitted)
Spec:
Floating IP: 10.0.1.178
Local ASN: 65500
Local IP: 10.0.1.178
Node Name: node-01
Peer ASN: 65000
Peer IP: 10.0.1.254
Status:
Advertised Routes:
10.0.4.1/32
Last Report Time: 2021-06-14T22:09:36Z
State: Established
使用 kubectl get
指令取得 BGPAdvertisedRoute
資源:
kubectl -n kube-system get bgpadvertisedroutes
回應會顯示目前放送的路線,類似下列範例:
NAME PREFIX METRIC
default-default-load-balancer-example 10.1.1.34/32
default-gke-system-istio-ingress 10.1.1.107/32
使用 kubectl describe
查看各路徑宣傳的下一個躍點詳細資料。
復原自我管理叢集的控制層 VIP 存取權
如要重新存取管理員、混合式或獨立叢集上的控制層虛擬 IP,請更新叢集上的 BGP 設定。如下列指令範例所示,使用 SSH 連線至節點,然後使用 kubectl
開啟叢集資源進行編輯。
ssh -i IDENTITY_FILE root@CLUSTER_NODE_IP
kubectl --kubeconfig /etc/kubernetes/admin.conf edit -n CLUSTER_NAMESPACE cluster CLUSTER_NAME
更改下列內容:
IDENTITY_FILE
:安全殼層身分識別檔案的名稱,其中包含公開金鑰驗證的身分識別金鑰。CLUSTER_NODE_IP
:叢集節點的 IP 位址。CLUSTER_NAMESPACE
:叢集的命名空間。CLUSTER_NAME
:叢集名稱。
修改叢集物件中的 BGP 對等互連設定。儲存新的叢集設定後,請監控 bgpadvertiser
pod 的健康狀態。如果設定正常運作,Pod 就會重新啟動,並在連線至同層級後恢復正常。
手動 BGP 驗證
本節提供手動驗證 BGP 設定的操作說明。這個程序會設定長時間執行的 BGP 連線,方便您與網路團隊進一步偵錯 BGP 設定。建立叢集前,請先使用這個程序驗證設定,如果與 BGP 相關的預檢失敗,也請使用這個程序。
預檢會自動執行下列 BGP 驗證工作:
- 設定與對等互連的 BGP 連線。
- 通告控制層 VIP。
- 確認從所有其他叢集節點傳送至 VIP 的流量,都會抵達目前的負載平衡器節點。
這些工作會在每個控制層節點上,為每個 BGP 對等互連執行。建立叢集時,通過這些檢查至關重要。不過,預檢不會建立長時間執行的連線,因此很難對失敗進行偵錯。
以下各節提供操作說明,協助您設定 BGP 連線,並從單一叢集機器向一個對等互連點宣傳路徑。如要測試多部電腦和多個對等互連裝置,請使用不同的電腦和對等互連裝置組合,再次重複上述操作。
請注意,BGP 連線是從控制層節點建立,因此請務必從其中一個預定控制層節點測試這項程序。
取得 BGP 測試計畫二進位檔
請在管理員工作站上執行本節中的步驟。這些步驟會取得用於測試 BGP 連線的 bgpadvertiser
程式,並將其複製到要測試的控制層節點。
提取 ansible-runner Docker 映像檔。
不使用登錄檔鏡像
如果您未使用登錄檔鏡像,請執行下列指令來提取 ansible-runner Docker 映像檔:
gcloud auth login gcloud auth configure-docker docker pull gcr.io/anthos-baremetal-release/ansible-runner:1.10.0-gke.13
使用登錄檔鏡像
如果您使用登錄檔鏡像,請執行下列指令來提取 ansible-runner Docker 映像檔:
docker login REGISTRY_HOST docker pull REGISTRY_HOST/anthos-baremetal-release/ansible-runner:1.10.0-gke.13
將 REGISTRY_HOST 替換為登錄檔鏡像伺服器的名稱。
擷取
bgpadvertiser
二進位檔。不使用登錄檔鏡像
如要解壓縮
bgpadvertiser
二進位檔,請執行下列指令:docker cp $(docker create gcr.io/anthos-baremetal-release/ansible-runner:1.10.0-gke.13):/bgpadvertiser .
使用登錄檔鏡像
如要解壓縮
bgpadvertiser
二進位檔,請執行下列指令:docker cp $(docker create REGISTRY_HOST/anthos-baremetal-release/ansible-runner:1.10.0-gke.13):/bgpadvertiser .
如要將
bgpadvertiser
二進位檔複製到要測試的控制平面節點,請執行下列指令:scp bgpadvertiser USERNAME>@CP_NODE_IP:/tmp/
更改下列內容:
USERNAME
:您用來存取控制平面節點的使用者名稱。CP_NODE_IP
:控制層節點的 IP 位址。
設定 BGP 連線
請在控制層節點上執行本節中的步驟。
在節點的
/tmp/bgpadvertiser.conf
建立如下所示的設定檔:localIP: NODE_IP localASN: CLUSTER_ASN peers: - peerIP: PEER_IP peerASN: PEER_ASN
更改下列內容:
NODE_IP
:您目前所在控制層節點的 IP 位址。CLUSTER_ASN
:叢集使用的自治系統號碼。PEER_IP
:要測試的其中一個外部對等互連 IP 位址。PEER_ASN
:包含外部對等互連裝置的網路自治系統號碼。
執行
bgpadvertiser
Daemon,並在下列指令中替換控制層 VIP:/tmp/bgpadvertiser --config /tmp/bgpadvertiser.conf --advertise-ip CONTROL_PLANE_VIP
將
CONTROL_PLANE_VIP
替換為您要用於控制層 VIP 的 IP 位址。這個指令會導致 BGP 廣告主向對等互連廣告這個位址。查看程式輸出內容。
此時,
bgpadvertiser
精靈會啟動、嘗試連線至對等互連,並播送 VIP。程式會定期列印訊息 (請參閱下列範例輸出內容),其中包含BGP_FSM_ESTABLISHED
,表示已建立 BGP 連線。{"level":"info","ts":1646788815.5588224,"logger":"BGPSpeaker","msg":"GoBGP gRPC debug endpoint disabled","localIP":"21.0.101.64"} {"level":"info","ts":1646788815.5596201,"logger":"BGPSpeaker","msg":"Started.","localIP":"21.0.101.64"} I0309 01:20:15.559667 1320826 main.go:154] BGP advertiser started. I0309 01:20:15.561434 1320826 main.go:170] Health status HTTP server started at "127.0.0.1:8080". INFO[0000] Add a peer configuration for:21.0.101.80 Topic=Peer {"level":"info","ts":1646788815.5623345,"logger":"BGPSpeaker","msg":"Peer added.","localIP":"21.0.101.64","peer":"21.0.101.80/4273481989"} DEBU[0000] IdleHoldTimer expired Duration=0 Key=21.0.101.80 Topic=Peer I0309 01:20:15.563503 1320826 main.go:187] Peer applied: {4273481989 21.0.101.80} DEBU[0000] state changed Key=21.0.101.80 Topic=Peer new=BGP_FSM_ACTIVE old=BGP_FSM_IDLE reason=idle-hold-timer-expired DEBU[0000] create Destination Nlri=10.0.0.1/32 Topic=Table {"level":"info","ts":1646788815.5670514,"logger":"BGPSpeaker","msg":"Route added.","localIP":"21.0.101.64","route":{"ID":0,"Metric":0,"NextHop":"21.0.101.64","Prefix":"10.0.0.1/32","VRF":""}} I0309 01:20:15.568029 1320826 main.go:199] Route added: {0 0 21.0.101.64 10.0.0.1/32 } I0309 01:20:15.568073 1320826 main.go:201] BGP advertiser serving... DEBU[0005] try to connect Key=21.0.101.80 Topic=Peer DEBU[0005] state changed Key=21.0.101.80 Topic=Peer new=BGP_FSM_OPENSENT old=BGP_FSM_ACTIVE reason=new-connection DEBU[0005] state changed Key=21.0.101.80 Topic=Peer new=BGP_FSM_OPENCONFIRM old=BGP_FSM_OPENSENT reason=open-msg-received INFO[0005] Peer Up Key=21.0.101.80 State=BGP_FSM_OPENCONFIRM Topic=Peer DEBU[0005] state changed Key=21.0.101.80 Topic=Peer new=BGP_FSM_ESTABLISHED old=BGP_FSM_OPENCONFIRM reason=open-msg-negotiated DEBU[0005] sent update Key=21.0.101.80 State=BGP_FSM_ESTABLISHED Topic=Peer attributes="[{Origin: i} 4273481990 {Nexthop: 21.0.101.64}]" nlri="[10.0.0.1/32]" withdrawals="[]" DEBU[0006] received update Key=21.0.101.80 Topic=Peer attributes="[{Origin: i} 4273481989 4273481990 {Nexthop: 21.0.101.64}]" nlri="[10.0.0.1/32]" withdrawals="[]" DEBU[0006] create Destination Nlri=10.0.0.1/32 Topic=Table DEBU[0035] sent Key=21.0.101.80 State=BGP_FSM_ESTABLISHED Topic=Peer data="&{{[] 19 4} 0x166e528}" DEBU[0065] sent Key=21.0.101.80 State=BGP_FSM_ESTABLISHED Topic=Peer data="&{{[] 19 4} 0x166e528}"
如果沒有看到這些訊息,請仔細檢查設定檔中的 BGP 設定參數,並向網路管理員確認。您現在已設定 BGP 連線。您可以請網路管理員確認他們是否已建立連線,以及是否已收到路由通告。
流量測試
如要測試網路是否能將流量轉送至 VIP,您必須將 VIP 新增至執行 bgpadvertiser
的控制層節點。在其他終端機中執行下列指令,讓 bgpadvertiser
保持執行狀態:
將 VIP 新增至控制層節點:
ip addr add CONTROL_PLANE_VIP/32 dev INTF_NAME
更改下列內容:
CONTROL_PLANE_VIP
:bgpadvertiser
的 VIP--advertise-ip
引數。INTF_NAME
:節點上的 Kubernetes 介面。也就是說,介面具有您在 Google Distributed Cloud 設定中輸入的 IP 位址,適用於loadBalancer.bgpPeers.controlPlaneNodes
。
從其他節點 Ping VIP:
ping CONTROL_PLANE_VIP
如果連線偵測失敗,可能是網路裝置上的 BGP 設定有問題。請與網路管理員合作,確認設定並解決問題。
清除所用資源
手動確認 BGP 運作正常後,請務必按照下列步驟重設節點。如果節點未正確重設,手動設定可能會干擾前置檢查或後續的叢集建立作業。
如果您是為了測試流量而新增控制層節點的 VIP,請移除該 VIP:
ip addr del CONTROL_PLANE_VIP/32 dev INTF_NAME
在控制層節點上,按下
bgpadvertiser
終端機中的Ctrl
+C
,停止 bgpadvertiser。確認沒有任何
bgpadvertiser
程序正在執行:ps -ef | grep bgpadvertiser
如果看到正在執行的程序,請使用
kill
指令停止程序。