迁移 F5 BIG-IP 负载均衡器的配置设置

1.30:正式版
1.29:预览版
1.28:不可用

本文档介绍如何将 F5 BIG-IP 负载均衡器集成的配置设置迁移到手动负载均衡模式。在手动负载均衡模式下使用 F5 BIG-IP 可让您灵活地独立升级 F5 代理,而不会影响 F5 负载均衡器或 Kubernetes 服务的功能。如果您迁移到手动配置,则可以直接从 F5 获取更新,以确保最佳性能和安全性。

在以下情况下需要此迁移:

  • 您希望启用 Controlplane V2 等新功能,并且还需要 F5 的访问权限。

  • 您需要使用高于 v1.14 的 BIG-IP CIS Container Ingress Services (CIS) 控制器版本提供的功能。

如果上述情况不适用于您,您可以继续使用 F5 BIG-IP 负载均衡的捆绑配置。

无论如何,我们都将继续官方支持 F5 作为负载均衡器解决方案。

F5 BIG-IP 负载均衡器支持

我们支持将 F5 BIG-IP 与负载均衡器代理搭配使用,负载均衡器代理由以下两个控制器组成:

  • F5 控制器(pod 前缀:load-balancer-f5):将 LoadBalancer 类型的 Kubernetes Service 协调为 F5 Common Controller Core Library (CCCL) ConfigMap 格式。

  • F5 BIG-IP CIS Controller 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

HA 管理员集群

流向控制平面节点的流量

Google Distributed Cloud 会自动处理 HA 管理员集群的控制平面流量的负载均衡。虽然您不需要在负载均衡器中配置映射,但必须在 loadBalancer.vips.controlPlaneVIP 字段中指定 IP 地址。

流向插件节点中的服务的流量

如果您的管理员集群具有 addonsNodePort 值,您应该会看到与插件节点中服务流量的 IP 地址和 nodePort 值的映射:

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

您应该对管理员集群中的所有节点(控制平面节点和插件节点)具有此映射。

非 HA 管理员集群

控制平面流量

下面显示了到控制平面节点 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)