使用 Controlplane V2 创建用户集群

本文档介绍了如何创建启用了 Controlplane V2 的用户集群。

什么是 kubeception?

术语 kubeception 用于传达 Kubernetes 集群用于创建和管理其他 Kubernetes 集群的想法。在 GKE on VMware 环境中,kubeception 指的是用户集群的控制平面在管理员集群中的一个或多个节点上运行的情况。

使用 Controlplane V2 时,用户集群的控制平面在用户集群本身的一个或多个节点上运行。

Controlplane V2 的优势包括:

  • 管理员集群和用户集群之间的架构一致性

  • 故障隔离。管理员集群故障不会影响用户集群。

  • 运维分离。管理员集群升级不会导致用户集群停机。

  • 部署分离。您可以将管理员集群和用户集群放在不同的故障域或地理站点中。例如,边缘位置中的用户集群可能与管理员集群位于不同的地理站点。

准备工作

您必须拥有管理员集群,并且管理员集群版本必须为 1.13.0 或更高版本。

使用要求

启用了 Controlplane V2 的用户集群:

  • 必须使用捆绑式 MetalLB 负载均衡器
  • 必须启用 Dataplane V2

规划您的 IP 地址

在为用户集群规划 IP 地址时,请注意 Controlplane V2 的以下要求:

  • 用户集群的控制平面节点必须从您提供的静态地址列表中获取其 IP 地址。即使工作器节点从 DHCP 服务器获取其地址,情况也是如此。高可用性 (HA) 用户集群需要三个控制平面节点,但非 HA 用户集群只需要一个控制平面节点。

  • 用户集群控制平面节点与用户集群工作器节点必须位于同一 VLAN。这与 kubeception 模型形成对比。

  • 用户集群控制平面 VIP 地址必须与用户集群工作器节点和用户集群控制平面节点位于同一 VLAN。这与 kubeception 模型形成对比。

规划您的 vSphere 环境

管理员集群配置文件用户集群配置文件都具有 vCenter 部分,您可以在其中指定 vSphere 您希望管理员或用户集群使用的资源。

对于用户集群,您无需填写 vCenter 部分,因为默认情况下,用户集群使用与管理员集群相同的 vSphere 资源。但是,如果您希望您的用户集群使用不同于您为管理集群指定的 vSphere 资源,您可以在用户集群配置文件的 vCenter 部分填写您选择的字段。如需了解详情,请参阅设置 vSphere 对象层次结构

使用 Controlplane V2 时,用户集群的控制平面节点位于用户集群本身中。因此,控制平面节点使用用户集群配置文件中指定的 vSphere 资源。例如,假设您为管理员集群指定 datacenter-1,且为用户集群指定 datacenter-2。您的用户集群的控制平面节点将位于 datacenter-2

反亲和性群组

管理员集群配置文件用户集群配置文件都具有 antiAffinityGroups.enabled 字段,您可以将该字段设置为 truefalse

使用 Controlplane V2 时,用户集群的控制平面节点根据用户集群配置文件中的 antiAffinityGroups.enabled 值进行分布。

与 kubeception 模型相比,用户集群的控制平面节点根据管理员集群配置文件中的 antiAffinityGroups.enabled 值进行分配。

示例

下面我们给出了一个具有以下特征的用户集群示例:

  • 有三个工作器节点。

  • 工作器节点具有静态 IP 地址。

  • 有三个控制平面节点。也就是说,该集群是 HA 集群。

  • 负载均衡器是 MetalLB。

  • Dataplane V2 和 Controlplane V2 已启用。

  • 用户集群使用的 vSphere 资源与管理员集群相同。

下图展示了管理员集群和用户集群的网络:

管理员集群和用户集群
管理员集群和用户集群(点击可放大)

以下是一个 IP 地址块文件和一个用户集群配置文件一部分的示例。

user-ipblock.yaml

blocks:
  - netmask: 255.255.255.0
    gateway: 172.16.21.1
    ips:
    - ip: 172.16.21.2
      hostname: worker-vm-1
    - ip: 172.16.21.3
      hostname: worker-vm-2
    - ip: 172.16.21.4
      hostname: worker-vm-3
    - ip: 172.16.21.5
      hostname: worker-vm-4

user-cluster.yaml

apiVersion: v1
kind: UserCluster
...
network:
  hostConfig:
    dnsServers:
    - "203.0.113.2"
    - "198.51.100.2"
    ntpServers:
    - "216.239.35.4"
  ipMode:
    type: "static"
    ipBlockFilePath: "user-ipblock.yaml"
  controlPlaneIPBlock:
    netmask: "255.255.255.0"
    gateway: "172.16.21.1"
    ips:
    - ip: "172.16.21.6"
      hostname: "cp-vm-1"
    - ip: "172.16.21.7"
      hostname: "cp-vm-2"
    - ip: "172.16.21.8"
      hostname: "cp-vm-3"
loadBalancer:
  vips:
    controlPlaneVIP: "172.16.21.40"
    ingressVIP: "172.16.21.30"
  kind: MetalLB
  metalLB:
    addressPools:
    - name: "address-pool-1"
      addresses:
    - "172.16.21.30-172.16.21.39"
...
enableControlplaneV2: true
enableDataplaneV2: true
masterNode:
  cpus: 4
  memoryMB: 8192
  replicas: 3
nodePools:
- name: "worker-node-pool"
  enableLoadBalancer: true

以下是在上述示例中要理解的要点:

  • 工作器节点的静态 IP 地址在 IP 地址块文件中指定。即使只有三个工作器节点,IP 块文件也具有四个地址。在集群升级、更新和自动修复期间需要额外的 IP 地址。

  • DNS 和 NTP 服务器在 hostConfig 部分中指定。在此示例中,这些 DNS 和 NTP 服务器用于控制平面节点和工作器节点。这是因为工作器节点具有静态 IP 地址。如果工作器节点从 DHCP 服务器获取其 IP 地址,那么这些 DNS 和 NTP 服务器将仅用于控制平面节点。

  • 三个控制平面节点的静态 IP 地址在用户集群配置文件的 network.controlPlaneIPBlock 部分中指定。此块中不需要额外的 IP 地址。

  • masterNode.replicas 字段设置为 3

  • 控制平面 VIP 地址和入站流量 VIP 地址与工作器节点和控制平面节点位于同一 VLAN。

  • 为 LoadBalancer 类型的 Service 预留的 VIP 在用户集群配置文件的 loadBalancer.metalLB.addressPools 部分中指定。这些 VIP 地址与工作器节点和控制平面节点位于同一 VLAN。 此部分中指定的一组 VIP 必须包含入站流量 VIP,不得包含控制平面 VIP。

  • 用户集群配置文件不包含 vCenter 部分。因此,用户集群使用的 vSphere 资源与管理员集群相同。

Controlplane V2 的防火墙规则

除了标准防火墙规则之外,还请创建以下防火墙规则:

发件人

来源端口

改换到的货币

目的地端口

协议

说明

管理员集群节点

全部

用户集群控制平面 VIP 地址

443

https

允许管理员集群中的节点和 Pod 与用户集群的 Kubernetes API 服务器通信。

管理员集群节点

全部

用户集群控制平面节点

443

https

允许管理员集群中的节点和 Pod 使用用户集群控制平面节点的 IP 地址与用户集群的 Kubernetes API 服务器通信。

启用了 Controlplane V2 的用户集群不需要以下标准防火墙规则:

发件人

来源端口

改换到的货币

目的地端口

协议

说明

管理员集群工作器节点

全部

用户集群节点

22

SSH

API 服务器通过 SSH 隧道与 kubelet 进行的通信

用户集群工作器节点

全部

用户集群控制平面 VIP 地址

8132

GRPC

Konnectivity 连接

创建启用了 Controlplane V2 的用户集群

本部分介绍了如何创建启用了 Controlplane V2 的用户集群。在此示例中,用户集群使用与管理员集群相同的 vCenter Server 实例。

按照创建用户集群中的说明操作。

填写用户集群配置文件时:

  • enableControlplaneV2 设置为 true

  • enableDataplaneV2 设置为 true

  • loadBalancer.kind 设置为 "MetalLB"

  • 请勿指定 vCenter.address 的值。

  • 请填写 network.controlPlaneIPBlock 部分。 如果您需要 HA 用户集群,请指定三个 IP 地址。否则,请指定一个 IP 地址。

在用户集群运行时,请验证控制平面是否在用户集群中的一个或三个节点上运行:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get nodes

USER_CLUSTER_KUBECONFIG 替换为用户集群 kubeconfig 文件的路径。

输出会显示一个或三个控制平面节点以及工作器节点。例如:

cp-vm-1       Ready    control-plane,master   18m
cp-vm-2       Ready    control-plane,master   18m
cp-vm-3       Ready    control-plane,master   18m
worker-vm-1   Ready                           6m7s
worker-vm-2   Ready                           6m6s
worker-vm-3   Ready                           6m14s

验证用户集群的控制平面是否未在管理员集群中运行:

kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get nodes --output wide

ADMIN_CLUSTER_KUBECONFIG 替换为管理员集群 kubeconfig 文件的路径。

输出会显示管理员集群本身的控制平面节点,但不会显示用户集群的任何控制平面节点。例如:

admin-vm-1   Ready    control-plane,master   82m
admin-vm-2   Ready                           71m
admin-vm-3   Ready                           71m

验证是否没有任何 Pod 在管理员集群的 USER_CLUSTER_NAME 命名空间中运行。这与 kubeception 模型形成对比,在此模型中,有多个控制平面 Pod 在管理员集群的 USER_CLUSTER_NAME 命名空间中运行:

kubectl --kubeconfig kubeconfig get pods --namespace USER_CLUSTER_NAME

输出:

No resources found in ... namespace.

验证是否有控制平面 Pod 在用户集群中运行:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get pods\
    --namespace kube-system\
    --selector tier=control-plane

输出示例:

clusterapi-controllers-5bbfb6bd9f-57gz8   3/3     Running   1
…
etcd-cp-vm-1                              1/1     Running   0
…
kube-apiserver-cp-vm-1                    1/1     Running   0
…
kube-controller-manager-cp-vm-1           1/1     Running   0
…
kube-scheduler-cp-vm-1                    1/1     Running   0

与节点的 SSH 连接

使用 Controlplane V2 时,如需与用户集群控制平面节点建立 SSH 连接,请使用连接到用户集群工作器节点所用的 SSH 密钥

这与 kubeception 用户集群形成对比,在此用户集群中,使用连接到管理员集群工作器节点所用的 SSH 密钥

升级用户集群

按照升级 Anthos Clusters on VMware 中的说明进行操作。

请注意,升级启用了 Controlplane V2 的用户集群时,整个用户集群(包括用户控制平面节点)会升级。

相比之下,对于使用 kubeception 模型部署的用户集群,控制平面节点在用户集群升级期间不会升级,并且在管理员集群升级之前也不会升级。

删除用户集群

如需删除用户集群,请运行以下命令:

gkectl delete cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --cluster USER_CLUSTER

USER_CLUSTER 替换为用户集群的名称。

删除启用了 Controlplane V2 的用户集群时,系统不会自动删除该集群的数据磁盘。所以,您需要手动删除数据磁盘。一个高可用性集群有三个数据磁盘,一个非高可用性集群有一个数据磁盘。

用户集群控制平面节点的数据磁盘位于用户集群配置文件的 masterNode.vSphere.datastore 字段中指定的数据存储区。

用户集群的数据磁盘位于以下某个位置:

  • ADMIN_CLUSTER/USER_CLUSTER/

  • ADMIN_DISK_FOLDER/ADMIN_CLUSTER/USER_CLUSTER/

ADMIN_CLUSTER 替换为管理员集群的名称。

如果您在管理员集群配置文件的 vCenter.dataDisk 字段中指定了文件夹,请将 ADMIN_DISK_FOLDER 替换为该文件夹的名称。

对于非高可用性集群,数据磁盘名为 USER_CLUSTER-0-data.vmdk。

对于 HA 集群,数据磁盘的命名方式如下:

  • USER_CLUSTER-0-data.vmdk。
  • USER_CLUSTER-1-data.vmdk。
  • USER_CLUSTER-2-data.vmdk。

您可以使用 vSphere 客户端删除数据磁盘。

创建具有自己的 vCenter Server 的用户集群

在某些情况下,最好是创建使用自己的 vCenter Server 实例的用户集群。也就是说,管理员集群和关联的用户集群使用不同的 vCenter Server 实例。

例如,在边缘位置,您可能需要一台物理机器运行 vCenter Server,一台或多台物理机器运行 ESXi。然后,您可以使用本地 vCenter Server 实例创建 vSphere 对象层次结构,包括数据中心、集群、资源池、数据存储区和文件夹。

请按照创建启用了 Controlplane V2 的用户集群下的说明执行操作。

除了本部分中提供的步骤之外,还请填写用户集群配置文件的整个 vCenter 部分。具体而言,请为 vCenter.address 指定一个值,该值不同于您在管理员集群配置文件中指定的 vCenter Server 地址。

示例

vCenter:
  address: "vc-edge.example"
  datacenter: "vc-edge"
  cluster: "vc-edge-workloads"
  resourcePool: "vc-edge-pool
  datastore: "vc-edge-datastore
  caCertPath: "/usr/local/google/home/me/certs/edge-cacert.pem"
  credentials:
    fileRef:
      path: "credential.yaml"
      entry: "vCenter-edge"
  folder: "edge-vm-folder"

防火墙规则

除了标准防火墙规则控制平面 V2 所需的防火墙规则之外,如果用户集群有自己的 vCenter Server,还请创建以下防火墙规则:

发件人

来源端口

改换到的货币

目的地端口

协议

说明

管理员集群节点

全部

用户集群 vCenter Server

443

https

允许管理员集群管理用户集群的生命周期。如果您为 vCenter.address 指定的值与管理员集群配置文件中的 vCenter 地址不同,则必须创建此防火墙规则。

问题排查

请参阅排查集群创建和升级问题

后续步骤