迁移集成式 F5 BIG-IP 的配置

本文档介绍如何将 F5 BIG-IP 集成负载均衡器的配置设置迁移到手动负载均衡模式。

对 F5 BIG-IP 负载均衡器的支持

过去,您可以将 Google Distributed Cloud 配置为通过以下方式与 F5 BIG-IP 集成:当开发者创建 LoadBalancer 类型的 Service 并为其指定虚拟 IP 地址 (VIP) 时,Google Distributed Cloud 会自动在负载均衡器上配置 VIP。

如需启用新的和高级功能(例如控制平面 V2),我们建议您更新配置。您可以继续使用 F5 BIG-IP 负载平衡器,但需要更改集群配置文件中的设置,才能使用手动负载均衡

迁移后,您的 F5 工作负载会保留,但 Google Distributed Cloud 将不再管理这些工作负载。在未来版本中,F5 BIG-IP 将仅可用于手动管理。这意味着您将负责直接管理 F5 BIG-IP 工作负载。

使用要求

以下是迁移的要求:

  • 管理员集群和所有用户集群都必须为 1.29 或更高版本。

  • 您必须为管理员集群节点和用户集群节点使用静态 IP 地址。IP 地址类型在 network.ipMode.type 字段中设置,不可变。如果此字段设置为 DHCP,则无法迁移集群。

更新用户集群配置文件

对用户集群配置文件进行以下更改:

  1. loadBalancer.kind 更改为 "ManualLB"

  2. loadBalancer.vips.controlPlaneVIPloadBalancer.vips.ingressVIP 字段保留相同的值。

  3. 配置 nodePort,以用于发送到入站流量 VIP 的 HTTP 流量。

    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. 配置用于发送到入站流量 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 替换为 admin 集群 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 部分。

  8. 运行 gkectl diagnose cluster,然后修复该命令发现的任何问题。

    gkectl diagnose cluster \
        --kubeconfig=ADMIN_CLUSTER_KUBECONFIG \
        --cluster-name=USER_CLUSTER_NAME

更新用户集群:

运行以下命令以迁移集群:

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,则管理员集群为非高可用性集群。

  4. 请仅对非高可用性管理员集群执行以下步骤:

    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 部分。

  7. 运行 gkectl diagnose cluster,然后修复该命令发现的任何问题。

    gkectl diagnose cluster \
        --kubeconfig=ADMIN_CLUSTER_KUBECONFIG

更新管理员集群:

运行以下命令以更新集群:

gkectl update cluster \
    --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)

您应该为管理员集群中的所有节点(包括控制平面节点和插件节点)设置此映射。

插件节点中服务的流量

对于在插件节点中运行的服务的 IP 地址和 nodePort 值,如果管理员集群具有 addonsNodePort 值,您应该具有以下映射:

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

您应该为管理员集群中的所有节点(包括控制平面节点和插件节点)设置此映射。

用户集群

控制平面流量

下面显示了控制平面流量的 IP 地址和 nodePort 值的映射:

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

您应该为admin集群中的所有节点(包括管理员集群和用户集群控制平面节点)设置此映射。

数据平面流量

下面显示了数据平面流量的 IP 地址和 nodePort 值的映射:

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