從 Seesaw 負載平衡器遷移至 MetalLB

本文說明如何將 1.16 至 1.29 版的 Seesaw 負載平衡器遷移至 MetalLB 負載平衡器。如果叢集版本為 1.30 以上,建議按照「規劃叢集遷移至建議功能」一文中的操作說明進行。

相較於其他負載平衡選項,使用 MetalLB 有多項優點

1.28 和 1.29:正式發布版
1.16:預先發布版

如要檢查 externalTrafficPolicy,請執行下列指令:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get svc -A -o yaml | grep "externalTrafficPolicy: Local"

如要解決這個問題,請與 Google 支援團隊聯絡。

停機時間注意事項

遷移期間工作負載會停機。以下注意事項僅適用於非高可用性 (非 HA) 管理員叢集,因為 SeeSaw 負載平衡器不支援 HA 管理員叢集。

  • 遷移管理員叢集時:

    • kubeception 使用者叢集會因controlPlaneVIP遷移而導致控制層停機。停機時間應少於 10 分鐘,但停機時間長度取決於您的基礎架構。

    • 管理員主節點需要重新建立,且 controlPlaneVIP 直接附加至 VM,因此管理員叢集控制層會暫停運作。停機時間應少於 20 分鐘,但停機時間長度取決於您的基礎架構。

  • 遷移使用者叢集時,Seesaw 負載平衡器關閉電源後,MetalLB Pod 啟動前,VIP 會發生中斷情形。這項程序通常約需一分鐘。

使用者叢集遷移

您必須選擇節點集區,並啟用該集區以搭配使用 MetalLB。MetalLB 會部署在這個節點集區的節點上。

在使用者叢集設定檔中,選擇節點集區,並將 enableLoadBalancer 設為 true

nodePools:
- name: pool-1
  replicas: 3
  enableLoadBalancer: true

更新叢集:

gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG

更改下列內容:

  • ADMIN_CLUSTER_KUBECONFIG:管理員叢集 kubeconfig 檔案的路徑

  • USER_CLUSTER_CONFIG:使用者叢集設定檔的路徑

接著,從檔案中移除 Seesaw 區段,並新增 MetalLB 區段。

然後再次更新叢集:

gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG

確認 MetalLB 元件是否順利執行:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get pods \
    --namespace kube-system --selector app=metallb

輸出內容會顯示 MetalLB 控制器和揚聲器的 Pod。例如:

metallb-controller-744884bf7b-rznr9   1/1     Running
metallb-speaker-6n8ws                 1/1     Running
metallb-speaker-nb52z                 1/1     Running
metallb-speaker-rq4pp                 1/1     Running

遷移作業完成後,請手動刪除使用者叢集的 Seesaw VM (已關閉電源)。您可以在設定目錄的 seesaw-for-[USERCLUSTERNAME].yaml 檔案中,找到 Seesaw VM 名稱的 vmnames 區段。

範例:使用者叢集、靜態 IP 位址

假設您有一個使用者叢集,其叢集節點使用靜態 IP 位址。假設叢集有兩個 LoadBalancer 類型的服務,且這些服務的外部位址為 172.16.21.41 和 172.16.21.45。

按照下列方式調整使用者叢集設定檔:

  • 保留 network.hostConfig 部分。
  • loadBalancer.kind 設為 MetalLB
  • 移除「loadBalancer.seesaw」部分。
  • 新增 loadBalancer.metalLB 區段。

範例:

network:
  hostConfig:
    dnsServers:
    - "172.16.255.1"
    - "172.16.255.2"
    ntpServers:
    - "216.239.35.0"
loadBalancer:
  vips:
    controlPlaneVIP: "172.16.20.30"
    ingressVIP: "172.16.20.31"
  kind: MetalLB Seesaw
  seesaw:
    ipBlockFilePath: "user-cluster-1-ipblock.yaml"
    vrid: 1
    masterIP: ""
    cpus: 4
    memoryMB: 3072
  metalLB:
    addressPools:
    - name: "address-pool-1"
      addresses:
      - "172.16.20.31/32"
      - "172.16.20.40 - 172.16.21.49"
  

上述範例的重點如下:

  • 即使叢集不再使用 Seesaw 負載平衡器,仍需要 network.hostConfig 區段,因為叢集節點會使用靜態 IP 位址。

  • ingressVIP 值會顯示在 MetalLB 位址集區中。

  • 現有 LoadBalancer 類型服務的外部 IP 位址 172.16.21.41 和 172.16.21.45 包含在 MetalLB 位址集區中。

範例:kubeception 使用者叢集、DHCP

假設您有一個使用者叢集,其叢集節點使用 DHCP。假設叢集有兩個 LoadBalancer 類型的服務,這些服務的外部位址分別是 172.16.21.61 和 172.16.21.65。

按照下列方式調整使用者叢集設定檔:

  • 移除「network.hostConfig」部分。
  • loadBalancer.kind 設為 MetalLB
  • 移除「loadBalancer.seesaw」部分。
  • 新增 loadBalancer.metalLB 區段。

範例:

enableControlplaneV2: false
network:
  hostConfig:
    dnsServers:
    - "172.16.255.1"
    - "172.16.255.2"
    ntpServers:
    - "216.239.35.0"
loadBalancer:
  vips:
    controlPlaneVIP: "172.16.20.50"
    ingressVIP: "172.16.20.51"
  kind: MetalLB Seesaw
  seesaw:
    ipBlockFilePath: "user-cluster-2-ipblock.yaml"
    vrid: 1
    masterIP: ""
    cpus: 4
    memoryMB: 3072
  metalLB:
    addressPools:
    - name: "address-pool-1"
      addresses:
      - "172.16.20.51/32"
      - "172.16.20.60 - 172.16.21.69"
  

上述範例的重點如下:

  • 叢集將不再使用 Seesaw 負載平衡器,且叢集節點不會使用靜態 IP 位址。因此不需要 network.hostConfig 區段。

  • ingressVIP 值會顯示在 MetalLB 位址集區中。

  • 現有 LoadBalancer 類型服務的外部 IP 位址 172.16.21.61 和 172.16.21.65 包含在 MetalLB 位址集區中。

範例:Controlplane V2 使用者叢集、DHCP

假設您有一個已啟用 Controlplane V2 的使用者叢集,並使用 DHCP 做為工作站節點。假設叢集有兩個 LoadBalancer 類型的 Service,且這些 Service 的外部位址為 172.16.21.81 和 172.16.21.85。

按照下列方式調整使用者叢集設定檔:

  • 保留 network.hostconfig 部分。
  • loadBalancer.kind 設為 MetalLB
  • 移除「loadBalancer.seesaw」部分。
  • 新增 loadBalancer.metalLB 區段。

範例:

enableControlplaneV2: true
network:
  hostConfig:
    dnsServers:
    - "172.16.255.1"
    - "172.16.255.2"
    ntpServers:
    - "216.239.35.0"
loadBalancer:
  vips:
    controlPlaneVIP: "172.16.20.70"
    ingressVIP: "172.16.20.71"
  kind: MetalLB Seesaw
  seesaw:
    ipBlockFilePath: "user-cluster-2-ipblock.yaml"
    vrid: 1
    masterIP: ""
    cpus: 4
    memoryMB: 3072
  metalLB:
    addressPools:
    - name: "address-pool-1"
      addresses:
      - "172.16.20.71/32"
      - "172.16.20.80 - 172.16.21.89"
  

上述範例的重點如下:

  • 叢集將不再為工作站節點使用靜態 IP 位址,但會為控制層節點使用靜態 IP 位址。因此需要 network.hostConfig 區段。

  • ingressVIP 值會顯示在 MetalLB 位址集區中。

  • 現有 LoadBalancer 類型服務的外部 IP 位址 172.16.21.81 和 172.16.21.85 包含在 MetalLB 位址集區中。

遷移管理員叢集

在管理員叢集設定檔中,將 loadBalancer.kind 設為 MetalLB,並移除 loadBalancer.seesaw 區段。

更新叢集:

gkectl update admin --kubeconfig  ADMIN_CLUSTER_KUBECONFIG --config ADMIN_CLUSTER_CONFIG

更改下列內容:

  • ADMIN_CLUSTER_KUBECONFIG:管理員叢集 kubeconfig 檔案的路徑

  • ADMIN_CLUSTER_CONFIG:管理員叢集設定檔的路徑

確認 MetalLB 元件是否順利執行:

kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get pods \
    --namespace kube-system --selector app=metallb

輸出內容會顯示 MetalLB 控制器和揚聲器的 Pod。例如:

metallb-controller-744884bf7b-rznr9   1/1     Running
metallb-speaker-6n8ws                 1/1     Running
metallb-speaker-nb52z                 1/1     Running
metallb-speaker-rq4pp                 1/1     Running

遷移成功後,請手動刪除管理員叢集的 Seesaw VM (已關閉電源)。您可以在設定目錄的 seesaw-for-gke-admin.yaml 檔案中,找到 Seesaw VM 名稱的 vmnames 區段。

範例:管理員叢集、靜態 IP 位址

假設您有一個管理員叢集,其叢集節點使用靜態 IP 位址。

按照下列方式調整管理員叢集設定檔:

  • 保留 network.hostConfig 部分。
  • loadBalancer.kind 設為 MetalLB
  • 移除「loadBalancer.seesaw」部分。

範例:

network:
  hostConfig:
    dnsServers:
    - "172.16.255.1"
    - "172.16.255.2"
    ntpServers:
    - "216.239.35.0"
loadBalancer:
  vips:
    controlPlaneVIP: "172.16.20.30"
  kind: MetalLB Seesaw
  seesaw:
    ipBlockFilePath: "user-cluster-1-ipblock.yaml"
    vrid: 1
    masterIP: ""
    cpus: 4
    memoryMB: 3072
  

上述範例的重點:

  • 即使叢集不再使用 Seesaw 負載平衡器,仍需要 network.hostConfig 區段,因為叢集節點會使用靜態 IP 位址。

範例:管理員叢集、DHCP

假設您有一個管理員叢集,其叢集節點使用 DHCP。

按照下列方式調整管理員叢集設定檔:

  • 移除「network.hostConfig」部分。
  • loadBalancer.kind 設為 MetalLB
  • 移除「loadBalancer.seesaw」部分。

範例:

network:
  hostConfig:
    dnsServers:
    - "172.16.255.1"
    - "172.16.255.2"
    ntpServers:
    - "216.239.35.0"
loadBalancer:
  vips:
    controlPlaneVIP: "172.16.20.30"
  kind: MetalLB Seesaw
  seesaw:
    ipBlockFilePath: "user-cluster-1-ipblock.yaml"
    vrid: 1
    masterIP: ""
    cpus: 4
    memoryMB: 3072
  

上述範例的重點:

  • 叢集將不再使用 Seesaw 負載平衡器,且叢集節點不會使用靜態 IP 位址。因此不需要 network.hostConfig 區段。

疑難排解

如果在使用者叢集遷移期間 gkectl update 失敗,且 MetalLB Pod 未在使用者叢集中執行,請手動啟動使用者叢集 Seesaw VM。這會重新建立目前所用 VIP 的流量。但如果 load-balancer-seesaw Pod 未執行,Seesaw VM 可能無法為新建立的 VIP 提供服務。如果發生這種情況,請建立支援單。

如果管理員叢集遷移作業期間 gkectl update 失敗,且管理員叢集未執行 MetalLB Pod,請手動啟動管理員叢集 Seesaw VM。這或許能讓使用者叢集目前使用的控制層虛擬 IP 再次運作。但管理員叢集控制層的 VIP 本身可能無法運作。在這種情況下,請編輯管理員叢集的 kubeconfig 檔案,直接使用管理員叢集控制層節點的 IP 位址。

此外,在 kube-system 命名空間中,將 kube-apiserver 服務類型從 ClusterIP 變更為 LoadBalancer。如有需要,請建立支援單。