创建用户集群

在 GKE on VMware 中,您的工作负载在一个或多个用户集群上运行。本文档介绍了如何创建用户集群。

您可以使用多种工具创建用户集群:

  • gkectl
  • Google Cloud 控制台
  • Google Cloud CLI
  • Terraform

其中三种工具(控制台、gcloud CLI 和 Terraform)是 GKE On-Prem API 的客户端。

如需有关您可能需要使用哪个工具的指导,请参阅选择工具来管理集群生命周期

准备工作

  • 如果您尚未设置 Google Cloud 资源,请按照以下文档中的说明进行设置:

    在设置舰队宿主项目时,请牢记您选择的工具,因为如果您选择了某个 GKE On-Prem API 客户端,则必须启用其他 API。

  • 在创建用户集群之前,您必须有一个管理员集群来管理用户集群。如果您尚未创建管理员工作站管理员集群,请执行此操作。

    如果您已选择使用某个 GKE On-Prem API 客户端,则必须为管理员集群启用审核日志记录Cloud 日志记录

  • 确定要安装的用户集群的版本。创建用户集群时,您通常需要安装与管理员集群的版本匹配的版本。但是,您可以安装更高的补丁版本或比次要版本高一个的版本。如需了解详情,请参阅安装比管理员集群版本更高的版本

  • 请考虑您是否希望用户集群启用控制平面 V2。启用 Controlplane V2 后,用户集群的控制平面会在用户集群本身的一个或多个节点上运行。我们强烈建议您启用控制平面 V2。或者,创建一个使用 kubeception 的用户集群。在 kubeception 中,用户集群的控制平面在管理员集群中的一个或多个节点上运行。

  • 查看 IP 地址规划文档,并确保您有足够的 IP 地址。

  • 查看负载均衡概览,并重新考虑有关要使用的负载均衡器类型的决定。您可以使用捆绑式 MetalLB 负载均衡器,也可以手动配置您选择的负载均衡器。对于手动负载均衡,您必须先设置负载均衡器,然后才能创建用户集群。

  • 考虑您需要多少个节点池,以及您想要在每个池中运行哪个操作系统。

  • 请考虑是否要为管理员集群和用户集群使用单独的 vSphere 集群,以及是否要使用单独的数据中心。另外,请考虑是否要使用单独的 vCenter Server 实例。

创建用户集群

gkectl

过程概览

以下是使用 gkectl 创建用户集群所涉及的主要步骤:

  1. 连接到管理员工作站
    管理员工作站是一台机器,其中安装有创建用户集群所需的工具。
  2. 填写配置文件
    通过完成用户集群配置文件、凭据配置文件以及可能的 IP 地址块文件,指定新集群的详细信息。
  3. (可选)将操作系统映像导入 vSphere,并将容器映像推送到私有注册表(如果适用的话)。
    运行 gkectl prepare
  4. 创建用户集群
    运行 gkectl create cluster 以按照配置文件中所指定的内容创建集群。
  5. 验证用户集群是否正在运行
    使用 kubectl 查看集群节点。

此过程结束时,您将有一个正在运行的用户集群,您可以在其中部署工作负载。

如果您使用 VPC Service Controls,那么在运行某些 gkectl 命令(例如 "Validation Category: GCP - [UNKNOWN] GCP service: [Stackdriver] could not get GCP services")时,您可能会看到错误。为避免此类错误,请在命令中添加 --skip-validation-gcp 参数。

填写配置文件

在管理员工作站上执行以下步骤。

gkeadm 创建管理员工作站时,它生成了一个名为 user-cluster.yaml 的配置文件。此配置文件用于创建用户集群。

浏览用户集群配置文件文档,以熟悉配置文件。建议您在单独的标签页或窗口中打开该文档,因为您在完成以下步骤时将参考它。

name

name 字段设置为您为用户集群选择的名称。

gkeOnPremVersion

系统已为您填写此字段。它指定 GKE on VMware 的版本。例如 1.28.300-gke.123

enableControlplaneV2

如需创建已启用控制平面 V2 的用户集群,请将 enableControlplaneV2 设置为 true

启用 Controlplane V2 后,用户集群的控制平面会在用户集群本身的节点上运行。我们强烈建议您启用 Controlplane V2。

kubeception

如果将此字段设置为 false,集群将使用 kubecetption。使用 kubeception 时,用户集群的控制平面在管理员集群中的节点上运行。

对于 kubeception 集群:

  • enableControlplaneV2 设置为 false

  • 请勿填写 controlPlaneIPBlock 部分。

  • 在管理员集群的 IP 块文件中,为用户集群的控制平面节点指定 IP 地址。

enableDataplaneV2

enableDataplaneV2 设置为 true

vCenter

您在管理员集群配置文件vCenter 部分中设置的值是全局值。也就是说,这些值会应用于管理员集群及其关联的用户集群。

对于您创建的每个用户集群,您可以选择替换一些全局 vCenter 值。

如需替换任何全局 vCenter 值,请填写用户集群配置文件的 vCenter 部分中的相关字段。

具体而言,您可能希望为管理员集群和用户集群使用不同的 vSphere 集群,并且为管理员集群和用户集群使用不同的数据中心。

使用一个数据中心和一个 vSphere 集群

默认选项为管理员集群和用户集群使用一个数据中心和一个 vSphere 集群。对于此选项,请勿在用户集群配置文件中设置任何 vCenter 值。vCenter 值将从管理员集群继承。

使用单独的 vSphere 集群

如果您想创建位于自己的 vSphere 集群中的用户集群,请在用户集群配置文件中为 vCenter.cluster 指定值。

如果您的管理员集群和用户集群位于不同的 vSphere 集群中,它们可以位于相同的数据中心中,也可以位于不同数据中心中。

使用单独的 vSphere 数据中心

用户集群和管理员集群可以位于不同的数据中心中。在这种情况下,它们也位于不同的 vSphere 集群中。

如果您在用户集群配置文件中指定了 vCenter.datacenter,则还必须指定以下各项:

  • vCenter.networkName
  • vCenter.datastorevCenter.storagePolicyName
  • vCenter.clustervCenter.resourcePool

使用单独的 vCenter 账号

用户集群可以使用与管理员集群不同的 vCenter 账号和 vCenter.credentials。管理员集群的 vCenter 账号需要管理员集群数据中心访问权限,而用户集群的 vCenter 账号只需要用户集群数据中心的访问权限。

使用单独的 vCenter Server 实例

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

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

填写用户集群配置文件的整个 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"

此外,请填写 network.vCenter.networkName 字段。

network

确定您要工作器节点获取其 IP 地址的方式。选项包括:

  • 从提前设置的 DHCP 服务器获取。将 network.ipMode.type 设置为 "dhcp"

  • 从您提供的静态 IP 地址列表获取。将 network.ipMode.type 设置为 "static",并创建一个提供静态 IP 地址的 IP 地址块文件。如需查看 IP 地址块文件的示例,请参阅已填写的配置文件的示例

如果您已决定为工作器节点使用静态 IP 地址,请填写 network.ipMode.ipBlockFilePath 字段。

用户集群的控制平面节点必须从您提供的静态地址列表中获取其 IP 地址。即使工作器节点从 DHCP 服务器获取其地址,情况也是如此。如需为控制平面节点指定静态 IP 地址,请填写 network.controlPlaneIPBlock 部分。如果您需要高可用性 (HA) 用户集群,请指定三个 IP 地址。否则,请指定一个 IP 地址。

通过填写 hostConfig 部分指定 DNS 和 NTP 服务器。这些 DNS 和 NTP 服务器用于控制平面节点。如果您为工作器节点使用静态 IP 地址,则这些 DNS 和 NTP 服务器也用于工作器节点。

network.podCIDRnetwork.serviceCIDR 具有预填充的值,您可以保持不变,除非它们与已在您的网络中使用的地址冲突。Kubernetes 会使用这些范围将 IP 地址分配给集群中的 Pod 和 Service。

无论您是依赖 DHCP 服务器还是指定静态 IP 地址列表,都需要有足够的 IP 地址供用户集群使用。如需了解所需的 IP 地址数量,请参阅规划 IP 地址

loadBalancer

为用户集群的 Kubernetes API 服务器预留一个 VIP。为用户集群的入站服务预留另一个 VIP。提供您的 VIP 作为 loadBalancer.vips.controlPlaneVIPloadBalancer.vips.ingressVIP 的值。

确定要使用的负载均衡类型。以下是各个选项:

如需详细了解负载均衡选项,请参阅负载均衡概览

advancedNetworking

如果您计划创建出站 NAT 网关,请将 advancedNetworking 设置为 true

multipleNetworkInterfaces

决定是否要为 Pod 配置多个网络接口,并相应地设置 multipleNetworkInterfaces

storage

如果要停用 vSphere CSI 组件的部署,请将 storage.vSphereCSIDisabled 设置为 true

masterNode

masterNode 部分中,您可以指定用户集群需要的控制平面节点数量(1 个或 3 个)。您还可以为控制平面节点指定数据存储区,以及是否要为控制平面节点启用自动调整大小功能。

回想一下,您在 network.controlPlaneIPBlock 部分中为控制平面节点指定了 IP 地址。

nodePools

节点池是集群中全都具有相同配置的一组节点。例如,一个池中的节点可以运行 Windows,另一个池中的节点可以运行 Linux。

您必须通过填写 nodePools 部分来至少指定一个节点池。

如需了解详情,请参阅节点池以及创建和管理节点池

antiAffinityGroups

antiAffinityGroups.enabled 设置为 truefalse

此字段指定 GKE on VMware 是否为您的工作器节点创建分布式资源调度器 (DRS) 反亲和性规则,使其分布到数据中心内的至少三个物理主机上。

stackdriver

如果要为集群启用 Cloud Logging 和 Cloud Monitoring,请填写 stackdriver 部分。

默认情况下,此部分是必填的。也就是说,如果您不填写此部分,则必须在运行 gkectl create cluster 时添加 --skip-validation-stackdriver 标志。

对于新集群,请注意以下要求:

  • stackdriver.projectID 中的 ID 必须与 gkeConnect.projectIDcloudAuditLogging.projectID 中的 ID 相同。

  • stackdriver.clusterLocation 中设置的 Google Cloud 区域必须与 cloudAuditLogging.clusterLocationgkeConnect.location 中设置的区域相同(如果该字段包含在配置文件中)。此外,如果 gkeOnPremAPI.enabledtrue,则必须在 gkeOnPremAPI.location 中设置同一区域。

如果项目 ID 和区域不相同,则集群创建会失败。

gkeConnect

用户集群必须注册到 Google Cloud 舰队

填写 gkeConnect 部分,指定舰队宿主项目和关联的服务帐号。gkeConnect.projectID 中的 ID 必须与 stackdriver.projectIDcloudAuditLogging.projectID 中设置的 ID 相同。如果项目 ID 不同,集群创建将失败。

在 1.28 及更高版本中,您可以选择在 gkeConnect.location 中指定在哪个区域运行舰队和连接服务。如果您未添加此字段,集群将使用这些服务的全局实例。

如果您在配置文件中添加了 gkeConnect.location,则您指定的区域必须与 cloudAuditLogging.clusterLocationstackdriver.clusterLocationgkeOnPremAPI.location 中配置的区域相同。如果区域不相同,集群创建将失败。

gkeOnPremAPI

在 1.16 及更高版本中,如果您的 Google Cloud 项目中启用了 GKE On-Prem API,则项目中的所有集群都会自动在 stackdriver.clusterLocation 中配置的区域中注册到 GKE On-Prem APIgkeOnPremAPI.location 区域必须与 cloudAuditLogging.clusterLocationgkeConnect.location(如果该字段包含在配置文件中)和 stackdriver.clusterLocation 中指定的区域相同。

  • 如果要在 GKE On-Prem API 中注册项目中的所有集群,请务必执行准备工作中的步骤,以在项目中激活并使用 GKE On-Prem API。

  • 如果您不想在 GKE On-Prem API 中注册集群,请添加此部分并将 gkeOnPremAPI.enabled 设置为 false。如果您不想在项目中注册任何集群,请在项目中停用 gkeonprem.googleapis.com(GKE On-Prem API 的服务名称)。如需查看相关说明,请参阅停用服务

usageMetering

如果要为集群启用用量计量功能,请填写 usageMetering 部分。

cloudAuditLogging

如果要将集群的 Kubernetes API 服务器中的审核日志与 Cloud Audit Logs 集成,请填写 cloudAuditLogging 部分。

对于新集群,请注意以下要求:

  • cloudAuditLogging.projectID 中的 ID 必须与 gkeConnect.projectIDstackdriver.projectID 中的 ID 相同。

  • cloudAuditLogging.clusterLocation 中的区域必须与 gkeConnect.location(如果该字段包含在配置文件中)和 stackdriver.clusterLocation 中设置的区域相同。此外,如果 gkeOnPremAPI.enabledtrue,则必须在 gkeOnPremAPI.location 中设置相同的区域。

如果项目 ID 和区域不相同,则集群创建会失败。

已填写的配置文件的示例

以下是 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

cat user-cluster.yaml
apiVersion: v1
kind: UserCluster
name: "my-user-cluster"
gkeOnPremVersion: 1.28.300-gke.123
enableControlplaneV2: true
enableDataplaneV2: true
network:
  hostConfig:
    dnsServers:
    - "203.0.113.2"
    - "198.51.100.2"
    ntpServers:
    - "216.239.35.4"
  ipMode:
    type: "static"
    ipBlockFilePath: "user-ipblock.yaml"
  serviceCIDR: 10.96.0.0/20
  podCIDR: 192.168.0.0/16
  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"
masterNode:
  cpus: 4
  memoryMB: 8192
  replicas: 3
nodePools:
- name: "worker-node-pool"
  cpus: 4
  memoryMB: 8192
  replicas: 3
  enableLoadBalancer: true
antiAffinityGroups:
  enabled: true
gkeConnect:
  projectID: "my-project-123"
  location: "us-central1"
  registerServiceAccountKeyPath: "connect-register-sa-2203040617.json"
stackdriver:
  projectID: "my-project-123"
  clusterLocation: "us-central1"
  enableVPC: false
  serviceAccountKeyPath: "log-mon-sa-2203040617.json"
autoRepair:
  enabled: true

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

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

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

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

  • 控制平面 V2 已启用。

  • masterNode.replicas 字段设置为 3,因此集群将具有高可用性控制平面。

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

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

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

验证配置文件

填写用户集群配置文件后,请运行 gkectl check-config 以验证文件有效:

gkectl check-config --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG

替换以下内容:

  • ADMIN_CLUSTER_KUBECONFIG 是管理员集群的 kubeconfig 文件的路径

  • USER_CLUSTER_CONFIG:用户集群配置文件的路径

如果该命令返回任何失败消息,请修复问题并再次验证文件。

如果您想跳过更耗时的验证,请传递 --fast 标志。如需跳过各项验证,请使用 --skip-validation-xxx 标志。如需详细了解 check-config 命令,请参阅运行预检检查

3. (可选)将操作系统映像导入 vSphere,并将容器映像推送到私有注册表

如果存在以下任一情况,请运行 gkectl prepare

  • 您的用户集群所在的 vSphere 数据中心与管理员集群不同。

  • 您的用户集群具有的 vCenter Server 与管理员集群不同。

  • 您的用户集群使用的私有注册表与管理员集群使用的私有容器注册表不同。

gkectl prepare --kubeconfig ADMIN_CLUSTER_KUBECONFIG \
    --bundle-path BUNDLE \
    --user-cluster-config USER_CLUSTER_CONFIG

替换以下内容:

  • ADMIN_CLUSTER_KUBECONFIG:管理员集群 kubeconfig 文件的路径

  • BUNDLE:软件包文件的路径。此文件位于 /var/lib/gke/bundles/ 中的管理员工作站上。例如:

    /var/lib/gke/bundles/gke-onprem-vsphere-1.28.300-gke.123-full.tgz
    
  • USER_CLUSTER_CONFIG:用户集群配置文件的路径

4.创建用户集群

创建用户集群:

gkectl create cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG

如果您使用 VPC Service Controls,那么在运行某些 gkectl 命令(例如 "Validation Category: GCP - [UNKNOWN] GCP service: [Stackdriver] could not get GCP services")时,您可能会看到错误。为避免此类错误,请在命令中添加 --skip-validation-gcp 参数。

找到用户集群 kubeconfig 文件的位置

gkectl create cluster 命令会在当前目录中创建一个名为 USER_CLUSTER_NAME-kubeconfig 的 kubeconfig 文件。您稍后需要此 kubeconfig 文件才能与用户集群进行互动。

kubeconfig 文件包含您的用户集群的名称。如需查看集群名称,您可以运行以下命令:

kubectl config get-clusters --kubeconfig USER_CLUSTER_KUBECONFIG

输出会显示集群的名称。例如:

NAME
my-user-cluster

如果愿意,您可以更改 kubeconfig 文件的名称和位置。

5. 验证用户集群正在运行

验证用户集群是否正在运行:

kubectl get nodes --kubeconfig USER_CLUSTER_KUBECONFIG

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

控制台

开始使用

  1. 在 Google Cloud 控制台中,前往创建 GKE on VMware 集群页面。

    前往“创建 GKE on VMware 集群”

  2. 选择您要供创建集群的 Google Cloud 项目。所选项目也会用作舰队宿主项目。该项目必须是管理员集群注册到的项目。创建用户集群后,它会自动注册到所选项目的舰队。

集群基本信息

输入有关集群的基本信息。

  1. 输入用户集群的名称

  2. 管理员集群下,从列表中选择管理员集群。如果您在创建管理员集群时未指定其名称,则系统会生成 gke-admin-[HASH] 格式的名称。如果您无法识别管理员集群名称,请在管理员工作站上运行以下命令:

    KUBECONFIG=ADMIN_CLUSTER_KUBECONFIG
    kubectl get OnPremAdminCluster -n kube-system -o=jsonpath='{.items[0].metadata.name}'
    

    如果要使用的管理员集群未显示,请参阅问题排查部分集群基本信息下拉列表中未显示管理员集群

  3. GCP API 位置字段中,从列表中选择 Google Cloud 区域。此设置指定运行以下 API 和服务的区域:

    • GKE On-Prem API (gkeonprem.googleapis.com)
    • 舰队服务 (gkehub.googleapis.com)
    • 连接服务 (gkeconnect.googleapis.com)

    此设置还可控制存储以下内容的区域:

    • GKE On-Prem API 管理集群生命周期所需的用户集群元数据
    • 系统组件的 Cloud Logging 和 Cloud Monitoring 数据
    • Cloud Audit Logs 创建的管理员审核日志

    集群名称、项目和位置唯一标识 Google Cloud 中的集群。

  4. 为您的用户集群选择 GKE on VMware 版本。

  5. 作为集群创建者,您将获得集群的集群管理员权限。(可选)在授权部分的集群管理员用户字段中,输入将管理集群的其他用户的电子邮件地址。

    创建集群时,GKE On-Prem API 将 Kubernetes 基于角色的访问控制 (RBAC) 政策应用于集群,以授予您和其他管理用户 Kubernetes clusterrole/cluster-admin 角色,该角色提供对集群中所有名称空间中的每个资源的完全访问权限。

  6. 点击下一步以前往控制平面部分。

控制平面

控制平面部分中的所有字段均设置为默认值。查看默认值,并根据需要进行更改。

  1. 控制平面节点 vCPU 数字段中,输入用户集群每个控制平面节点的 vCPU 数量(至少 4 个)。

  2. 控制平面节点内存字段中,输入用户集群每个控制平面的内存大小(以 MiB 为单位,最小值为 8192,并且必须是 4 的倍数)。

  3. 控制平面节点下,选择用户集群的控制平面节点数。例如,您可以为开发环境选择 1 个控制平面节点,为高可用性 (HA) 生产环境选择 3 个控制平面节点。

  4. (可选)选择自动调整节点大小。调整大小是指自动调整分配给节点的 vCPU 和内存资源。启用后,用户集群控制平面节点会根据用户集群中的工作器节点数量调整大小。因此,当您向用户集群添加更多工作器节点时,控制平面节点的大小会增加。

  5. (可选)选择启用控制平面 v2。启用控制平面 V2 意味着用户集群的控制平面在用户集群本身的一个或多个节点上运行,而不是在管理员集群(称为 kubeception)中运行。

    选择启用控制平面 v2 时,系统会显示控制平面节点 IP 部分。输入网关的 IP 地址、子网掩码以及控制平面节点的 IP 地址。

    启用 Controlplane V2 时,vCPU 和内存字段适用于用户集群中的控制平面节点。节点数由您输入的 IP 地址数量决定。未启用 Controlplane V2 时,vCPU、内存和控制平面节点字段适用于管理员集群中的节点。请确保为管理员集群预留足够的 IP 地址

  6. 点击下一步以前往网络部分。

网络

在本部分中,您将指定集群的节点、Pod 和 Service 的 IP 地址。用户集群需要为每个节点分配一个 IP 地址,并为集群升级、更新和自动修复期间所需的临时节点额外分配一个 IP 地址。如需了解详情,请参阅用户集群需要多少个 IP 地址?

  1. 节点 IP 部分中,为用户集群选择 IP 模式。从下列选项中选择一项:

    • DHCP:如果您希望集群节点从 DHCP 服务器获取其 IP 地址,请选择 DHCP

    • 静态:如果您要为集群节点提供静态 IP 地址,或者要设置手动负载均衡,请选择静态

  2. 如果您选择了 DHCP,请跳到下一步,以指定 Service 和 Pod CIDR。在静态 IP 地址模式部分,请提供以下信息:

    1. 输入用户集群的网关的 IP 地址。

    2. 输入用户集群节点的子网掩码

    3. IP 地址部分中,输入用户集群中节点的 IP 地址和(可选)主机名。您可以输入单个 IP v4 地址(例如 192.0.2.1)或 IPv4 CIDR 地址块(例如 192.0.2.0/24)。

      • 如果您输入 CIDR 地址块,请不要输入主机名。

      • 如果您输入单个 IP 地址,则可以选择输入主机名。如果未输入主机名,GKE on VMware 将使用 vSphere 中的虚拟机名称作为主机名。

    4. 根据需要点击 + 添加 IP 地址以输入更多 IP 地址。

  3. Service CIDR 和 Pod CIDR 部分中,控制台为 Kubernetes Service 和 Pod 提供以下地址范围:

    • Service CIDR:10.96.0.0/20
    • Pod CIDR:192.168.0.0/16

    如果您希望输入自己的地址范围,请参阅 Pod 和 Service 的 IP 地址以了解最佳实践。

  4. 如果您选择了静态 IP 模式启用控制平面 v2,请在主机配置部分中指定以下信息:

    1. 输入 DNS 服务器的 IP 地址。
    2. 输入 NTP 服务器的 IP 地址。
    3. (可选)输入 DNS 搜索网域。
  5. 点击下一步以前往负载均衡器部分。

负载均衡器

选择要为集群设置的负载均衡器。 如需了解详情,请参阅负载均衡器概览

从列表中选择负载均衡器类型

与 MetalLBLB 捆绑

配置使用 MetalLB 进行捆绑式负载均衡。只有在管理员集群使用 SeeSaw 或 MetalLB 的情况下,您才能对用户集群使用 MetalLB。此方案需要的配置最低。MetalLB 直接在集群节点上运行,不需要额外的虚拟机。如需详细了解使用 MetalLB 的优势及其与其他负载均衡方案的比较情况,请参阅使用 MetalLB 进行捆绑负载均衡

  1. 地址池部分中,至少配置一个地址池,如下所示:

    1. 输入地址池的名称。

    2. 以 CIDR 表示法输入包含 Ingress VIP 的 IP 地址范围(例如, 192.0.2.0/26),或以范围表示法输入包含 Ingress VIP 的 IP 地址范围(例如 192.0.2.64-192.0.2.72)。如需指定池中的单个 IP 地址,请使用 /32(采用 CIDR 表示法,例如, 192.0.2.1/32)。

    3. 如果 LoadBalancer 类型的 Service 的 IP 地址与 Ingress VIP 不在同一 IP 地址范围内,请点击 + 添加 IP 地址范围,然后输入其他地址范围。

      各个池中的 IP 地址不能重叠,并且必须与集群节点位于同一子网。

    4. IP 地址分配下,选择以下选项之一:

      • 自动:如果您希望 MetalLB 控制器自动将地址池中的 IP 地址分配给 LoadBalancer 类型的 Service,请选择此选项。

      • 手动:如果您打算使用池中的地址手动为 LoadBalancer 类型的 Service 指定地址,请选择此选项。

    5. 如果您希望 MetalLB 控制器不使用池中以 .0 或 .255 结尾的地址,请点击避免使用有问题的 IP 地址。这样可以避免有问题的用户设备错误地丢弃发送到这些特殊 IP 地址的流量。

    6. 完成后,请点击完成

  2. 如果需要,请点击添加地址池

  3. 虚拟 IP 部分中,输入以下内容:

    • 控制平面 VIP:用于发送到用户集群 Kubernetes API 服务器的流量的目标 IP 地址。用户集群的 Kubernetes API 服务器在管理员集群中的节点上运行。此 IP 地址必须与管理员集群节点位于同一 L2 网域中。请勿在地址池部分中添加此地址。

    • Ingress VIP:要在负载均衡器上为 Ingress 代理配置的 IP 地址。您必须将其添加到地址池部分中的地址池。

  4. 点击继续

F5 BIG-IP

仅当您的管理员集群使用 F5 BIG-IP 时,您才能为用户集群使用 F5 BIG-IP。请务必先安装并配置 F5 BIG-IP ADC,然后再将其与 GKE on VMware 集成。

F5 用户名和密码继承自管理员集群。

  1. 虚拟 IP 部分中,输入以下内容:

    • 控制平面 VIP:用于发送到 Kubernetes API 服务器的流量的目的地 IP 地址。

    • Ingress VIP:要在负载均衡器上为 Ingress 代理配置的 IP 地址。

  2. 地址字段中,输入 F5 BIG-IP 负载均衡器的地址。

  3. 分区字段中,输入您为用户集群创建的 BIG-IP 分区的名称。

  4. SNAT 池名称字段中,输入 SNAT 池的名称(如果适用)。

  5. 点击继续

手动

只有在管理员集群使用手动负载均衡器时,您才能为用户集群使用手动负载均衡器。在 GKE on VMware 中,Kubernetes API 服务器和 Ingress 代理分别由 LoadBalancer 类型的 Kubernetes Service 公开。为这些 Service 自行选择 30000 到 32767 范围内的 nodePort 值。对于 Ingress 代理,请选择一个适用于 HTTP 和 HTTPS 流量的 nodePort 值。如需了解详情,请参阅启用手动负载均衡模式

  1. 虚拟 IP 部分中,输入以下内容:

    • 控制平面 VIP:用于发送到 Kubernetes API 服务器的流量的目的地 IP 地址。

    • Ingress VIP:要在负载均衡器上为 Ingress 代理配置的 IP 地址。

  2. 控制平面节点端口字段中,为 Kubernetes API 服务器输入 nodePort 值。

  3. Ingress HTTP 节点端口字段中,输入流向 Ingress 代理的 HTTP 流量的 nodePort 值。

  4. Ingress HTTPS 节点端口字段中,输入流向 Ingress 代理的 HTTPS 流量的 nodePort 值。

  5. Konnectivity 服务器节点端口 字段中,输入 Konnectivity 服务器的 nodePort 值。

  6. 点击继续

特性

本部分展示在集群上启用的功能和操作。

  1. 以下各项会自动启用且无法停用:

  2. 以下各项默认处于启用状态,但您可以将其停用:

    • 启用 vSphere CSI 驱动程序:也称为 vSphere 容器存储插件。容器存储接口 (CSI) 驱动程序在 vSphere 内部署的 Kubernetes 集群中运行,用于在 vSphere 存储上预配永久性卷。如需了解详情,请参阅使用 vSphere 容器存储接口驱动程序

    • 启用反亲和性群组:系统会自动为您的用户集群节点创建 VMware 分布式资源调度器 (DRS) 反亲和性规则,使其分布到数据中心内的至少 3 个物理主机上。确保您的 vSphere 环境符合要求

  3. 点击下一步以配置节点池

节点池

创建的集群将至少包含一个节点池。节点池是用于在此集群中创建的一组工作器节点的模板。如需了解详情,请参阅创建和管理节点池

  1. 节点池默认设置 (Node pool defaults) 部分中,完成以下操作:

    1. 输入节点池名称或接受“default-pool”作为名称。
    2. 输入池中每个节点的 vCPUs 数量(每个用户集群工作器至少 4 个)。
    3. 输入池中每个节点的内存大小,以兆比字节 (MiB) 为单位(每个用户集群工作器节点最少 8192 MiB,并且必须是 4 的倍数)。
    4. 节点字段中,输入池中的节点数(至少 3 个)。如果您在网络部分中为节点 IP 输入了静态 IP 地址,请确保输入了足够的 IP 地址来容纳这些用户集群节点。
    5. 选择操作系统映像类型UbuntuUbuntu ContainerdCOS
    6. 输入启动磁盘大小(以吉比字节 (GiB) 为单位,最少为 40 GiB)。
    7. 如果您使用 MetalLB 作为负载均衡器,必须在至少一个节点池中启用 MetalLB。使将此节点池用于 MetalLB 负载均衡保持选中状态,或者添加其他节点池用于 MetalLB。
  2. 节点池元数据(可选)部分中,如果要添加 Kubernetes 标签污点,请执行以下操作:

    1. 点击 + 添加 Kubernetes 标签。输入标签的。根据需要重复上述步骤。
    2. 点击 + 添加污点。输入污点的效果。根据需要重复上述步骤。
  3. 点击验证并完成以创建用户集群。创建用户集群需要 15 分钟或更长时间。控制台会在验证设置并在您的数据中心创建集群时显示状态消息。

    如果在验证设置时遇到错误,控制台会显示一条错误消息,该消息应该足够清晰,以便您解决配置问题,然后再次尝试创建集群。

    如需详细了解可能出现的错误以及如何修复这些错误,请参阅排查 Google Cloud 控制台中的用户集群创建问题

gcloud CLI

您可以使用以下命令创建用户集群:

gcloud container vmware clusters create

创建集群后,您需要使用以下命令创建至少一个节点池:

gcloud container vmware node-pools create

创建集群和节点池的大多数标志都对应于用户集群配置文件中的字段。为帮助您开始使用,您可以在示例部分中测试完整命令。

准备工作

  1. 获取管理员集群的名称和舰队成员资格位置:

    gcloud container fleet memberships list \
        --project=FLEET_HOST_PROJECT_ID
    

    FLEET_HOST_PROJECT_ID 替换为管理员集群注册到的项目的 ID。

    输出类似于以下内容:

    NAME             EXTERNAL_ID                           LOCATION
    admin-cluster-1  bb7803b4-8438-4b22-859f-4559b4b29072  global
    admin-cluster-2  ee16ee2b-6ec0-49fc-9413-3c89cbc70854  global
    admin-cluster-3  fc2b7ef5-39ff-4b63-b919-04c5adc67be4  us-west1
    

    该位置指定了舰队和 Connect 服务的运行位置。1.28 版之前创建的管理员集群由全局舰队和连接服务管理。在 1.28 及更高版本中,您可以在创建管理员集群时指定 global 或 Google Cloud 区域。在后面的示例命令中,您可以在 --admin-cluster-membership-location 标志中指定区域。

  2. 获取可用版本的列表:

    gcloud container vmware clusters query-version-config \
        --admin-cluster-membership=ADMIN_CLUSTER_NAME \
        --admin-cluster-membership-project=FLEET_HOST_PROJECT_ID \
        --admin-cluster-membership-location=ADMIN_CLUSTER_REGION \
        --location=REGION
    

    替换以下内容:

    • ADMIN_CLUSTER_NAME:管理员集群的名称。

    • FLEET_HOST_PROJECT_ID:管理员集群注册到的项目的 ID。

    • ADMIN_CLUSTER_REGION:管理员集群的舰队成员区域。可以是全球区域,也可以是 Google Cloud 区域。使用 gcloud container fleet memberships list 输出中的管理员集群的位置。

    • REGION:创建集群时将使用的 Google Cloud 区域。这是运行 GKE On-Prem API 以及舰队和 Connect 服务的区域。请指定 us-west1 或其他受支持的区域

    此命令的输出类似如下所示:

    versions:
    - isInstalled: true
      version: 1.14.3-gke.25
    - version: 1.14.4-gke.54
    - version: 1.15.0-gke.581
    

    可用于创建用户集群的版本带有 isInstalled=true 注解,这意味着管理员集群具有管理该版本的用户集群所需的特定于版本的组件。如果您要使用其他可用版本创建用户集群,请参阅安装比管理员集群版本更高的版本

示例

以下示例展示了如何创建具有不同负载均衡器的用户集群。如需了解可用的负载均衡选项,请参阅负载均衡器概览以了解详情。

这些示例使用默认值来配置控制平面节点。如果要更改任何默认值,请添加控制平面标志部分中所述的标志。如果需要,您还可以更改一些 vSphere 设置

集群运行后,您必须先添加节点池,然后才能部署工作负载,如创建节点池部分中所述。

MetalLB 和 DHCP

此示例展示了如何创建具有捆绑式 MetalLB 负载均衡器的用户集群,并使用 DHCP 服务器获取集群节点的 IP 地址。

只有在管理员集群使用 SeeSaw 或 MetalLB 的情况下,您才能为用户集群使用 MetalLB。此负载均衡方案只需进行极少的配置。MetalLB 直接在集群节点上运行,不需要额外的虚拟机。如需详细了解使用 MetalLB 的优势及其与其他负载均衡方案的比较情况,请参阅使用 MetalLB 进行捆绑式负载均衡

gcloud container vmware clusters create USER_CLUSTER_NAME \
    --project=FLEET_HOST_PROJECT_ID \
    --admin-cluster-membership=ADMIN_CLUSTER_NAME \
    --admin-cluster-membership-project=FLEET_HOST_PROJECT_ID \
    --admin-cluster-membership-location=ADMIN_CLUSTER_REGION \
    --location=REGION \
    --version=VERSION \
    --admin-users=YOUR_EMAIL_ADDRESS \
    --admin-users=ANOTHER_EMAIL_ADDRESS \
    --service-address-cidr-blocks=SERVICE_CIDR_BLOCK \
    --pod-address-cidr-blocks=POD_CIDR_BLOCK \
    --metal-lb-config-address-pools='pool=NAME,avoid-buggy-ips=True|False,manual-assign=True|False,addresses=IP_ADDRESS_RANGE_1;IP_ADDRESS_RANGE_2;...' \
    --control-plane-vip=CONTROL_PLANE_VIP \
    --ingress-vip=INGRESS_VIP \
    --enable-dhcp

替换以下内容:

  • USER_CLUSTER_NAME:您为用户集群选择的名称。创建集群后,此名称便无法更改。 该名称必须:
    • 最多包含 40 个字符
    • 只能包含小写字母数字字符或连字符 (-)
    • 以字母字符开头
    • 以字母数字字符结尾
  • FLEET_HOST_PROJECT_ID:您要在其中创建集群的项目的 ID。指定的项目也会用作舰队宿主项目。该项目必须是管理员集群注册到的项目。创建用户集群后,它会自动注册到所选项目的舰队。集群创建后,舰队宿主项目便无法更改。
  • ADMIN_CLUSTER_NAME:管理用户集群的管理员集群的名称。在 --admin-cluster-membership 标志中,您可以使用完全指定的集群名称,格式如下:
        projects/FLEET_HOST_PROJECT_ID/locations/ADMIN_CLUSTER_REGION/memberships/ADMIN_CLUSTER_NAME

    或者,您也可以将 --admin-cluster-membership 设置为管理员集群的名称,如示例命令所示。如果仅使用管理员集群的名称,请使用 --admin-cluster-membership-project 设置管理员集群的项目 ID,使用 --admin-cluster-membership-location 设置位置。管理员集群的位置是 global 或 Google Cloud 区域。如果您需要查找该区域,请运行 gcloud container fleet memberships list

  • REGION:运行 GKE On-Prem API (gkeonprem.googleapis.com)、舰队服务 (gkehub.googleapis.com) 和 Connect 服务 (gkeconnect.googleapis.com) 的 Google Cloud 区域。请指定 us-west1 或其他受支持的区域。 创建集群后,此区域便无法更改。此设置指定存储以下内容的区域:
    • GKE On-Prem API 管理集群生命周期所需的用户集群元数据
    • 系统组件的 Cloud Logging 和 Cloud Monitoring 数据
    • Cloud Audit Logs 创建的管理员审核日志

    集群名称、项目和位置共同在 Google Cloud 中唯一标识集群。

  • VERSION:用户集群的 GKE on VMware 版本。
  • YOUR_EMAIL_ADDRESSANOTHER_EMAIL_ADDRESS:如果您没有添加 --admin-users 标志,作为集群创建者,默认情况下您将获得集群管理员权限。但是,如果您添加 --admin-users 以将其他用户指定为管理员,则会替换默认值,并且需要同时添加您的电子邮件地址和另一个管理员的电子邮件地址。例如,如需添加两个管理员:
        --admin-users=sara@example.com \
        --admin-users=amal@example.com

    创建集群时,GKE On-Prem API 会将 Kubernetes 基于角色的访问权限控制 (RBAC) 政策应用于集群,从而向您和其他管理员用户授予 Kubernetes clusterrole/cluster-admin 角色,该角色提供对集群内所有命名空间中所有资源的完整访问权限。

  • SERVICE_CIDR_BLOCK:用于集群中 Service 的 IP 地址范围(采用 CIDR 格式)。范围必须至少为 /24。

    示例:--service-address-cidr-blocks=10.96.0.0/20

  • POD_CIDR_BLOCK:用于集群中 Pod 的 IP 地址范围(采用 CIDR 格式)。范围必须至少为 /18。

    示例:--pod-address-cidr-blocks=192.168.0.0/16

  • --metal-lb-config-address-pools:添加此标志可指定 MetalLB 负载均衡器要使用的地址池的配置。该标志的值采用以下格式:
    --metal-lb-config-address-pool 'pool=NAME,avoid-buggy-ips=True|False,manual-assign=True|False,addresses=IP_ADDRESS_RANGE_1;IP_ADDRESS_RANGE_2;...' \

    该值的各部分分别以关键字 poolavoid-buggy-ipmanual-assignaddresses 开头。每个细分之间用英文逗号分隔。

    • pool:您为池选择的名称。
    • avoid-buggy-ips1:如果将该部分设置为 True,则 MetalLB 控制器不会将以 .0 或 .255 结尾的 IP 地址分配给 Service。这样可以避免有问题的用户设备错误地丢弃发送到这些特殊 IP 地址的流量。如果未指定,则默认为 False
    • manual-assign:如果您不希望 MetalLB 控制器自动将此池中的 IP 地址分配给 Service,请将该部分设置为 True。之后,开发者便可以创建 LoadBalancer 类型的 Service 并手动指定池中的一个地址。如果未指定,则将 manual-assign 设置为 False
    • addresses 列表中:每个地址都必须是采用 CIDR 表示法或带连字符的范围格式的范围。如需指定池中的单个 IP 地址(例如对于入站流量 VIP),请使用 /32(采用 CIDR 表示法,例如 192.0.2.1/32)。

    请注意以下几点:

    • 用英文单引号将整个值括起来。
    • 不允许使用空格。
    • 用英文分号分隔每个 IP 地址范围。

    例如:

    --metal-lb-config-address-pool 'pool=pool1,avoid-buggy-ips=True,manual-assign=True,addresses=10.251.134.80/32;192.168.1.0/26;192.168.1.2-192.168.1.3'
  • CONTROL_PLANE_VIP:您已选择在负载均衡器上为用户集群的 Kubernetes API 服务器配置的 IP 地址。

    示例:--control-plane-vip=203.0.113.3

  • INGRESS_VIP:您选择在负载均衡器上为 Ingress 代理配置的 IP 地址。

    示例:--ingress-vip=10.251.134.80

    Ingress VIP 的 IP 地址必须属于某一个 MetalLB 地址池。

  • --enable-dhcp:如果您希望集群节点从您提供的 DHCP 服务器中获取其 IP 地址,请添加 --enable-dhcp。如果要为集群节点提供静态 IP 地址,或者要设置手动负载均衡,请勿添加此标志。

MetalLB 和静态 IP

此示例展示了如何创建具有捆绑式 MetalLB 负载均衡器的用户集群,并为集群节点分配静态 IP 地址。

只有在管理员集群使用 SeeSaw 或 MetalLB 的情况下,您才能为用户集群使用 MetalLB。此负载均衡方案只需进行极少的配置。MetalLB 直接在集群节点上运行,不需要额外的虚拟机。如需详细了解使用 MetalLB 的优势及其与其他负载均衡方案的比较情况,请参阅使用 MetalLB 进行捆绑式负载均衡

如果需要填写 --admin-cluster-membership 标志的 ADMIN_CLUSTER_NAME 占位符,请务必滚动。 此示例使用完全指定的管理员集群名称,因此您无需添加 --admin-cluster-membership-location--admin-cluster-membership-project

gcloud container vmware clusters create USER_CLUSTER_NAME \
    --project=FLEET_HOST_PROJECT_ID \
    --admin-cluster-membership=ADMIN_CLUSTER_NAME \
    --admin-cluster-membership-project=FLEET_HOST_PROJECT_ID \
    --admin-cluster-membership-location=ADMIN_CLUSTER_REGION \
    --location=REGION \
    --version=VERSION \
    --admin-users=YOUR_EMAIL_ADDRESS \
    --admin-users=ANOTHER_EMAIL_ADDRESS \
    --service-address-cidr-blocks=SERVICE_CIDR_BLOCK \
    --pod-address-cidr-blocks=POD_CIDR_BLOCK \
    --metal-lb-config-address-pools='pool=NAME,avoid-buggy-ips=True|False,manual-assign=True|False,addresses=IP_ADDRESS_RANGE_1;IP_ADDRESS_RANGE_2;...' \
    --control-plane-vip=CONTROL_PLANE_VIP \
    --ingress-vip=INGRESS_VIP \
    --static-ip-config-ip-blocks='gateway=GATEWAY,netmask=NETMASK,ips=IP_ADDRESS_1;IP_ADDRESS_2 HOST_2;...' \
    --dns-servers=DNS_SERVER,... \
    --dns-search-domains=DNS_SEARCH_DOMAIN,... \
    --ntp-servers=NTP_SERVER,...

替换以下内容:

  • USER_CLUSTER_NAME:您为用户集群选择的名称。创建集群后,此名称便无法更改。 该名称必须:
    • 最多包含 40 个字符
    • 只能包含小写字母数字字符或连字符 (-)
    • 以字母字符开头
    • 以字母数字字符结尾
  • FLEET_HOST_PROJECT_ID:您要在其中创建集群的项目的 ID。指定的项目也会用作舰队宿主项目。该项目必须是管理员集群注册到的项目。创建用户集群后,它会自动注册到所选项目的舰队。集群创建后,舰队宿主项目便无法更改。
  • ADMIN_CLUSTER_NAME:管理用户集群的管理员集群的名称。在 --admin-cluster-membership 标志中,您可以使用完全指定的集群名称,格式如下:
        projects/FLEET_HOST_PROJECT_ID/locations/ADMIN_CLUSTER_REGION/memberships/ADMIN_CLUSTER_NAME

    或者,您也可以将 --admin-cluster-membership 设置为管理员集群的名称,如示例命令所示。如果仅使用管理员集群的名称,请使用 --admin-cluster-membership-project 设置管理员集群的项目 ID,使用 --admin-cluster-membership-location 设置位置。管理员集群的位置是 global 或 Google Cloud 区域。如果您需要查找该区域,请运行 gcloud container fleet memberships list

  • REGION:运行 GKE On-Prem API (gkeonprem.googleapis.com)、舰队服务 (gkehub.googleapis.com) 和 Connect 服务 (gkeconnect.googleapis.com) 的 Google Cloud 区域。请指定 us-west1 或其他受支持的区域。 创建集群后,此区域便无法更改。此设置指定存储以下内容的区域:
    • GKE On-Prem API 管理集群生命周期所需的用户集群元数据
    • 系统组件的 Cloud Logging 和 Cloud Monitoring 数据
    • Cloud Audit Logs 创建的管理员审核日志

    集群名称、项目和位置共同在 Google Cloud 中唯一标识集群。

  • VERSION:用户集群的 GKE on VMware 版本。
  • YOUR_EMAIL_ADDRESSANOTHER_EMAIL_ADDRESS:如果您没有添加 --admin-users 标志,作为集群创建者,默认情况下您将获得集群管理员权限。但是,如果您添加 --admin-users 以将其他用户指定为管理员,则会替换默认值,并且需要同时添加您的电子邮件地址和另一个管理员的电子邮件地址。例如,如需添加两个管理员:
        --admin-users=sara@example.com \
        --admin-users=amal@example.com

    创建集群时,GKE On-Prem API 会将 Kubernetes 基于角色的访问权限控制 (RBAC) 政策应用于集群,从而向您和其他管理员用户授予 Kubernetes clusterrole/cluster-admin 角色,该角色提供对集群内所有命名空间中所有资源的完整访问权限。

  • SERVICE_CIDR_BLOCK:用于集群中 Service 的 IP 地址范围(采用 CIDR 格式)。范围必须至少为 /24。

    示例:--service-address-cidr-blocks=10.96.0.0/20

  • POD_CIDR_BLOCK:用于集群中 Pod 的 IP 地址范围(采用 CIDR 格式)。范围必须至少为 /18。

    示例:--pod-address-cidr-blocks=192.168.0.0/16

  • --metal-lb-config-address-pools:添加此标志可指定 MetalLB 负载均衡器要使用的地址池的配置。该标志的值采用以下格式:
    --metal-lb-config-address-pool 'pool=NAME,avoid-buggy-ips=True|False,manual-assign=True|False,addresses=IP_ADDRESS_RANGE_1;IP_ADDRESS_RANGE_2;...' \

    该值的各部分分别以关键字 poolavoid-buggy-ipmanual-assignaddresses 开头。每个细分之间用英文逗号分隔。

    • pool:您为池选择的名称。
    • avoid-buggy-ips1:如果将该部分设置为 True,则 MetalLB 控制器不会将以 .0 或 .255 结尾的 IP 地址分配给 Service。这样可以避免有问题的用户设备错误地丢弃发送到这些特殊 IP 地址的流量。如果未指定,则默认为 False
    • manual-assign:如果您不希望 MetalLB 控制器自动将此池中的 IP 地址分配给 Service,请将该部分设置为 True。之后,开发者便可以创建 LoadBalancer 类型的 Service 并手动指定池中的一个地址。如果未指定,则将 manual-assign 设置为 False
    • addresses 列表中:每个地址都必须是采用 CIDR 表示法或带连字符的范围格式的范围。如需指定池中的单个 IP 地址(例如对于入站流量 VIP),请使用 /32(采用 CIDR 表示法,例如 192.0.2.1/32)。

    请注意以下几点:

    • 用英文单引号将整个值括起来。
    • 不允许使用空格。
    • 用英文分号分隔每个 IP 地址范围。

    例如:

    --metal-lb-config-address-pool 'pool=pool1,avoid-buggy-ips=True,manual-assign=True,addresses=10.251.134.80/32;192.168.1.0/26;192.168.1.2-192.168.1.3'
  • CONTROL_PLANE_VIP:您已选择在负载均衡器上为用户集群的 Kubernetes API 服务器配置的 IP 地址。

    示例:--control-plane-vip=203.0.113.3

  • INGRESS_VIP:您选择在负载均衡器上为 Ingress 代理配置的 IP 地址。

    示例:--ingress-vip=10.251.134.80

    Ingress VIP 的 IP 地址必须属于某一个 MetalLB 地址池。

  • --static-ip-config-ip-blocks:指定用户集群中工作器节点的默认网关、子网掩码和静态 IP 地址列表。该标志的值采用以下格式:
    --static-ip-config-ip-blocks 'gateway=GATEWAY,netmask=NETMASK,ips=IP_ADDRESS_1;IP_ADDRESS_2 HOST_2;...'

    该值的各部分分别以关键字 gatewaynetmaskips 开头。用逗号分隔各个部分。

    请注意以下几点:

    • 用英文单引号将整个值括起来。
    • 除了在 IP 地址和主机名之间,其他地方不允许使用空格。

    在 IP 地址列表中:

    • 您可以指定单个 IP 地址或 IP 地址的 CIDR 块。
    • 用分号分隔每个 IP 地址或 CIDR 块。
    • 对于单个 IP 地址,您可以选择在 IP 地址后指定主机名。用空格分隔 IP 地址和主机名。如果未指定主机名,GKE on VMware 会将 vSphere 中的虚拟机名称用作主机名。
    • 如果您指定 CIDR 块,请不要为主机名指定值。

    例如:

    --static-ip-config-ip-blocks 'gateway=172.16.23.254,netmask=255.255.252.0,ips=172.16.20.10;172.16.20.11 host2;172.16.20.12/30'
  • DNS_SERVER:虚拟机的 DNS 服务器的 IP 地址列表(以英文逗号分隔)。
  • DNS_SEARCH_DOMAIN:供主机使用的 DNS 搜索网域列表(以英文逗号分隔)。这些搜索域会用作网域搜索列表的一部分。

    例如:

    --dns-search-domains example.com,examplepetstore.com
  • NTP_SERVER:供虚拟机使用的时间服务器的 IP 地址列表(以英文逗号分隔)。

F5 BIG-IP 和 DHCP

此示例展示了如何创建具有 F5 BIG-IP 负载均衡器的用户集群,并使用 DHCP 服务器获取集群节点的 IP 地址。

只有在管理员集群使用 F5 时,您才能为用户集群使用 F5。请务必先安装并配置 F5 BIG-IP ADC,然后再将其与 GKE on VMware 集成。

gcloud container vmware clusters create USER_CLUSTER_NAME \
    --project=FLEET_HOST_PROJECT_ID \
    --admin-cluster-membership=ADMIN_CLUSTER_NAME \
    --admin-cluster-membership-project=FLEET_HOST_PROJECT_ID \
    --admin-cluster-membership-location=ADMIN_CLUSTER_REGION \
    --location=REGION \
    --version=VERSION \
    --admin-users=YOUR_EMAIL_ADDRESS \
    --admin-users=ANOTHER_EMAIL_ADDRESS \
    --service-address-cidr-blocks=SERVICE_CIDR_BLOCK \
    --pod-address-cidr-blocks=POD_CIDR_BLOCK \
    --f5-config-address=F5_CONFIG_ADDRESS \
    --f5-config-partition=F5_CONFIG_PARTITION \
    --f5-config-snat-pool=F5_CONFIG_SNAT_POOL \
    --control-plane-vipCONTROL_PLANE_VIP \
    --ingress-vip=INGRESS_VIP \
    --enable-dhcp
  • USER_CLUSTER_NAME:您为用户集群选择的名称。创建集群后,此名称便无法更改。 该名称必须:
    • 最多包含 40 个字符
    • 只能包含小写字母数字字符或连字符 (-)
    • 以字母字符开头
    • 以字母数字字符结尾
  • FLEET_HOST_PROJECT_ID:您要在其中创建集群的项目的 ID。指定的项目也会用作舰队宿主项目。该项目必须是管理员集群注册到的项目。创建用户集群后,它会自动注册到所选项目的舰队。集群创建后,舰队宿主项目便无法更改。
  • ADMIN_CLUSTER_NAME:管理用户集群的管理员集群的名称。在 --admin-cluster-membership 标志中,您可以使用完全指定的集群名称,格式如下:
        projects/FLEET_HOST_PROJECT_ID/locations/ADMIN_CLUSTER_REGION/memberships/ADMIN_CLUSTER_NAME

    或者,您也可以将 --admin-cluster-membership 设置为管理员集群的名称,如示例命令所示。如果仅使用管理员集群的名称,请使用 --admin-cluster-membership-project 设置管理员集群的项目 ID,使用 --admin-cluster-membership-location 设置位置。管理员集群的位置是 global 或 Google Cloud 区域。如果您需要查找该区域,请运行 gcloud container fleet memberships list

  • REGION:运行 GKE On-Prem API (gkeonprem.googleapis.com)、舰队服务 (gkehub.googleapis.com) 和 Connect 服务 (gkeconnect.googleapis.com) 的 Google Cloud 区域。请指定 us-west1 或其他受支持的区域。 创建集群后,此区域便无法更改。此设置指定存储以下内容的区域:
    • GKE On-Prem API 管理集群生命周期所需的用户集群元数据
    • 系统组件的 Cloud Logging 和 Cloud Monitoring 数据
    • Cloud Audit Logs 创建的管理员审核日志

    集群名称、项目和位置共同在 Google Cloud 中唯一标识集群。

  • VERSION:用户集群的 GKE on VMware 版本。
  • YOUR_EMAIL_ADDRESSANOTHER_EMAIL_ADDRESS:如果您没有添加 --admin-users 标志,作为集群创建者,默认情况下您将获得集群管理员权限。但是,如果您添加 --admin-users 以将其他用户指定为管理员,则会替换默认值,并且需要同时添加您的电子邮件地址和另一个管理员的电子邮件地址。例如,如需添加两个管理员:
        --admin-users=sara@example.com \
        --admin-users=amal@example.com

    创建集群时,GKE On-Prem API 会将 Kubernetes 基于角色的访问权限控制 (RBAC) 政策应用于集群,从而向您和其他管理员用户授予 Kubernetes clusterrole/cluster-admin 角色,该角色提供对集群内所有命名空间中所有资源的完整访问权限。

  • SERVICE_CIDR_BLOCK:用于集群中 Service 的 IP 地址范围(采用 CIDR 格式)。范围必须至少为 /24。

    示例:--service-address-cidr-blocks=10.96.0.0/20

  • POD_CIDR_BLOCK:用于集群中 Pod 的 IP 地址范围(采用 CIDR 格式)。范围必须至少为 /18。

    示例:--pod-address-cidr-blocks=192.168.0.0/16

  • F5_CONFIG_ADDRESS:F5 BIG-IP 负载均衡器的地址。

  • F5_CONFIG_PARTITION:您为用户集群创建的 BIG-IP 分区的名称。

  • F5_CONFIG_SNAT_POOL:SNAT 池的名称(如果适用)。

  • CONTROL_PLANE_VIP:您已选择在负载均衡器上为用户集群的 Kubernetes API 服务器配置的 IP 地址。

    示例:--control-plane-vip=203.0.113.3

  • INGRESS_VIP:您选择在负载均衡器上为 Ingress 代理配置的 IP 地址。

    示例:--ingress-vip=10.251.134.80

    Ingress VIP 的 IP 地址必须属于某一个 MetalLB 地址池。

  • --enable-dhcp:如果您希望集群节点从您提供的 DHCP 服务器中获取其 IP 地址,请添加 --enable-dhcp。如果要为集群节点提供静态 IP 地址,或者要设置手动负载均衡,请勿添加此标志。

手动负载平衡器和静态 IP

此示例展示了如何创建具有手动负载均衡器的用户集群,并为集群节点分配静态 IP 地址。

只有在管理员集群使用手动负载均衡器时,您才能为用户集群使用手动负载均衡器。在 GKE on VMware 中,Kubernetes API 服务器、Ingress 代理和用于日志汇总的插件服务均由 LoadBalancer 类型的 Kubernetes Service 公开。为这些 Service 自行选择 30000 到 32767 范围内的 nodePort 值。对于入站流量代理,请选择一个适用于 HTTP 和 HTTPS 流量的 nodePort 值。如需了解详情,请参阅启用手动负载均衡模式

gcloud container vmware clusters create USER_CLUSTER_NAME \
    --project=FLEET_HOST_PROJECT_ID \
    --admin-cluster-membership=ADMIN_CLUSTER_NAME \
    --admin-cluster-membership-project=FLEET_HOST_PROJECT_ID \
    --admin-cluster-membership-location=ADMIN_CLUSTER_REGION \
    --location=REGION \
    --version=VERSION \
    --admin-users=YOUR_EMAIL_ADDRESS \
    --admin-users=ANOTHER_EMAIL_ADDRESS \
    --service-address-cidr-blocks=SERVICE_CIDR_BLOCK \
    --pod-address-cidr-blocks=POD_CIDR_BLOCK \
    --control-plane-vip=CONTROL_PLANE_VIP \
    --control-plane-node-port=CONTROL_PLANE_NODE_PORT \
    --ingress-vip=INGRESS_VIP \
    --ingress-http-node-port=INGRESS_HTTP_NODE_PORT \
    --ingress-https-node-port=INGRESS_HTTPS_NODE_PORT \
    --konnectivity-server-node-port=KONNECTIVITY_SERVER_NODE_PORT

替换以下内容:

  • USER_CLUSTER_NAME:您为用户集群选择的名称。创建集群后,此名称便无法更改。 该名称必须:
    • 最多包含 40 个字符
    • 只能包含小写字母数字字符或连字符 (-)
    • 以字母字符开头
    • 以字母数字字符结尾
  • FLEET_HOST_PROJECT_ID:您要在其中创建集群的项目的 ID。指定的项目也会用作舰队宿主项目。该项目必须是管理员集群注册到的项目。创建用户集群后,它会自动注册到所选项目的舰队。集群创建后,舰队宿主项目便无法更改。
  • ADMIN_CLUSTER_NAME:管理用户集群的管理员集群的名称。在 --admin-cluster-membership 标志中,您可以使用完全指定的集群名称,格式如下:
        projects/FLEET_HOST_PROJECT_ID/locations/ADMIN_CLUSTER_REGION/memberships/ADMIN_CLUSTER_NAME

    或者,您也可以将 --admin-cluster-membership 设置为管理员集群的名称,如示例命令所示。如果仅使用管理员集群的名称,请使用 --admin-cluster-membership-project 设置管理员集群的项目 ID,使用 --admin-cluster-membership-location 设置位置。管理员集群的位置是 global 或 Google Cloud 区域。如果您需要查找该区域,请运行 gcloud container fleet memberships list

  • REGION:运行 GKE On-Prem API (gkeonprem.googleapis.com)、舰队服务 (gkehub.googleapis.com) 和 Connect 服务 (gkeconnect.googleapis.com) 的 Google Cloud 区域。请指定 us-west1 或其他受支持的区域。 创建集群后,此区域便无法更改。此设置指定存储以下内容的区域:
    • GKE On-Prem API 管理集群生命周期所需的用户集群元数据
    • 系统组件的 Cloud Logging 和 Cloud Monitoring 数据
    • Cloud Audit Logs 创建的管理员审核日志

    集群名称、项目和位置共同在 Google Cloud 中唯一标识集群。

  • VERSION:用户集群的 GKE on VMware 版本。
  • YOUR_EMAIL_ADDRESSANOTHER_EMAIL_ADDRESS:如果您没有添加 --admin-users 标志,作为集群创建者,默认情况下您将获得集群管理员权限。但是,如果您添加 --admin-users 以将其他用户指定为管理员,则会替换默认值,并且需要同时添加您的电子邮件地址和另一个管理员的电子邮件地址。例如,如需添加两个管理员:
        --admin-users=sara@example.com \
        --admin-users=amal@example.com

    创建集群时,GKE On-Prem API 会将 Kubernetes 基于角色的访问权限控制 (RBAC) 政策应用于集群,从而向您和其他管理员用户授予 Kubernetes clusterrole/cluster-admin 角色,该角色提供对集群内所有命名空间中所有资源的完整访问权限。

  • SERVICE_CIDR_BLOCK:用于集群中 Service 的 IP 地址范围(采用 CIDR 格式)。范围必须至少为 /24。

    示例:--service-address-cidr-blocks=10.96.0.0/20

  • POD_CIDR_BLOCK:用于集群中 Pod 的 IP 地址范围(采用 CIDR 格式)。范围必须至少为 /18。

    示例:--pod-address-cidr-blocks=192.168.0.0/16

  • CONTROL_PLANE_VIP:您已选择在负载均衡器上为用户集群的 Kubernetes API 服务器配置的 IP 地址。

    示例:--control-plane-vip=203.0.113.3

  • CONTROL_PLANE_NODE_PORT:Kubernetes API 服务器的 nodePort 值。

  • INGRESS_VIP:您选择在负载均衡器上为入站流量代理配置的 IP 地址。

    示例:--ingress-vip=203.0.113.4

  • INGRESS_HTTP_NODE_PORT:流向 Ingress 代理的 HTTP 流量的 nodePort 值。

  • INGRESS_HTTPS_NODE_PORT:流向 Ingress 代理的 HTTPS 流量的 nodePort 值。

  • KONNECTIVITY_SERVER_NODE_PORT:Konnectivity 服务器的 nodePort 值。

  • --static-ip-config-ip-blocks:指定用户集群中工作器节点的默认网关、子网掩码和静态 IP 地址列表。该标志的值采用以下格式:
    --static-ip-config-ip-blocks 'gateway=GATEWAY,netmask=NETMASK,ips=IP_ADDRESS_1;IP_ADDRESS_2 HOST_2;...'

    该值的各部分分别以关键字 gatewaynetmaskips 开头。用逗号分隔各个部分。

    请注意以下几点:

    • 用英文单引号将整个值括起来。
    • 除了在 IP 地址和主机名之间,其他地方不允许使用空格。

    在 IP 地址列表中:

    • 您可以指定单个 IP 地址或 IP 地址的 CIDR 块。
    • 用分号分隔每个 IP 地址或 CIDR 块。
    • 对于单个 IP 地址,您可以选择在 IP 地址后指定主机名。用空格分隔 IP 地址和主机名。如果未指定主机名,GKE on VMware 会将 vSphere 中的虚拟机名称用作主机名。
    • 如果您指定 CIDR 块,请不要为主机名指定值。

    例如:

    --static-ip-config-ip-blocks 'gateway=172.16.23.254,netmask=255.255.252.0,ips=172.16.20.10;172.16.20.11 host2;172.16.20.12/30'
  • DNS_SERVER:虚拟机的 DNS 服务器的 IP 地址列表(以英文逗号分隔)。
  • DNS_SEARCH_DOMAIN:供主机使用的 DNS 搜索网域列表(以英文逗号分隔)。这些搜索域会用作网域搜索列表的一部分。

    例如:

    --dns-search-domains example.com,examplepetstore.com
  • NTP_SERVER:供虚拟机使用的时间服务器的 IP 地址列表(以英文逗号分隔)。

控制平面标志

如果您要为控制平面配置使用非默认值,请添加以下一个或多个标志:

  • --cpus=vCPUS:用户集群的每个控制平面节点的 vCPU 数量(最少 4 个)。如果未指定,则默认值为 4 个 vCPU。

  • --memory=MEMORY:用户集群的每个控制平面的内存大小(以兆比字节 (MiB) 为单位)。最小值为 8192,并且必须是 4 的倍数。如果未指定,则默认值为 8192。

  • --replicas=NODES:您的用户集群的控制平面节点数量。例如,您可以为开发环境选择 1 个控制平面节点,为生产环境选择 3 个控制平面节点,从而实现高可用性 (HA)。

  • --enable-auto-resize:如果要为用户集群启用控制平面节点的自动调整大小功能,请添加 --enable-auto-resize。调整大小是指自动调整分配给节点的 vCPU 和内存资源。启用后,用户集群控制平面节点会根据用户集群中的工作器节点数量调整大小。因此,当您向用户集群添加更多工作器节点时,控制平面节点的大小会增加。

  • --enable-control-plane-v2:如果要启用 Controlplane V2,请添加 --enable-control-plane-v2。启用 Controlplane V2 后,用户集群的控制平面在用户集群本身中的一个或多个节点上运行。默认情况下,用户集群的控制平面在管理员集群的一个或多个节点上运行(称为 kubeception 模型)。启用 Controlplane V2 时,--cpus--memory 的值适用于用户集群中的控制平面节点。节点数由您在 --control-plane-ip-block 中输入的 IP 地址数量决定。未启用 Controlplane V2 时,--cpus--memory--replicas 的值适用于管理员集群中的控制平面节点。请确保为管理员集群预留足够的 IP 地址

    如果启用 Controlplane V2,则还必须指定以下标志:

    • --dns-servers=DNS_SERVER_1,...:虚拟机的 DNS 服务器的 IP 地址列表(以英文逗号分隔)。

    • --ntp-servers=NTP_SERVER_1,...:供虚拟机使用的时间服务器的 IP 地址列表(以英文逗号分隔)。

    • --control-plane-ip-block,其格式如下:

        --control-plane-ip-block 'gateway=CP_GATEWAY,netmask=CP_NETMASK,ips=CP_IP_ADDRESS_1;CP_IP_ADDRESS_2 CP_HOST_2'

      该值包含以关键字 gatewaynetmaskips 开头的细分。用逗号分隔各个部分。

      请注意以下几点:

      • 用英文单引号将整个值括起来。
      • 除了在 IP 地址和主机名之间,其他地方不允许使用空格。

        在 IP 地址列表中:

      • 您可以指定单个 IP 地址或 IP 地址的 CIDR 块。

      • 用分号分隔每个 IP 地址或 CIDR 块。

      • 对于单个 IP 地址,您可以选择在 IP 地址后指定主机名。用空格分隔 IP 地址和主机名。

      • 如果您指定 CIDR 块,请不要为主机名指定值。

        例如:

        --control-plane-ip-block 'gateway=192.168.0.1,netmask=255.0.0.0,ips=192.168.1.1;192.168.1.2 hostname-2;192.168.2.2/28`
        
    • 可选:--dns-search-domains=DNS_SEARCH_DOMAIN_1,...:供主机使用的 DNS 搜索网域列表(以英文逗号分隔)。这些网域会用作网域搜索列表的一部分。

      例如:

      --dns-search-domains example.com,examplepetstore.com

    如需查看标志及其说明的完整列表,请参阅 gcloud CLI 参考文档

    vSphere 标志

    如果需要,请指定以下可选标志:

  • --disable-aag-config:如果您不添加此标志,则系统会自动为用户集群的节点创建 VMware 分布式资源调度器 (DRS) 反亲和性规则,使其分布在数据中心的至少 3 个物理主机上。确保您的 vSphere 环境符合要求。如果您的集群不符合要求,请添加此标志。

  • --disable-vsphere-csi:如果您不添加此标志,则 vSphere 容器存储接口 (CSI) 组件会部署在用户集群中。CSI 驱动程序运行在 vSphere 中部署的原生 Kubernetes 集群中,用于在 vSphere 存储上预配永久性卷。如需了解详情,请参阅使用 vSphere 容器存储接口驱动程序。 如果您不想部署 CSI 组件,请添加此标志。

    如需查看标志及其说明的完整列表,请参阅 gcloud CLI 参考文档

    在运行 gcloud 命令创建集群之前,您可能需要添加 --validate-only 以验证您在 gcloud 命令的标志中指定的配置。准备好创建集群后,请移除此标志并运行该命令。

    此命令的输出类似如下所示:

    Waiting for operation [projects/example-project-12345/locations/us-west1/operations/operation-1679543737105-5f7893fd5bae9-942b3f97-75e59179] to complete.
    

    在示例输出中,字符串 operation-1679543737105-5f7893fd5bae9-942b3f97-75e59179 是长时间运行的操作的 OPERATION_ID。您可以使用以下命令了解该操作的状态:

    gcloud container vmware operations describe OPERATION_ID \
      --project=FLEET_HOST_PROJECT_ID \
      --location=REGION
    

    如需了解详情,请参阅 gcloud container vmware operations

    创建用户集群需要 15 分钟或更长时间。您可以在 Google Cloud 控制台中的 Anthos 集群页面上查看集群。

    创建节点池

    创建集群后,您至少需要创建一个节点池才能部署工作负载。

    gcloud container vmware node-pools create NODE_POOL_NAME \
    --cluster=USER_CLUSTER_NAME  \
    --project=FLEET_HOST_PROJECT_ID \
    --location=REGION \
    --image-type=IMAGE_TYPE  \
    --boot-disk-size=BOOT_DISK_SIZE \
    --cpus=vCPUS \
    --memory=MEMORY \
    --replicas=NODES \
    --enable-load-balancer
    

    替换以下内容:

  • NODE_POOL_NAME:您为节点池选择的名称。该名称必须:

    • 最多包含 40 个字符
    • 只能包含小写字母数字字符或连字符 (-)
    • 以字母字符开头
    • 以字母数字字符结尾
  • USER_CLUSTER_NAME:新创建的用户集群的名称。

  • FLEET_HOST_PROJECT_ID:集群在其中注册的项目的 ID。

  • REGION:您在创建集群时指定的 Google Cloud 区域。

  • IMAGE_TYPE:要在节点池中的虚拟机上运行的操作系统映像类型。设置为以下其中一项:ubuntu_containerdcos

  • BOOT_DISK_SIZE:池中每个节点的启动磁盘的大小(以吉比字节 (GiB) 为单位)。最小值为 40 GiB。

  • vCPUs:节点池中每个节点的 vCPU 数量。最小值为 4。

  • MEMORY:池中每个节点的内存大小(以兆比字节 (MiB) 为单位)。每个用户集群工作器节点的最小值为 8192 MiB,并且值必须是 4 的倍数。

  • NODES:节点池中的节点数。最小值为 3。

  • 如果您使用 MetalLB 作为负载均衡器,则可以选择添加 --enable-load-balancer(如果您想允许 MetalLB speaker 在池中的节点上运行)。必须至少在一个节点池中启用 MetalLB。如果不添加此标志,则必须创建另一个用于 MetalLB 的节点池。

    如需了解可选标志,请参阅添加节点池gcloud CLI 参考文档

gcloud 命令示例

MetalLB 和 DHCP

gcloud container vmware clusters create user-cluster-1 \
    --project=example-project-12345 \
    --location=us-west1 \
    --admin-cluster-membership=projects/example-project-12345/locations/global/memberships/admin-cluster-1 \
    --version=1.28.200-gke.111 \
    --admin-users=sara@example.com \
    --admin-users=amal@example.com \
    --enable-dhcp \
    --service-address-cidr-blocks=10.96.232.0/24 \
    --pod-address-cidr-blocks=192.168.0.0/16 \
    --metal-lb-config-address-pools='pool=lb-pool-1,manual-assign=False,avoid-buggy-ips=True,addresses=10.251.133.0/24;10.251.134.80/32;10.251.134.81/32' \
    --metal-lb-config-address-pools='pool=lb-pool-2,manual-assign=True,addresses=172.16.20.62/32' \
    --control-plane-vip=172.16.20.61 \
    --ingress-vip=172.16.20.62

如需了解 --metal-lb-config-address-pools 标志,请参阅负载平衡器

MetalLB 和静态 IP

gcloud container vmware clusters create user-cluster-3 \
    --project=example-project-12345 \
    --location=europe-west1 \
    --admin-cluster-membership=projects/example-project-12345/locations/global/memberships/admin-cluster-1 \
    --version=1.28.200-gke.111 \
    --admin-users=sara@example.com \
    --admin-users=amal@example.com \
    --static-ip-config-ip-blocks='gateway=172.16.23.254,netmask=255.255.252.0,ips=172.16.20.10 user-vm-1;172.16.20.11 user-vm-2' \
    --static-ip-config-ip-blocks='gateway=172.16.23.255,netmask=255.255.252.0,ips=172.16.20.12 user-vm-3;172.16.20.13 extra-vm' \
    --dns-servers=203.0.113.1,198.51.100.1 \
    --dns-search-domains=example.com,altostrat.com \
    --ntp-servers=216.239.35.4,216.239.35.5 \
    --service-address-cidr-blocks=10.96.232.0/24 \
    --pod-address-cidr-blocks=192.168.0.0/16 \
    --metal-lb-config-address-pools='pool=lb-pool-1,manual-assign=False,avoid-buggy-ips=True,addresses=10.251.133.0/24;10.251.134.80/32;10.251.134.81/32' \
    --metal-lb-config-address-pools='pool=lb-pool-2,manual-assign=True,addresses=172.16.20.62/32' \
    --control-plane-vip=172.16.20.61 \
    --ingress-vip=172.16.20.62

F5 BIG-IP 和 DHCP

gcloud container vmware clusters create user-cluster-2 \
    --project=example-project-12345 \
    --location=us-west1 \
    --admin-cluster-membership=projects/example-project-12345/locations/global/memberships/admin-cluster-1 \
    --version=1.28.200-gke.111 \
    --admin-users=sara@example.com \
    --admin-users=amal@example.com \
    --enable-dhcp \
    --service-address-cidr-blocks=10.96.232.0/24 \
    --pod-address-cidr-blocks=192.168.0.0/16 \
    --f5-config-address=203.0.113.2 \
    --f5-config-partition=my-f5-admin-partition \
    --control-plane-vip=172.16.20.61 \
    --ingress-vip=172.16.20.62

如需了解 F5 标志,请参阅负载平衡器

手动负载平衡器和静态 IP

gcloud container vmware clusters create user-cluster-4 \
    --project=example-project-12345 \
    --location=asia-east1 \
    --admin-cluster-membership=projects/example-project-12345/locations/global/memberships/admin-cluster-1 \
    --version=1.28.200-gke.111 \
    --admin-users=sara@example.com \
    --admin-users=amal@example.com \
    --static-ip-config-ip-blocks='gateway=172.16.23.254,netmask=255.255.252.0,ips=172.16.20.10 user-vm-1;172.16.20.11 user-vm-2' \
    --static-ip-config-ip-blocks='gateway=172.16.23.255,netmask=255.255.252.0,ips=172.16.20.12 user-vm-3;172.16.20.13 extra-vm' \
    --dns-servers=203.0.113.1,198.51.100.1  \
    --ntp-servers=216.239.35.4,216.239.35.5 \
    --service-address-cidr-blocks=10.96.232.0/24 \
    --pod-address-cidr-blocks=192.168.0.0/16 \
    --control-plane-vip=172.16.20.61 \
    --control-plane-node-port=30968 \
    --ingress-vip=172.16.20.62 \
    --ingress-http-node-port=32527 \
    --ingress-https-node-port=30139 \
    --konnectivity-server-node-port=30969

Terraform

准备工作

  1. 获取管理员集群的名称和舰队成员资格位置:

    gcloud container fleet memberships list \
        --project=FLEET_HOST_PROJECT_ID
    

    FLEET_HOST_PROJECT_ID 替换为管理员集群注册到的项目的 ID。

    输出类似于以下内容:

    NAME             EXTERNAL_ID                           LOCATION
    admin-cluster-1  bb7803b4-8438-4b22-859f-4559b4b29072  global
    admin-cluster-2  ee16ee2b-6ec0-49fc-9413-3c89cbc70854  global
    admin-cluster-3  fc2b7ef5-39ff-4b63-b919-04c5adc67be4  us-west1
    

    该位置指定了舰队和 Connect 服务的运行位置。1.28 版之前创建的管理员集群由全局舰队和连接服务管理。在 1.28 及更高版本中,您可以在创建集群时指定 global 或 Google Cloud 区域。

  2. 获取可用版本的列表:

    gcloud container vmware clusters query-version-config \
        --admin-cluster-membership=ADMIN_CLUSTER_NAME \
        --admin-cluster-membership-project=FLEET_HOST_PROJECT_ID \
        --admin-cluster-membership-location=ADMIN_CLUSTER_REGION \
        --location=REGION
    

    替换以下内容:

    • ADMIN_CLUSTER_NAME:管理员集群的名称。

    • FLEET_HOST_PROJECT_ID:管理员集群注册到的项目的 ID。

    • ADMIN_CLUSTER_REGION:管理员集群的舰队成员区域。可以是全球区域,也可以是 Google Cloud 区域。使用 gcloud container fleet memberships list 输出中的管理员集群的位置。

    • REGION:创建集群时将使用的 Google Cloud 区域。这是运行 GKE On-Prem API 以及舰队和 Connect 服务的区域。请指定 us-west1 或其他受支持的区域

    此命令的输出类似如下所示:

    versions:
    - isInstalled: true
      version: 1.14.3-gke.25
    - version: 1.14.4-gke.54
    - version: 1.15.0-gke.581
    

    可用于创建用户集群的版本带有 isInstalled=true 注解,这意味着管理员集群具有管理该版本的用户集群所需的特定于版本的组件。如果您要使用其他可用版本创建用户集群,请参阅安装比管理员集群版本更高的版本

示例

您可以使用以下基本配置示例,创建具有捆绑式 MetalLB 负载均衡器的用户集群和一个节点池。

如需了解详情和其他示例,请参阅 google_gkeonprem_vmware_cluster 参考文档

terraform.tfvars 中设置变量

此示例提供了一个要传入到 main.tf 的示例变量文件,介绍了如何配置捆绑式 MetalLB 负载均衡器并允许集群节点从您提供的 DHCP 服务器获取其 IP 地址。

  1. 克隆 anthos-samples 代码库并切换到 Terraform 示例所在的目录:

    git clone https://github.com/GoogleCloudPlatform/anthos-samples
    cd anthos-samples/anthos-onprem-terraform/avmw_user_cluster_metallb
    
  2. 复制 terraform.tfvars.sample 文件:

    cp terraform.tfvars.sample terraform.tfvars
    
  3. 修改 terraform.tfvars 中的参数值。

    project_id                  = "FLEET_HOST_PROJECT_ID"
    region                      = "REGION"
    admin_cluster_name          = "ADMIN_CLUSTER_NAME"
    on_prem_version             = "VERSION"
    admin_user_emails           = ["YOUR_EMAIL_ADDRESS", "ADMIN_2_EMAIL_ADDRESS"]
    cluster_name                = "avmw-user-cluster-metallb"
    control_plane_node_cpus     = 4
    control_plane_node_memory   = 8192
    control_plane_node_replicas = 3
    control_plane_vip           = "CONTROL_PLANE_VIP"
    ingress_vip                 = "INGRESS_VIP"
    lb_address_pools            = [
        { name = "lbpool_1", addresses = ["10.200.0.51-10.200.0.70"] }
    ]
    

    以下列表介绍了这些变量:

    • project_id:项目 ID,您将在此项目中创建集群。指定的项目也会用作舰队宿主项目。该项目必须是管理员集群注册到的项目。创建用户集群后,它会自动注册到所选项目的舰队。集群创建后,舰队宿主项目便无法更改。

    • region:运行 GKE On-Prem API (gkeonprem.googleapis.com)、舰队服务 (gkehub.googleapis.com) 和 Connect 服务 (gkeconnect.googleapis.com) 的 Google Cloud 区域。指定 us-west1 或其他受支持的区域

    • admin_cluster_name:管理用户集群的管理员集群的名称。该示例假定管理员集群使用全球区域作为区域。如果您有一个区域级管理员集群:

      1. 使用文本编辑器打开 main.tf
      2. 搜索 admin_cluster_membership,如下所示:
      admin_cluster_membership = "projects/${var.project_id}/locations/global/memberships/${var.admin_cluster_name}"
      1. global 更改为管理员集群使用的区域并保存文件。
    • on_prem_version:用户集群的 GKE on VMware 版本。通常,您需要指定与管理员集群相同的版本。如需指定更高版本,请安装比管理员集群版本更高的版本。如果您不知道管理员集群版本,请运行 gcloud container vmware clusters query-version-config,这是安装比管理员集群版本更高的版本中的第一步。

    • admin_user_emails:将被授予集群管理员权限的用户的电子邮件地址列表。如果您打算管理集群,请务必添加您的电子邮件地址。

      创建集群时,GKE On-Prem API 会将 Kubernetes 基于角色的访问权限控制 (RBAC) 政策应用于集群,以便为管理员用户授予 Kubernetes clusterrole/cluster-admin 角色,该角色提供对所有命名空间中集群内所有资源的完整访问权限。此角色还可让用户使用其 Google 身份登录控制台。

    • cluster_name:您为用户集群选择的名称。创建集群后,此名称便无法更改。该名称必须:

      • 最多包含 40 个字符
      • 只能包含小写字母数字字符或连字符 (-)
      • 以字母字符开头
      • 以字母数字字符结尾
    • control_plane_node_cpus:用户集群的每个控制平面节点的 vCPU 数量。最少 4 个 vCPU。

    • control_plane_node_memory:用户集群的每个控制平面的内存大小(以兆比字节 (MiB) 为单位)。最小值为 8192,并且必须是 4 的倍数。

    • control_plane_node_replicas:用户集群的控制平面节点数量。例如,您可以为开发环境选择 1 个控制平面节点,为高可用性 (HA) 生产环境选择 3 个控制平面节点。

    • control_plane_vip:您已选择在负载均衡器上为用户集群的 Kubernetes API 服务器配置的虚拟 IP 地址 (VIP)。

    • ingress_vip:您已选择在负载均衡器上为 Ingress 代理配置的 IP 地址。

    • lb_address_pools:定义 MetalLB 负载均衡器要使用的地址池的映射列表。入站流量 VIP 必须在其中一个池内。指定以下内容:

      • name:池的名称。
      • addresses:采用 CIDR 表示法或带连字符的范围格式的地址范围。如需指定池中的单个 IP 地址(例如对于入站流量 VIP),请使用 /32(采用 CIDR 表示法,例如 192.0.2.1/32)。

      将示例 IP 地址替换为您的值,并根据需要添加其他地址池。

  4. 将更改保存在 terraform.tfvars 中。 如果您不想对 main.tf 进行任何可选更改,请跳至后面的部分:创建集群和一个节点池

可选:在 main.tf 中配置集群设置

本部分介绍了您可以在 main.tf 中进行的一些可选配置更改。在进行更改之前,请创建 main.tf 的备份:

cp main.tf main.tf.bak

工作器节点 IP 寻址模式

默认情况下,main.tf 将集群配置为使用您提供的 DHCP 服务器,为集群的工作器节点分配 IP 地址。DHCP 通过在 network_config 块中添加 dhcp_config 映射进行配置。如果您要为工作器节点提供静态 IP 地址,请对 main.tf 进行以下更改:

  1. 替换 network_config 块并添加 static_ip_config 块。例如:

      network_config {
        service_address_cidr_blocks = ["10.96.0.0/12"]
        pod_address_cidr_blocks = ["192.168.0.0/16"]
        host_config {
          dns_servers = ["10.254.41.1"]
          ntp_servers = ["216.239.35.8"]
        }
        static_ip_config {
          ip_blocks {
            netmask = "255.255.252.0"
            gateway = "10.251.31.254"
            ips {
              ip = "10.251.30.153"
              hostname = "vm-1"
            }
            ips {
              ip = "10.251.31.206"
              hostname = "vm-2"
            }
            ips {
              ip = "10.251.31.193"
              hostname = "vm-3"
            }
            ips {
              ip = "10.251.30.230"
              hostname = "vm-4"
            }
          }
        }
      }
    
  2. 将以下各项替换为您的值:

    • service_address_cidr_blocks:用于集群中 Service 的 IP 地址范围(采用 CIDR 格式)。范围必须至少为 /24。

    • pod_address_cidr_blocks:用于集群中 Pod 的 IP 地址范围(采用 CIDR 格式)。范围必须至少为 /18。

    • dns_servers:虚拟机的 DNS 服务器的 IP 地址列表。

    • ntp_servers:供虚拟机使用的时间服务器的 IP 地址列表。

    • static_ip_config 块中,将 netmaskgateway 的值替换为您的网络地址。将 iphostname 替换为工作器节点的 IP 地址和主机名。

配置 Controlplane V2

默认情况下,main.tf 会将用户集群的控制平面配置为在管理员集群上的一个或多个节点(称为 kubeception 模型)上运行。如果您愿意,可以启用 Controlplane V2。启用控制平面 V2 后,用户集群的控制平面会在用户集群本身的一个或多个节点上运行。如需配置控制平面 V2,请对 main.tf 进行以下更改:

  1. 在包含 admin_cluster_membership 的行后添加以下行:

      enable_control_plane_v2 = "true"
    
  2. control_plane_v2_config 映射添加到 network_config 块,例如:

      control_plane_v2_config {
        control_plane_ip_block {
          netmask = "255.255.252.0"
          gateway = "10.250.71.254"
          ips {
            ip = "10.250.68.54"
            hostname = "cpv2-vm1"
          }
          ips {
            ip = "10.250.68.128"
            hostname = "cpv2-vm2"
          }
          ips {
            ip = "10.250.71.50"
            hostname = "cpv2-vm3"
          }
        }
      }
    
  3. netmaskgateway 的值替换为您网络中的 IP 地址。将 iphostname 替换为您的控制平面节点的 IP 地址。

创建集群和一个节点池

  1. 初始化并创建 Terraform 方案:

    terraform init
    

    Terraform 会安装任何所需的库,例如 Google Cloud 提供程序。

  2. 检查配置,并根据需要进行更改:

    terraform plan
    
  3. 应用 Terraform 方案以创建用户集群:

    terraform apply
    

    创建用户集群大约需要 15 分钟或更长时间,另外需要 15 分钟来创建节点池。您可以在 Google Cloud 控制台的 Anthos 集群页面上查看集群。

安装比管理员集群版本更高的版本

管理员集群可以管理不同版本的用户集群。如果您要创建比管理员集群版本更高的用户集群,则需要下载并部署管理员集群管理该版本的用户集群所需的组件,如下所示:

  1. 获取可用版本的列表:

    gcloud container vmware clusters query-version-config \
        --admin-cluster-membership=ADMIN_CLUSTER_NAME \
        --admin-cluster-membership-project=FLEET_HOST_PROJECT_ID \
        --location=REGION
    

    替换以下内容:

    • ADMIN_CLUSTER_NAME:管理员集群的名称。

    • FLEET_HOST_PROJECT_ID:管理员集群注册到的项目的 ID。

    • REGION:运行 GKE On-Prem API 的 Google Cloud 区域。这是您在创建用户集群时指定的区域。请指定 us-west1 或其他受支持的区域

    此命令的输出类似如下所示:

    versions:
    - isInstalled: true
      version: 1.14.3-gke.25
    - version: 1.14.4-gke.54
    - version: 1.15.0-gke.581
    

    管理员集群上安装的版本带有 isInstalled=true 注解。

  2. 如果您尚未在 GKE On-Prem API 中注册管理员集群,请执行此操作。在 GKE On-Prem API 中注册集群后,您无需再次执行此步骤。

  3. 下载新版本的组件并将其部署到管理员集群中:

    gcloud vmware admin-clusters update ADMIN_CLUSTER_NAME \
        --project=FLEET_HOST_PROJECT_ID \
        --location=REGION \
        --required-platform-version=VERSION

    此命令会将您在 --required-platform-version 中指定版本的组件下载到管理员集群,然后部署组件。 您现在可以创建具有指定版本的用户集群。

问题排查

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

后续步骤