从 Seesaw 负载均衡器迁移到 MetalLB

本文档介绍如何从 Seesaw 负载均衡器迁移到 1.16 到 1.29 版的 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 管理员集群。

  • 迁移管理员集群时:

    • 在迁移 controlPlaneVIP 时,kubeception 用户集群的控制平面会出现停机时间。停机时间应少于 10 分钟,但具体时长取决于您的基础设施。

    • 管理员集群控制平面会出现停机时间,因为管理员主节点需要使用直接附加到虚拟机的 controlPlaneVIP 重新创建。停机时间应少于 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 controller 和 speaker 的 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 虚拟机。您可以在配置目录的 seesaw-for-[USERCLUSTERNAME].yaml 文件的 vmnames 部分中找到 Seesaw 虚拟机名称。

示例:用户集群,静态 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 类型的服务,并且这些服务的外部地址分别为 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 controller 和 speaker 的 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 虚拟机。您可以在配置目录的 seesaw-for-gke-admin.yaml 文件的 vmnames 部分中找到 Seesaw 虚拟机名称。

示例:管理员集群,静态 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 虚拟机开机。这会将流量重新传输到当前使用的 VIP 地址。但是,如果 load-balancer-seesaw Pod 未运行,Seesaw 虚拟机可能无法为新创建的 VIP 提供服务。如果发生这种情况,请创建支持服务工单。

如果 gkectl update 在管理员集群迁移期间失败,并且 MetalLB Pod 未在管理员集群中运行,请手动为管理员集群 Seesaw 虚拟机开机。这可能允许流量传输到当前使用的控制平面 VIP 地址,以便用户集群再次运行。但是,管理员集群本身的控制平面的 VIP 地址可能无法运行。在这种情况下,请修改管理员集群的 kubeconfig 文件,以直接使用管理员集群控制平面节点的 IP 地址。

此外,在 kube-system 命名空间中,将 kube-apiserver 服务类型从 ClusterIP 更改为 LoadBalancer。如有必要,请创建支持服务工单。