使用 Seesaw 进行捆绑式负载平衡

GKE On-Prem 可在以下三种负载平衡模式之一中运行:集成手动或捆绑式。本主题介绍如何将 GKE On-Prem 配置为在捆绑式负载平衡模式下运行。

在捆绑式负载平衡模式下,GKE On-Prem 提供并管理负载平衡器。您无需获得负载平衡器许可,并且只需执行最基本的设置步骤。

GKE On-Prem 提供的捆绑式负载平衡器为 Seesaw 负载平衡器

捆绑式负载平衡模式的优势

与手动负载平衡模式相比,捆绑式负载平衡模式具有以下优势:

  • 单个团队可同时负责集群创建和负载平衡器配置。例如,集群管理团队无需依赖独立的网络团队来提前获取、运行和配置负载平衡器。

  • GKE On-Prem 会自动在负载平衡器上配置虚拟 IP 地址(VIP 地址)。创建集群时,GKE On-Prem 会为负载平衡器配置 Kubernetes API 服务器、入站服务和集群插件的 VIP 地址。当客户端创建 LoadBalancer 类型的 Service 时,GKE On-Prem 会自动在负载平衡器上配置 Service VIP 地址。

  • 降低了组织、群组和管理员之间的依赖性。具体来说,管理集群的群组对管理网络的群组的依懒性更低。

我们强烈建议您针对捆绑式负载平衡模式使用 vSphere 6.7 和 Virtual Distributed Switch (VDS) 6.6。

如果您愿意,可以使用早期版本,但安装的安全性会降低。本主题的其余部分更详细地介绍了使用 vSphere 6.7 和 VDS 6.6 的安全优势。

规划您的 VLAN

一个 GKE On-Prem 安装具有一个管理员集群和一个或多个用户集群。使用捆绑式负载平衡模式时,我们强烈建议您将集群置于不同的 VLAN 上。尤为重要的是,您的管理员集群位于自己的 VLAN 上。

预留虚拟 IP 地址

无论您选择哪种负载平衡模式,都必须预留一些虚拟 IP 地址(VIP 地址)以用于负载平衡。这些 VIP 地址允许外部客户端访问您的 Kubernetes API 服务器、入站服务和插件服务。

您必须为管理员集群预留一组 VIP 地址,并且为要创建的每个用户集群预留一组 VIP 地址。对于给定的集群,这些 VIP 地址必须与集群节点和该集群的 Seesaw 虚拟机位于同一 VLAN。

如需了解如何预留 VIP 地址,请参阅预留虚拟 IP 地址

预留节点 IP 地址

使用捆绑式负载平衡模式时,您可以为集群节点指定静态 IP 地址,也可以让集群节点从 DHCP 服务器获取其 IP 地址。

如果您希望集群节点具有静态 IP 地址,请为管理员集群中的节点预留足够的地址,并为您要创建的所有用户集群中的节点预留足够的地址。如需详细了解预留节点 IP 地址的数量,请参阅配置静态 IP 地址

为 Seesaw 虚拟机预留 VIP 和 IP 地址

接下来,为将运行 Seesaw 负载平衡器的虚拟机预留 IP 地址和 VIP。

您预留的地址数量取决于要创建高可用性 (HA) Seesaw 负载平衡器还是非 HA Seesaw 负载平衡器。

案例 1:HA Seesaw 负载平衡器

对于您的管理员集群,请为一对 Seesaw 虚拟机预留两个 IP 地址。另外,对于您的管理员集群,还要为这对 Seesaw 虚拟机预留一个 VIP。所有这三个地址都必须与管理员集群节点位于同一 VLAN。

对于要创建的每个用户集群,请为一对 Seesaw 虚拟机预留两个 IP 地址。此外,对于每个用户集群,还要为这对 Seesaw 虚拟机预留一个 VIP。对于给定的用户集群,所有这三个地址都必须与用户集群节点位于同一 VLAN。

案例 2:非 HA Seesaw 负载平衡器

对于您的管理员集群,请预留一个 IP 地址用于 Seesaw 虚拟机。此外,对于您的管理员集群,请另外为该 Seesaw 负载平衡器预留一个 VIP。这两个地址都必须与管理员集群节点位于同一 VLAN。

对于要创建的每个用户集群,请为一个 Seesaw 虚拟机预留一个 IP 地址。此外,对于每个用户集群,请为 Seesaw 负载平衡器预留一个 VIP。这两个地址都必须与用户集群节点位于同一 VLAN。

规划您的端口组

您的每个 Seesaw 虚拟机都有两个网络接口。其中一个网络接口配置 Seesaw 负载平衡器的 VIP。另一个网络接口配置了虚拟机本身的 IP 地址。

对于单个 Seesaw 虚拟机,这两个网络接口可以连接到同一 vSphere 端口组,也可以连接到单独的端口组。如果端口组不同,则必须位于同一 VLAN。

本主题涉及两个端口组:

  • 负载平衡器端口组:对于 Seesaw 虚拟机而言,配置了 Seesaw 负载平衡器 VIP 的网络接口会连接到此端口组。

  • 集群节点端口组:对于 Seesaw 虚拟机,配置了虚拟机本身的 IP 地址的网络接口会连接到此端口组。您的 GKE On-Prem 集群节点也会连接到此端口组。

负载平衡器端口组和容器节点端口组可以是同一个端口组。但我们强烈建议您将两者分开。

创建 hostconfig 文件

对于您要创建的每个集群,请在 hostconfig 文件中为 Seesaw 虚拟机指定地址。此 hostconfig 文件用于负载平衡器虚拟机,而非集群节点。如果您打算为集群节点使用静态 IP 地址,则必须为这些地址创建单独的 hostconfig 文件。以下是一个 hostconfig 文件示例,该文件为 Seesaw 虚拟机指定了两个 IP 地址:

hostconfig:
  dns: "172.16.255.1"
  tod: "192.138.210.214"
  otherdns:
  - "8.8.8.8"
  - "8.8.4.4"
  othertod:
  - "ntp.ubuntu.com"
  searchdomainsfordns:
  - "my.local.com"
blocks:
  - netmask: "255.255.252.0"
    gateway: "110.116.232.1"
    ips:
    - ip: "172.16.20.18"
      hostname: "seesaw-1"
    - ip: "172.16.20.19"
      hostname: "seesaw-2"

填写 GKE On-Prem 配置文件

在创建集群之前,请准备 GKE On-Prem 配置文件

在配置文件中,将 lbmode 设置为 "Bundled"

配置文件可以包含单个集群的规范,也可以包含多个集群的规范。对于配置文件中的每个集群,请填写 loadbalancerconfig 部分。

loadbalancerconfig:
  ipblockfilepath:
  vrid:
  vip:
  cpus:
  memorymb:
  enableha:
  antiaffinitygroups:
    enabled:
  network:

loadbalancerconfig.ipblockfilepath

loadbalancerconfig.ipfileblockpath 设置为您的负载平衡器的 hostconfig 文件的路径。例如:

ipblockfilepath: "config-file-directory/my-user-hostconfig.yaml"

loadbalancerconfig.vrid

loadbalancerconfig.vrid 设置为 Seesaw 群组的虚拟路由器标识符。此标识符在 VLAN 中必须具有唯一性。有效范围为 1-255。例如:

vrid: 125

loadbalancerconfig.vip

loadbalancerconfig.vip 设置为 Seesaw 群组的 VIP。例如:

vip: "172.16.20.21"

loadbalancerconfig.cpus

loadbalancerconfig.cpus 设置为 Seesaw 虚拟机的 CPU 数。例如:

cpus: 4

loadbalancerconfig.memorymb

loadbalancerconfig.memorymb 设置为每个 Seesaw 虚拟机内存的兆字节 (MB) 数。例如:

memorymb: 3072

loadbalancerconfig.antiaffinitygroups.enabled

如果您想将反亲和性规则应用于 Seesaw 虚拟机,请将 loadbalancerconfig.antiaffinitygroups.enabled 的值设置为 true。否则,请将该值设置为 false。默认值为 true。推荐值为 true,以便将 Seesaw 虚拟机尽可能放置在不同的物理主机上。例如:

antiaffinitygroups:
  enabled: true

loadbalancerconfig.enableha

如果您想使用 HA Seesaw 负载平衡器,请将 loadbalancerconfig.enableha 的值设置为 true。否则,请将该值设置为 false。默认值为 false

enableha: true

如果您将 enableha 设置为 true,则必须启用 MAC 学习

loadbalancerconfig.network

loadbalancerconfig.network 设置为您的负载平衡器端口组的名称。如果将该字段留空,则对于每个 Seesaw 虚拟机来说,配置了 Seesaw 负载平衡器 VIP 的网络接口将会连接到集群节点端口组

例如:

network: "USER_SEESAW_VIP_PORT_GROUP"

GKE On-Prem 配置文件中的示例

以下示例显示了 GKE On-Prem 配置文件的一部分。该配置文件描述了两个集群:一个管理员集群和一个用户集群。每个集群都有一个 loadbalancerconfig 部分:

lbmode: "Bundled"
...

admincluster:
  loadbalancerconfig:
    ipblockfilepath: "admin-hostconfig.yaml"
    vrid: 124
    vip: 172.16.20.20
    cpus: 2
    memorymb: 3072
    enableha: true
    antiaffinitygroups:
      enabled: true
    network: "ADMIN_LOAD_BALANCER_PORT_GROUP"
...

usercluster:
  loadbalancerconfig:
    ipblockfilepath: "user-hostconfig.yaml"
    vrid: 125
    vip: 172.16.20.21
    cpus: 4
    memorymb: 3072
    enableha: true
    antiaffinitygroups:
      enabled: true
    network: "USER_LOAD_BALANCER_PORT_GROUP"

启用 MAC 学习或混杂模式(仅限高可用性)

如果您正在设置非 HA Seesaw 负载平衡器,则可以跳过此部分。

如果您正在设置 HA Seesaw 负载平衡器,则必须对负载平衡器端口组启用 MAC 学习、模拟传输和混杂模式的某种组合。

启用这些功能的方式取决于您使用的交换机类型:

交换机类型启用功能安全影响
带有 VDS 6.6 的 vSphere 6.7

为负载平衡器启用 MAC 学习和模拟传输的方式是运行以下命令:gkectl prepare network --config [CONFIG_FILE],其中 [CONFIG_FILE] 是 GKE On-Prem 配置文件的路径。您需要 dvPort group.Modify 权限才能执行此操作。

轻微。如果您的负载平衡器端口组仅连接到 Seesaw 虚拟机,那么可以将 MAC 学习限定为可信的 Seesaw 虚拟机。

vSphere 6.5 或

vSphere 6.7,带有低于 6.6 的 VDS 版本

为您的负载平衡器端口组启用混杂模式和模拟传输。在网络标签页中的端口组页面上使用 vSphere 界面:修改设置 -> 安全 您的负载平衡器端口组上的所有虚拟机都处于混杂模式。因此,负载平衡器端口组上的任何虚拟机都可以看到所有流量。如果负载平衡器端口组仅连接到 Seesaw 虚拟机,那么只有这些虚拟机才能看到所有流量。
NSX-T 逻辑交换机 在逻辑交换机上启用 MAC 学习 vSphere 不支持在同一个第 2 层网域中创建两个逻辑交换机。因此,Seesaw 虚拟机和集群节点必须位于同一逻辑交换机上。这意味着对所有集群节点启用 MAC 学习。攻击者可能能够通过在集群中运行具有特权的 pod 来实现 MAC 仿冒。
vSphere 标准交换机 为您的负载平衡器端口组启用混杂模式和模拟传输。在每个 ESXI 主机上使用 vSphere 界面:配置 -> 虚拟交换机 -> 标准交换机 -> 在端口组上修改设置 -> 安全 您的负载平衡器端口组上的所有虚拟机都处于混杂模式。因此,负载平衡器端口组上的任何虚拟机都可以看到所有流量。如果负载平衡器端口组仅连接到 Seesaw 虚拟机,那么只有这些虚拟机才能看到所有流量。

对配置文件运行预检检查

创建 hostconfig 文件和 GKE On-Prem 配置文件后,请对配置文件运行预检检查

gkectl check-config --config [CONFIG_FILE]

其中,[CONFIG_FILE] 是 GKE On-Prem 配置文件的路径。

如果您已拥有管理员集群,并且配置文件仅包含 usercluster 规范,则需要在命令中添加管理员集群的 kubeconfig 文件:

gkectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] check-config --config [CONFIG_FILE]

其中,[ADMIN_CLUSTER_KUBECONFIG] 是管理员集群的 kubeconfig 文件的路径。

如果预检检查失败,请根据需要对 GKE On-Prem 配置文件和 hostconfig 文件进行调整。然后再次运行预检检查。

上传操作系统映像

运行以下命令将操作系统映像上传到您的 vSphere 环境:

gkectl prepare --config [CONFIG_FILE]

其中,[CONFIG_FILE] 是 GKE On-Prem 配置文件的路径。

创建负载平衡器

为负载平衡器创建和配置虚拟机:

gkectl create loadbalancer --config [CONFIG_FILE]

其中,[CONFIG_FILE] 是 GKE On-Prem 配置文件的路径。

创建使用捆绑式负载平衡模式的集群

创建集群。

gkectl create cluster --config [CONFIG_FILE]

其中,[CONFIG_FILE] 是 GKE On-Prem 配置文件的路径。

如果您已拥有管理员集群,并且配置文件仅包含 usercluster 规范,则需要在命令中添加管理员集群的 kubeconfig 文件:

gkectl --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] check-config --config [CONFIG_FILE]

其中,[ADMIN_CLUSTER_KUBECONFIG] 是管理员集群的 kubeconfig 文件的路径。

性能和负载测试

应用的下载吞吐量与后端数量呈线性比例关系。这是因为后端绕过负载平衡器,而使用直接服务器返回功能直接将响应发送给客户端。

相反,应用的上传吞吐量受限于执行负载平衡的 Seesaw 虚拟机的容量。

应用所需的 CPU 和内存量不尽相同,因此在开始为大量客户端提供服务之前,请务必进行负载测试。

测试表明,通过 10000 个并发 TCP 连接,一个配备有 8 个 CPU 和 8 GB 内存的 Seesaw 虚拟机可以处理 10 GB/秒(线路速率)的上传流量。但是,如果您计划支持大量的并发 TCP 连接,请务必运行您自己的负载测试。

扩缩限制

使用捆绑式负载平衡时,集群可以扩缩的程度存在限制。集群中的节点数量存在限制,并且负载平衡器上可配置的 Service 数量存在限制。健康检查也存在限制。健康检查的数量取决于节点数量和 Service 数量。

从 1.3.1 版开始,健康检查的数量取决于节点数量和本地流量 Service 的数量。本地流量 Service 是 externalTrafficPolicy 设置为 "Local" 的 Service。

1.3.0 版1.3.1 版和更高版本
最大 Service 数 (S)100500
最大节点数 (N)100100
最大健康检查数S * N <= 10000N + L * N <= 10000,其中 L 是本地流量 Service 的数量

示例:在 1.3.1 版中,假设您有 100 个节点和 99 个本地流量 Service。则健康检查数为 100 + 99 * 100 = 10000,不超过 10000 的限制。

为管理员集群升级负载平衡器

从 v1.4 开始,负载平衡器会随着集群升级而升级。您无需单独运行其他任何命令来升级负载平衡器。但您仍然可以使用下面的 gkectl upgrade loadbalancer 来更新某些参数。

如需单独升级/更新负载平衡器,请使用您要用来升级集群的同一配置文件。

在配置文件中,更新 bundlepath 字段,并确认 lbmode 设置为 "Bundled"

如果您要更改 Seesaw 虚拟机的 CPU 和内存,请提供 cpusmemorymb 的值。否则,请将这些字段留空。

例如:

lbmode: "Bundled"
bundlepath: "/var/lib/gke/bundles/gke-onprem-vsphere-1.3.2-gke.1-full.tgz"
admincluster:
  loadbalancerconfig:
    cpus: 6
    memorymb: 4096

然后运行此命令以升级负载平衡器:

gkectl upgrade loadbalancer --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] --config [CLUSTER_CONFIG] --name gke-admin

其中:

  • [ADMIN_CLUSTER_KUBECONFIG] 是管理员集群的 kubeconfig 文件。

  • [CLUSTER_CONFIG] 是您要升级的集群的配置文件。

在负载平衡器升级期间,会有一些停机时间。如果为负载平衡器启用了 HA,则最长停机时间为两秒。

为用户集群升级负载平衡器

从 v1.4 开始,负载平衡器会随着集群升级而升级。您无需单独运行其他任何命令来升级负载平衡器。但您仍然可以使用下面的 gkectl upgrade loadbalancer 来更新某些参数。

如需单独升级/更新用户集群的负载平衡器,请按照升级管理员集群的负载平衡器的步骤操作,但进行如下两项更改:

  • 在配置文件中,确认 usercluster.clustername 设置为您要更新的集群的名称。例如:

    lbmode: "Bundled"
    bundlepath: "/var/lib/gke/bundles/gke-onprem-vsphere-1.3.2-gke.1-full.tgz"
    usercluster:
      clustername: "my-cluster"
      loadbalancerconfig:
        cpus: 6
        memorymb: 4096
    
  • gkectl upgrade loadbalancer 命令中,将 --name 设置为用户集群的名称。

查看 Seesaw 日志

Seesaw 捆绑式负载平衡器将日志文件存储在 /var/log/seesaw/ 中的 Seesaw 虚拟机上。最重要的日志文件是 seesaw_engine.INFO

查看 Seesaw 虚拟机的相关信息

您可以从 SeesawGroup 自定义资源中获取集群的 Seesaw 虚拟机的相关信息。

查看集群的 SeesawGroup 自定义资源:

kubectl --kubeconfig [CLUSTER_KUBECONFIG] get seesawgroups -n kube-system -o yaml

其中,[CLUSTER_KUBECONFIG] 是集群的 kubeconfig 文件的路径。

输出具有 isReady 字段,该字段显示虚拟机是否已准备好处理流量。输出结果还会显示 Seesaw 虚拟机的名称和 IP 地址,以及哪个虚拟机是控制层面:

apiVersion: seesaw.gke.io/v1alpha1
kind: SeesawGroup
metadata:
  ...
  name: seesaw-for-cluster-1
  namespace: kube-system
  ...
spec: {}
status:
  machines:
  - hostname: cluster-1-seesaw-1
    ip: 172.16.20.18
    isReady: true
    lastCheckTime: "2020-02-25T00:47:37Z"
    role: Master
  - hostname: cluster-1-seesaw-2
    ip: 172.16.20.19
    isReady: true
    lastCheckTime: "2020-02-25T00:47:37Z"
    role: Backup

查看 Seesaw 指标

Seesaw 捆绑式负载平衡器提供以下指标:

  • 每个 Service 或节点的吞吐量
  • 每个 Service 或节点的数据包速率
  • 每个 Service 或节点的有效连接数
  • CPU 和内存用量
  • 每个 Service 的后端 pod(运行状况良好)数量
  • 哪个虚拟机是控制层面,以及哪个是备用虚拟机
  • 正常运行时间

您可以选择使用任何支持 Prometheus 格式的监控和信息中心解决方案。一种可能的方案是使用与 GKE On-Prem 集成的 Prometheus 和 Grafana 插件。

使用集成的 Prometheus 和 Grafana 插件

为集群启用 Prometheus 和 Grafana

下一步是创建一个 Service 对象和一个 Endpoints 对象,以便 Prometheus 插件了解您的 Seesaw 虚拟机。

将以下配置保存为 seesaw-metrics.yaml。配置包括一个 Service 清单和一个 Endpoints 清单:

apiVersion: v1
kind: Service
metadata:
   name: seesaw-metrics
    annotations:
      monitoring.gke.io/scrape: 'true'
      monitoring.gke.io/scheme: 'https'
      monitoring.gke.io/tls_config: 'seesaw-ca'
spec:
    type: ClusterIP
    clusterIP: "None"
    ports:
    - name: metrics
      port: 20257
      protocol: TCP
      targetPort: 20257
---
kind: Endpoints
apiVersion: v1
metadata:
  name: seesaw-metrics
subsets:
 - addresses:
     - ip: [SEESAW_VM1_IP]
     - ip: [SEESAW_VM2_IP]
   ports:
     - name: metrics
       port: 20257

其中:

  • [SEESAW_VM1_IP] 是其中一个 Seesaw 虚拟机的 IP 地址。
  • [SEESAW_VM2_IP] 是另一个 Seesaw 虚拟机的 IP 地址。

创建 Service 和 Endpoints 对象:

kubectl --kubeconfig [CLUSTER_KUBECONFIG] apply seesaw-metrics.yaml

现在,您可以创建 Grafana 信息中心和图表来查看指标。

删除负载平衡器

如果您删除了使用捆绑式负载平衡的集群,则应删除该集群的 Seesaw 虚拟机。可以通过在 vSphere 界面中删除 Seesaw 虚拟机来执行此操作。

您也可以通过运行以下命令来删除 Seesaw 虚拟机和 Seesaw 群组文件:

gkectl delete loadbalance --config vsphere.yaml --seesaw-group-file [GROUP_FILE]

其中

  • [GROUP_FILE] 是 Seesaw 群组文件。群组文件位于管理员工作站,config.yaml 的旁边。群组文件的名称采用 seesaw-for-[CLUSTER_NAME]-[IDENTIFIER].yaml 形式。

  • vsphere.yaml 是一个文件,其中包含您的 vCenter 服务器的以下信息:

vcenter:
  credentials:
    address:
    username:
    password:
  datacenter:
  cacertpath:

问题排查

与 Seesaw 虚拟机建立 SSH 连接

有时,您可能希望通过 SSH 连接到 Seesaw 虚拟机进行问题排查或调试。

获取 SSH 密钥

如果您已创建集群,请按照以下步骤获取 SSH 密钥:

  1. 从集群中获取 seesaw-ssh Secret。从 Secret 中获取 SSH 密钥并对它进行 base64 解码。将解码的密钥保存在临时文件中:

    kubectl --kubeconfig [CLUSTER_KUBECONFIG] get -n  kube-system secret seesaw-ssh -o \
    jsonpath='{@.data.seesaw_ssh}' | base64 -d | base64 -d > /tmp/seesaw-ssh-key

    其中,[CLUSTER_KUBECONFIG] 是集群的 kubeconfig 文件。

  2. 为密钥文件设置适当的权限:

    chmod 0600 /tmp/seesaw-ssh-key

如果您尚未创建集群,请按照以下步骤获取 SSH 密钥:

  1. 找到名为 seesaw-for-[CLUSTER_NAME]-[IDENTIFIER].yaml 的文件。

    该文件称为群组文件,位于 config.yaml 旁边。

    此外,gkectl create loadbalancer 还会输出群组文件的位置。

  2. 在该文件中,获取 credentials.ssh.privateKey 的值,并对其进行 base64 解码。将解码的密钥保存在临时文件中:

    cat seesaw-for-[CLUSTER_NAME]-[IDENTIFIER].yaml  | grep privatekey | sed 's/    privatekey: //g' \
    | base64 -d > /tmp/seesaw-ssh-key
    
  3. 为密钥文件设置适当的权限:

    chmod 0600 /tmp/seesaw-ssh-key

现在,您可以通过 SSH 连接到 Seesaw 虚拟机:

ssh -i /tmp/seesaw-ssh-key ubuntu@[SEESAW_IP]

其中,[SEESAW_IP] 是 Seesaw 虚拟机的 IP 地址。

获取快照

您可以使用 gkectl diagnose snapshot 命令和 --scenario 标志来截取 Seesaw 虚拟机的快照。

如果您将 --scenario 设置为 allall-with-logs,则输出将包含 Seesaw 快照以及其他快照。

如果您将 --scenario 设置为 seesaw,则输出将仅包含 Seesaw 快照。

示例:

gkectl diagnose snapshot --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] --scenario seesaw

其中,[ADMIN_CLUSTER_KUBECONFIG] 是管理员集群的 kubeconfig 文件。

gkectl diagnose snapshot --kubeconfig [ADMIN_CLUSTER_KUBECONFIG] --cluster-name [CLUSTER_NAME] --scenario seesaw
gkectl diagnose snapshot --seesaw-group-file [GROUP_FILE] --scenario seesaw

其中,[GROUP_FILE] 是集群群组文件的路径,例如,seesaw-for-gke-admin-xxxxxx.yaml

已知问题

无法升级 v1.3.x 的负载平衡器

已知的情形是,如果对 Seesaw 负载平衡器停用了 antiaffinitygroups,则将负载平衡器从 v1.3.x 升级到 v1.3.x+ 会失败,并显示以下错误:

updated SeesawGroup is not valid: SeesawConfig is invalid: AntiAffinityGroups must be set to default value if user doesn't provide it.(更新后的 SeesawGroup 无效:SeesawConfig 无效:如果用户未提供 AntiAffinityGroups 的值,则必须将它设置为默认值。)

此问题已在 v1.4 中修复,因此您可以选择跳过 v1.3.x+,而直接升级到 v1.4。