遷移 F5 BIG-IP 負載平衡器的設定

1.29:預先發布版
1.28:不適用

本文說明如何將 F5 BIG-IP 負載平衡器整合的設定遷移至手動負載平衡模式,適用於 1.29 版的叢集。如果叢集版本為 1.30 以上,建議按照「規劃叢集遷移至建議功能」一文中的操作說明進行。

在手動負載平衡模式下使用 F5 BIG-IP,可彈性地獨立升級 F5 代理程式,不會影響 F5 負載平衡器或 Kubernetes 服務的功能。如果遷移至手動設定,您可以直接從 F5 取得更新,確保最佳效能和安全性。

在下列情況下,您必須進行這項遷移作業:

  • 您想啟用 Controlplane V2 等新功能,也需要存取 F5。

  • 您需要 BIG-IP CIS Container Ingress Services (CIS) 控制器 1.14 以上版本提供的功能。

如果上述情況不適用於您,可以繼續使用 F5 BIG-IP 負載平衡的隨附設定。

無論如何,我們仍會繼續正式支援 F5 做為負載平衡器解決方案。

支援 F5 BIG-IP 負載平衡器

我們支援搭配負載平衡器代理程式使用 F5 BIG-IP,這類代理程式包含下列兩個控制器:

  • F5 控制器 (Pod 前置字元:load-balancer-f5):將 LoadBalancer 類型的 Kubernetes 服務調解為 F5 Common Controller Core Library (CCCL) ConfigMap 格式。

  • F5 BIG-IP CIS 控制器 v1.14 (Pod 前置字元:k8s-bigip-ctlr-deployment):將 ConfigMap 轉換為 F5 負載平衡器設定。

這些代理程式可簡化 Kubernetes 叢集內 F5 負載平衡器的設定。建立 LoadBalancer 類型的 Service 時,控制器會自動設定 F5 負載平衡器,將流量導向叢集節點。

不過,這項套裝解決方案有下列限制:

  • Service API 的表達能力有限。您無法隨意設定 BIG-IP 控制器,也無法使用進階 F5 功能。F5 已提供更完善的 Service API 原生支援。

  • 實作方式會使用舊版 CCCL ConfigMap API 和 1.x CIS。不過,F5 現在提供較新的 AS3 ConfigMap API 和 2.x CIS

由於與 CIS v2.x 的 F5 升級指南有相容性問題,Google Distributed Cloud 套裝組合中的 CIS 控制器仍維持在 v1.14。因此,為了讓您彈性解決安全漏洞問題,並存取最新功能,我們將 F5 代理程式從隨附元件改為獨立安裝。遷移後,您可繼續使用現有代理程式,服務不會中斷,先前建立的服務也會繼續運作。

如果是以 F5 做為負載平衡解決方案,新建立的手動負載平衡叢集,您必須自行安裝控制器。同樣地,如果叢集已從隨附的 F5 遷移,且您想使用新版 CIS 控制器,則必須自行安裝控制器。

需求條件

以下是遷移作業的需求條件:

  • 管理員叢集和所有使用者叢集都必須是 1.29 以上版本。

  • 管理員和使用者叢集節點必須使用靜態 IP 位址。IP 位址類型是在 network.ipMode.type 欄位中設定,且無法變更。如果這個欄位設為 DHCP,就無法遷移叢集。

更新使用者叢集設定檔

對使用者叢集設定檔進行下列變更:

  1. loadBalancer.kind 變更為 "ManualLB"

  2. loadBalancer.vips.controlPlaneVIPloadBalancer.vips.ingressVIP 欄位的值必須相同。

  3. 設定用於傳送至 Ingress VIP 的 HTTP 流量的 nodePort

    1. 取得目前的 HTTP nodePort 值:

      kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \
          get svc istio-ingress -n gke-system -oyaml | grep http2 -A 1

      USER_CLUSTER_KUBECONFIG 替換為使用者叢集 kubeconfig 檔案的路徑。

    2. 將上一個指令中的值新增至 loadBalancer.manualLB.ingressHTTPNodePort 欄位,例如:

      loadBalancer:
        manualLB:
          ingressHTTPNodePort: 30243
  4. 設定用於傳送至 Ingress VIP 的 HTTPS 流量的 nodePort

    1. 取得目前的 HTTPS nodePort 值:

      kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \
          get svc istio-ingress -n gke-system -oyaml | grep https -A 1
    2. 將上一個指令中的值新增至 loadBalancer.manualLB.ingressHTTPSNodePort 欄位,例如:

      loadBalancer:
        manualLB:
          ingressHTTPSNodePort: 30879
  5. 設定 Kubernetes API 伺服器的 nodePort

    1. 取得 Kubernetes API 伺服器的目前 nodePort 值:

      kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
          get svc kube-apiserver -n USER_CLUSTER_NAME -oyaml | grep kube-apiserver-port -A 1

      更改下列內容:

      • ADMIN_CLUSTER_KUBECONFIG,並提供管理員叢集 kubeconfig 檔案的路徑。

      • USER_CLUSTER_NAME:使用者叢集的名稱。

    2. 將上一個指令中的值新增至 loadBalancer.manualLB.controlPlaneNodePort 欄位,例如:

      loadBalancer:
        manualLB:
          controlPlaneNodePort: 30968
  6. 設定 Konnectivity 伺服器的 nodePort

    1. 取得 Konnectivity 伺服器的目前 nodePort 值:

      kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
          get svc kube-apiserver -n USER_CLUSTER_NAME -oyaml | grep konnectivity-server-port -A 1
    2. 將上一個指令中的值新增至 loadBalancer.manualLB.konnectivityServerNodePort 欄位,例如:

      loadBalancer:
        manualLB:
          konnectivityServerNodePort: 30563
  7. 刪除整個 loadBalancer.f5BigIP 區段。

更新使用者叢集

執行下列指令來遷移叢集:

gkectl update cluster \
    --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
    --config USER_CLUSTER_CONFIG

更改下列內容:

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

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

更新管理員叢集設定檔

對管理員叢集設定檔進行下列變更:

  1. loadBalancer.kind 變更為 "ManualLB"

  2. 請保留 loadBalancer.vips.controlPlaneVIP 欄位的值。

  3. 檢查 adminMaster.replicas 欄位的值。如果值為 3,表示管理員叢集具有高可用性 (HA)。如果值為 1,管理員叢集就不是 HA。

  4. 請只針對非 HA 管理員叢集執行下列步驟:

    1. 取得 Kubernetes API 伺服器的 nodePort 值:

      kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
          get svc kube-apiserver -n kube-system -oyaml | grep nodePort

      ADMIN_CLUSTER_KUBECONFIG 替換為管理員叢集 kubeconfig 檔案的路徑。

    2. 將上一個指令中的值新增至 loadBalancer.manualLB.controlPlaneNodePort 欄位,例如:

      loadBalancer:
        manualLB:
          controlPlaneNodePort: 30968
  5. 執行下列指令,查看是否有外掛程式 nodePort

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
        get deploy monitoring-operator -n kube-system -oyaml | grep admin-ingress-nodeport

    如果先前的指令輸出值,請將該值新增至 loadBalancer.manualLB.addonsNodePort 欄位,例如:

    loadBalancer:
      manualLB:
        addonsNodePort: 31405
  6. 刪除整個 loadBalancer.f5BigIP 區段。

更新管理員叢集

執行下列指令來更新叢集:

gkectl update admin \
    --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
    --config ADMIN_CLUSTER_CONFIG

更改下列內容:

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

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

確認舊版 F5 資源是否仍存在

將叢集更新為使用手動負載平衡後,叢集的流量不會中斷,因為現有的 F5 資源仍存在,您可以執行下列指令查看:

kubectl --kubeconfig CLUSTER_KUBECONFIG \
  api-resources --verbs=list -o name   | xargs -n 1 kubectl --kubeconfig CLUSTER_KUBECONFIG get --show-kind --ignore-not-found --selector=onprem.cluster.gke.io/legacy-f5-resource=true -A

CLUSTER_KUBECONFIG 替換為管理員叢集或使用者叢集 kubeconfig 檔案的路徑。

預期輸出內容如下:

管理員叢集

Warning: v1 ComponentStatus is deprecated in v1.19+
NAMESPACE     NAME                        TYPE     DATA   AGE
kube-system   secret/bigip-login-xt697x   Opaque   4      13h
NAMESPACE     NAME                              SECRETS   AGE
kube-system   serviceaccount/bigip-ctlr         0         13h
kube-system   serviceaccount/load-balancer-f5   0         13h
NAMESPACE     NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
kube-system   deployment.apps/k8s-bigip-ctlr-deployment   1/1     1            1           13h
kube-system   deployment.apps/load-balancer-f5            1/1     1            1           13h
NAME                                                                                ROLE                                       AGE
clusterrolebinding.rbac.authorization.k8s.io/bigip-ctlr-clusterrole-binding         ClusterRole/bigip-ctlr-clusterrole         13h
clusterrolebinding.rbac.authorization.k8s.io/load-balancer-f5-clusterrole-binding   ClusterRole/load-balancer-f5-clusterrole   13h
NAME                                                                 CREATED AT
clusterrole.rbac.authorization.k8s.io/bigip-ctlr-clusterrole         2024-03-25T04:37:34Z
clusterrole.rbac.authorization.k8s.io/load-balancer-f5-clusterrole   2024-03-25T04:37:34Z

使用者叢集

Warning: v1 ComponentStatus is deprecated in v1.19+
NAMESPACE     NAME                        TYPE     DATA   AGE
kube-system   secret/bigip-login-sspwrd   Opaque   4      14h
NAMESPACE     NAME                              SECRETS   AGE
kube-system   serviceaccount/bigip-ctlr         0         14h
kube-system   serviceaccount/load-balancer-f5   0         14h
NAMESPACE     NAME                                        READY   UP-TO-DATE   AVAILABLE   AGE
kube-system   deployment.apps/k8s-bigip-ctlr-deployment   1/1     1            1           14h
kube-system   deployment.apps/load-balancer-f5            1/1     1            1           14h
NAME                                                                                ROLE                                       AGE
clusterrolebinding.rbac.authorization.k8s.io/bigip-ctlr-clusterrole-binding         ClusterRole/bigip-ctlr-clusterrole         14h
clusterrolebinding.rbac.authorization.k8s.io/load-balancer-f5-clusterrole-binding   ClusterRole/load-balancer-f5-clusterrole   14h
NAME                                                                 CREATED AT
clusterrole.rbac.authorization.k8s.io/bigip-ctlr-clusterrole         2024-03-25T05:16:40Z
clusterrole.rbac.authorization.k8s.io/load-balancer-f5-clusterrole   2024-03-25T05:16:41Z

檢查負載平衡器

遷移後,您應該不需要變更負載平衡器中的任何設定,因為您保留了相同的 VIP 和 nodePort 值。下表說明 VIP 與節點 IP 位址的對應關係:nodePort

高可用性管理員叢集

控制層節點的流量

Google Distributed Cloud 會自動處理高可用性管理員叢集的控制層流量負載平衡。雖然您不需要在負載平衡器中設定對應,但必須在 loadBalancer.vips.controlPlaneVIP 欄位中指定 IP 位址。

外掛程式節點中的服務流量

如果管理員叢集有 addonsNodePort 的值,您應該會看到對應至 IP 位址和 nodePort 的值,以便將流量導向附加節點中的服務:

  • (addonsVIP:8443) -> (NODE_IP_ADDRESSES:addonsNodePort)

管理員叢集中的所有節點 (包括控制層節點和附加元件節點) 都應有這個對應關係。

非高可用性管理員叢集

控制層流量

以下顯示控制層節點的 IP 位址和 nodePort 值對應:

  • (controlPlaneVIP:443) -> (NODE_IP_ADDRESSES:controlPlaneNodePort)

管理員叢集中的所有節點 (包括控制層節點和附加元件節點) 都應有這個對應關係。

外掛程式節點中的服務流量

如果管理員叢集有 addonsNodePort 的值,您應該會有下列對應項目,可對應至外掛程式節點中執行的服務 IP 位址和 nodePort 值:

  • (addonsVIP:8443) -> (NODE_IP_ADDRESSES:addonsNodePort)

管理員叢集中的所有節點 (包括控制層節點和附加元件節點) 都應有這個對應關係。

使用者叢集

控制層流量

下表顯示控制層流量的 IP 位址和 nodePort 值對應:

  • (controlPlaneVIP:443) -> (NODE_IP_ADDRESSES:controlPlaneNodePort)
  • (controlPlaneVIP:8132) -> (NODE_IP_ADDRESSES:konnectivityServerNodePort)

您應該為管理員叢集中的所有節點 (包括管理員叢集和使用者叢集控制層節點) 建立這個對應關係。

資料層流量

下表顯示資料層流量的 IP 位址和 nodePort 值對應:

  • (ingressVIP:80) -> (NODE_IP_ADDRESSES:ingressHTTPNodePort)
  • (ingressVIP:443) -> (NODE_IP_ADDRESSES:ingressHTTPSNodePort)