在 Compute Engine 虚拟机上创建 GKE on Bare Metal 管理员集群和用户集群

本页面介绍如何在 Compute Engine 虚拟机 (VM) 上创建 GKE on Bare Metal 用户集群和管理员集群。提供的脚本为管理员集群和用户集群节点以及管理员工作站创建 Compute Engine 虚拟机。

管理员工作站托管在安装期间预配集群的命令行界面 (CLI) 工具和配置文件,以及在安装后与预配的集群交互的 CLI 工具。该脚本在管理员工作站虚拟机上安装 CLI 工具。

用户集群是运行容器化工作负载的 Kubernetes 集群。它由控制平面节点和工作器节点组成。用户集群必须包含一个或多个运行用户工作负载的工作器节点。管理员集群是管理一个或多个用户集群的 Kubernetes 集群,它帮助创建、更新和删除用户集群。管理员集群仅包含控制平面节点。如需了解详情,请参阅管理员集群和用户集群部署

该脚本会在虚拟机之间配置虚拟可扩展 LAN (VXLAN) 叠加网络,并准备虚拟机以创建集群。(可选)该脚本会创建管理员集群,或者您也可以选择自行创建管理员集群,以了解 GKE on Bare Metal 提供的用于创建管理员集群的工具。

借助提供的脚本,您可以快速试用 GKE on Bare Metal,而无需准备任何硬件。完成本页面上的步骤后,您可以获得在 Compute Engine 上运行的有效 GKE on Bare Metal 测试环境。

什么是 GKE On-Prem API?

GKE On-Prem API 是由 Google Cloud 托管的 API,可让您使用 Terraform 和标准 Google Cloud 应用来管理本地集群的生命周期。GKE On-Prem API 在 Google Cloud 的基础架构中运行。Terraform、控制台和 gcloud CLI 是 API 的客户端,它们使用 API 在数据中心内创建集群。

为了管理集群的生命周期,GKE On-Prem API 必须使用您在创建集群时指定的 Google Cloud 区域将有关集群状态的元数据存储在 Google Cloud 中。此元数据可让 API 管理集群生命周期,并且不包含特定于工作负载的数据。

使用 GKE On-Prem API 客户端创建集群时,您需要指定 Google Cloud 项目。创建集群后,它会自动注册到指定项目的舰队。此项目称为舰队宿主项目。集群创建后,舰队宿主项目便无法更改。

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

  6. 请记下项目 ID,因为您需要用它来设置本页面上的脚本和命令中使用的环境变量。如果您选择现有项目,请确保您是 Project Owner 或 Project Editor。
  7. 您可以在 Cloud Shell 或运行 Linux 或 macOS 的本地机器上运行该脚本。如果您不使用 Cloud Shell:
    1. 确保您已安装最新的 Google Cloud CLI(用于与 Google Cloud 进行交互的命令行工具)。根据需要更新 gcloud CLI 组件:
      gcloud components update

      根据 gcloud CLI 的安装方式,您可能会看到以下消息:“您无法执行此操作,因为此安装已停用 gcloud CLI 组件管理器。 您可以运行以下命令,以获得与此安装相同的结果: 请按照说明复制并粘贴命令以更新组件。

    2. 确定您已安装 kubectl。如果您需要安装 kubectl,请运行以下命令:
      gcloud components install kubectl

创建虚拟机基础架构以及(可选)创建管理员集群

执行以下步骤进行设置并运行脚本。您下载并运行的脚本来自 anthos-samples 代码库。如果您希望在运行脚本之前详细了解该脚本,请参阅下一部分关于脚本

  1. 设置环境变量:

    export PROJECT_ID=PROJECT_ID
    export ADMIN_CLUSTER_NAME=ADMIN_CLUSTER_NAME
    export ON_PREM_API_REGION=ON_PREM_API_REGION
    export ZONE=ZONE
    
    • ON_PREM_API_REGION:GKE On-Prem API 运行并存储其元数据的 Google Cloud 区域。请指定 us-central1 或其他受支持的区域

    • ZONE:在其中创建 Compute Engine 虚拟机的 Google Cloud 可用区。您可以使用 us-central1-a 或任何其他 Compute Engine 可用区

  2. 设置默认项目和可用区:

    gcloud config set project $PROJECT_ID
    gcloud config set compute/zone $ZONE
    

    如果您收到 PERMISSION_DENIED 错误,请仔细检查您输入的项目 ID。如果项目 ID 正确无误,请运行 gcloud auth login 以使用有权访问项目的账号登录 gcloud CLI。

  3. 获取您可以安装的 GKE on Bare Metal 版本的列表:

    gcloud container bare-metal admin-clusters query-version-config \
        --location=ON_PREM_API_REGION | grep 1.16
    

    本文档中的某些说明依赖于 GKE On-Prem API,该 API 支持部分可用的 GKE on Bare Metal 版本。

  4. 从上一个命令的输出中选择版本,并在环境变量中进行设置:

    export BMCTL_VERSION=BMCTL_VERSION
    

    我们建议您选择最高的兼容版本,以获取最新的 GKE on Bare Metal 功能和修复。

  5. 克隆 anthos-samples 代码库并切换到脚本所在的目录:

    git clone https://github.com/GoogleCloudPlatform/anthos-samples
    cd anthos-samples/anthos-bm-gcp-bash
    
  6. 运行脚本:

    bash install_admin_cluster.sh
    
  7. 出现提示时,输入数字以选择安装模式:

    • 输入 1 以使脚本设置虚拟机基础架构并安装管理员集群。
    • 输入 2 以使脚本仅设置虚拟机基础架构。
  8. 出现提示时,确认您的选择。

该脚本会输出其运行的每个命令和状态。完成后,脚本将输出以下内容,具体取决于您是否选择安装管理员集群:

创建了管理员集群

✅ Installation complete. Please check the logs for any errors!!!
✅ If you do not see any errors in the output log, then you now have the following setup:

|---------------------------------------------------------------------------------------------------------|
| VM Name               | L2 Network IP (VxLAN) | INFO                                                    |
|---------------------------------------------------------------------------------------------------------|
| abm-admin-cluster-cp1 | 10.200.0.3            | Has control plane of admin cluster running inside       |
| abm-user-cluster-cp1  | 10.200.0.4            | 🌟 Ready for use as control plane for the user cluster  |
| abm-user-cluster-w1   | 10.200.0.5            | 🌟 Ready for use as worker for the user cluster         |
| abm-user-cluster-w2   | 10.200.0.6            | 🌟 Ready for use as worker for the user cluster         |
|---------------------------------------------------------------------------------------------------------|

仅设置虚拟机

|---------------------------------------------------------------------------------------------------------|
| VM Name               | L2 Network IP (VxLAN) | INFO                                                    |
|---------------------------------------------------------------------------------------------------------|
| abm-admin-cluster-cp1 | 10.200.0.3            | 🌟 Ready for use as control plane for the admin cluster |
| abm-user-cluster-cp1  | 10.200.0.4            | 🌟 Ready for use as control plane for the user cluster  |
| abm-user-cluster-w1   | 10.200.0.5            | 🌟 Ready for use as worker for the user cluster         |
| abm-user-cluster-w2   | 10.200.0.6            | 🌟 Ready for use as worker for the user cluster         |
|---------------------------------------------------------------------------------------------------------|

关于脚本

如需详细了解 install_admin_cluster.sh,请点击下一行中的 关于脚本

关于脚本

该脚本会自动执行以下手动步骤:

  1. 创建一个名为 baremetal-gcr 的服务账号,并向服务账号授予其他权限,以避免不同的 API 和服务需要多个服务账号。
  2. 启用以下 Google Cloud API:
      anthos.googleapis.com
      anthosaudit.googleapis.com
      anthosgke.googleapis.com
      cloudresourcemanager.googleapis.com
      connectgateway.googleapis.com
      container.googleapis.com
      gkeconnect.googleapis.com
      gkehub.googleapis.com
      gkeonprem.googleapis.com
      iam.googleapis.com
      logging.googleapis.com
      monitoring.googleapis.com
      opsconfigmonitoring.googleapis.com
      serviceusage.googleapis.com
      stackdriver.googleapis.com
      storage.googleapis.com
  3. 创建以下虚拟机:
    • 一个虚拟机用于管理员工作站。管理员工作站将可以使用 SSH 访问所有其他集群节点。
    • 一个虚拟机用于管理员集群的控制平面节点。
    • 用户集群的工作器节点的两个虚拟机。
    • 一个虚拟机用于用户集群的控制平面节点。
    该脚本还会验证所有虚拟机是否已启用 SSH。
  4. 为虚拟机之间的第 2 层连接创建虚拟可扩展 LAN (VXLAN) 叠加网络。VXLAN 不是永久性的,因此如果您重新启动虚拟机实例,网络会被销毁。该网络设置为 10.200.0.0/24 子网。捆绑式负载均衡器需要第 2 层连接。
  5. 在管理员工作站上安装以下工具:
    • bmctl
    • kubectl
    • Docker

    该脚本还会将 baremetal-gcr 服务账号的服务账号密钥下载到管理员工作站。

  6. 通过执行以下任务,确保来自管理员工作站的 root@10.200.0.x 正常运行:
    1. 在管理员工作站上生成新的 SSH 密钥。
    2. 将公钥添加到部署中的所有其他虚拟机上。
  7. (可选)脚本使用以下配置文件创建管理员集群:
      gcloud compute ssh root@"$VM_WS" --zone "${ZONE}" <<EOF
    set -x
    export PROJECT_ID=\$(gcloud config get-value project)
    ADMIN_CLUSTER_NAME=\$(curl http://metadata.google.internal/computeMetadata/v1/instance/attributes/cluster_id -H "Metadata-Flavor: Google")
    BMCTL_VERSION=\$(curl http://metadata.google.internal/computeMetadata/v1/instance/attributes/bmctl_version -H "Metadata-Flavor: Google")
    export ADMIN_CLUSTER_NAME
    export BMCTL_VERSION
    bmctl create config -c \$ADMIN_CLUSTER_NAME
    cat > bmctl-workspace/\$ADMIN_CLUSTER_NAME/\$ADMIN_CLUSTER_NAME.yaml << EOB
    ---
    gcrKeyPath: /root/bm-gcr.json
    sshPrivateKeyPath: /root/.ssh/id_rsa
    gkeConnectAgentServiceAccountKeyPath: /root/bm-gcr.json
    gkeConnectRegisterServiceAccountKeyPath: /root/bm-gcr.json
    cloudOperationsServiceAccountKeyPath: /root/bm-gcr.json
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: cluster-\$ADMIN_CLUSTER_NAME
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      name: \$ADMIN_CLUSTER_NAME
      namespace: cluster-\$ADMIN_CLUSTER_NAME
    spec:
      type: admin
      anthosBareMetalVersion: \$BMCTL_VERSION
      gkeConnect:
        projectID: \$PROJECT_ID
      controlPlane:
        nodePoolSpec:
          clusterName: \$ADMIN_CLUSTER_NAME
          nodes:
          - address: 10.200.0.3
      clusterNetwork:
        pods:
          cidrBlocks:
          - 192.168.0.0/16
        services:
          cidrBlocks:
          - 10.96.0.0/20
      loadBalancer:
        mode: bundled
        ports:
          controlPlaneLBPort: 443
        vips:
          controlPlaneVIP: 10.200.0.48
      clusterOperations:
        # might need to be this location
        location: us-central1
        projectID: \$PROJECT_ID
      storage:
        lvpNodeMounts:
          path: /mnt/localpv-disk
          storageClassName: node-disk
        lvpShare:
          numPVUnderSharedPath: 5
          path: /mnt/localpv-share
          storageClassName: local-shared
      nodeConfig:
        podDensity:
          maxPodsPerNode: 250
    EOB
    
    bmctl create cluster -c \$ADMIN_CLUSTER_NAME
    EOF

    如果选择让该脚本创建管理员集群,该脚本将使用 SSH 以根用户身份登录管理员工作站。接下来,脚本会运行 bmctl 命令行工具来创建管理员集群。这是可用于创建管理员集群的工具之一。

    当 GKE on Bare Metal 创建集群时,它会在管理员工作站上部署 Kubernetes in Docker(种类)集群。此引导集群托管创建集群所需的 Kubernetes 控制器,并用于创建管理员集群。创建后,相关控制器会从引导集群迁移到管理员集群。最后,除非另行指定,否则当集群创建成功完成时,引导集群将被移除。引导集群需要 Docker 来拉取容器映像。

(可选)创建管理员集群

如果脚本创建了管理员集群,请跳到下一部分验证管理员集群。否则,请按照本部分中的步骤创建引导集群和管理员集群。

在创建管理员集群之前,您需要在管理员工作站上运行 bmctl register bootstrap 命令。此命令会在管理员工作站中部署临时 Kubernetes in Docker(种类)集群。此引导集群托管创建管理员集群所需的 Kubernetes 控制器。创建管理员集群时,引导集群上的控制器会预配节点、运行预检检查,并将管理员集群注册到舰队。成功创建管理员集群后,系统会自动删除引导集群。

控制台

  1. 在控制台中,转到创建 GKE on Bare Metal 集群页面。

    转到“创建 GKE on Bare Metal 集群”

  2. 确保从项目列表中选择 PROJECT_ID

  3. 在左侧导航栏中,点击安装引导环境

  4. 输入 ADMIN_CLUSTER_NAME 作为管理员集群名称。请注意,引导集群名称是在管理员集群名称前面加上 bootstrap-bootstrap-

  5. 选择 VERSION 作为管理员集群的版本。该脚本将此版本的 bmctl 命令行工具下载到管理员工作站。您安装的 GKE on Bare Metal 版本必须与 bmctl 版本匹配。

  6. Google Cloud API 位置字段中,从列表中选择 ON_PREM_API_REGION。此设置指定运行 GKE On-Prem API 的区域,以及存储以下内容的区域:

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

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

请按照下一部分中的步骤(而不是控制台中显示的步骤)创建引导集群。让控制台页面保持打开,因为您将返回该页面创建管理员集群。

gcloud CLI

打开一个新终端窗口。您将使用第二个终端窗口连接到管理员工作站,以创建引导集群。您将使用第一个终端窗口运行 gcloud CLI 命令以创建管理员集群。

创建引导集群

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

  1. 使用 SSH 以根用户身份访问管理员工作站:

    gcloud compute ssh root@abm-ws --zone ZONE
    

    您可以忽略任何有关更新虚拟机的消息并完成本教程。如果您计划将虚拟机保留为测试环境,则可能需要按照 Ubuntu 文档中的说明更新操作系统或升级到下一个版本。

  2. 将您的用户凭据设置为应用默认凭据 (ADC):

    gcloud auth application-default login
    

    按照提示选择用于 ADC 的 Google 账号。

  3. 创建引导集群。

    bmctl register bootstrap \
      --ssh-key=/root/.ssh/id_rsa \
      --name=bootstrap-ADMIN_CLUSTER_NAME \
      --project-id=PROJECT_ID
    

bmctl 成功创建引导集群后,您会看到如下所示的输出:

[2023-03-22 17:35:24+0000] Waiting for the temporary cluster to be registered... OK
[2023-03-22 17:35:37+0000] Please go to https://console.cloud.google.com/home/dashboard?project=example-project-12345 to create the cluster
[2023-03-22 17:35:37+0000] Waiting for preflight checks and cluster to run..

创建管理员集群

控制台

  1. 安装引导环境页面上的从管理员工作站中引导环境部分中,点击检查连接状况

    成功后,控制台会显示 已建立连接

    您必须先建立与引导集群的连接,然后才能继续操作。如果连接未建立,请检查您为 bmctl register bootstrap 命令指定的参数:

    • 确保 --name 的值与引导环境基本信息部分中显示的派生的引导集群名称匹配。

    • 确保 --project-id 的值与您在控制台中选择的项目的 ID 匹配。

    如果您需要更改引导集群名称或项目 ID,请输入 Ctrl-C 退出 bmctl register bootstrap,然后重新运行该命令。

  2. 点击左侧导航栏中的网络

  3. 控制平面部分的控制平面节点 IP 1 字段中输入以下内容:

    10.200.0.3
    

    这是脚本创建的 VXLAN 中 abm-admin-cluster-cp 虚拟机的 IP 地址。

  4. 负载均衡器部分中,确保选中捆绑

  5. 虚拟 IP (VIP) 部分的控制平面 VIP 字段中,输入以下内容:

    10.200.0.48
    
  6. 点击验证并创建

    控制台会在验证设置并创建集群时显示状态消息。

gcloud CLI

  1. 确保您之前定义的环境变量具有正确的值。虽然示例命令使用占位符,但它们需要与脚本使用的环境变量匹配。

    echo $PROJECT_ID
    echo $ADMIN_CLUSTER_NAME
    echo $ON_PREM_API_REGION
    echo $BMCTL_VERSION
    
  2. 确认引导集群已注册为舰队的成员:

    gcloud container fleet memberships list \
      --project=PROJECT_ID
    

    如果引导集群未列出,请检查您为 bmctl register bootstrap 指定的引导集群名称和项目 ID。如果您需要更改引导集群名称或项目 ID,请输入 Ctrl-C 退出 bmctl register bootstrap,然后重新运行该命令。

  3. 使用捆绑式负载均衡器创建管理员集群:

    gcloud container bare-metal admin-clusters create ADMIN_CLUSTER_NAME \
      --project=PROJECT_ID \
      --location=ON_PREM_API_REGION \
      --version=BMCTL_VERSION \
      --max-pods-per-node=110 \
      --control-plane-vip=10.200.0.48 \
      --control-plane-load-balancer-port=443 \
      --control-plane-node-configs node-ip=10.200.0.3 \
      --island-mode-service-address-cidr-blocks=10.96.0.0/20 \
      --island-mode-pod-address-cidr-blocks=192.168.0.0/16 \
      --lvp-share-path=/mnt/localpv-share \
      --lvp-share-storage-class=local-shared \
      --lvp-node-mounts-config-path=/mnt/localpv-disk \
      --lvp-node-mounts-config-storage-class=local-disks
    

    在上一个命令中:

    • --control-plane-vip:设置为 10.200.0.48。这是集群的 Kubernetes API 服务器的负载均衡器上的虚拟 IP (VIP)。

    • --control-plane-node-configsnode-ip 设置为 10.200.0.3。这是脚本创建的 VXLAN 中 abm-admin-cluster-cp 虚拟机的 IP 地址。

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

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

    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 bare-metal operations describe OPERATION_ID \
      --project=PROJECT_ID \
      --location=ON_PREM_API_REGION
    

有关集群创建过程的详细信息会输出到管理员工作站。在创建集群之前,bmctl 会运行一系列预检检查以验证配置。如果预检检查通过,您会看到如下所示的内容:

[2023-03-22 23:12:47+0000] Waiting for cluster kubeconfig to become ready OK
[2023-03-22 23:15:47+0000] Writing kubeconfig file
[2023-03-22 23:15:47+0000] kubeconfig of cluster being created is present at bmctl-workspace/abm-cluster-1/abm-cluster-1-kubeconfig
[2023-03-22 23:15:47+0000] Please restrict access to this file as it contains authentication credentials of your cluster.
[2023-03-22 23:15:47+0000] Waiting for cluster to become ready OK
[2023-03-22 23:20:17+0000] Please run
[2023-03-22 23:20:17+0000] kubectl --kubeconfig bmctl-workspace/abm-cluster-1/abm-cluster-1-kubeconfig get nodes
[2023-03-22 23:20:17+0000] to get cluster nodes status.
[2023-03-22 23:20:17+0000] Waiting for node pools to become ready OK
[2023-03-22 23:20:37+0000] Waiting for metrics to become ready in GCP OK
[2023-03-22 23:25:38+0000] Waiting for cluster API provider to install in the created admin cluster OK
[2023-03-22 23:25:48+0000] Moving admin cluster resources to the created admin cluster
[2023-03-22 23:25:51+0000] Waiting for node update jobs to finish OK
[2023-03-22 23:27:41+0000] Flushing logs... OK
[2023-03-22 23:27:41+0000] Deleting membership... OK
[2023-03-22 23:27:42+0000] Deleting bootstrap cluster.

验证管理员集群

您可以在管理员工作站的 root 账号的 bmctl-workspace 目录中找到管理员集群的 kubeconfig 文件。如需验证部署,请完成以下步骤。

  1. 如果脚本创建了管理员集群,请使用 SSH 以根用户身份访问管理员工作站:

    gcloud compute ssh root@abm-ws --zone ZONE
    

    您可以忽略任何有关更新虚拟机的消息并完成本教程。如果您计划将虚拟机保留为测试环境,则可能需要按照 Ubuntu 文档中的说明更新操作系统或升级到下一个版本。

  2. 使用集群配置文件的路径设置 KUBECONFIG 环境变量,以便在集群上运行 kubectl 命令。

    export clusterid=ADMIN_CLUSTER_NAME
    export KUBECONFIG=$HOME/bmctl-workspace/$clusterid/$clusterid-kubeconfig
    kubectl get nodes
    

    输出类似于以下内容:

    NAME                   STATUS   ROLES                  AGE   VERSION
    abm-admin-cluster-cp   Ready    control-plane,master   91m   v1.24.2-gke.1900
    
  3. 在环境变量中设置当前上下文:

    export CONTEXT="$(kubectl config current-context)"
    
  4. 运行以下 gcloud 命令。此命令执行以下操作:

    • 为您的用户账号授予集群上的 Kubernetes clusterrole/cluster-admin 角色。
    • 配置集群,以便在本地计算机上运行 kubectl 命令,而无需通过 SSH 连接到管理员工作站。
    • 允许您使用 Google 身份在控制台中登录集群。

    YOUR_EMAIL_ADDRESS 替换为与您的 Google Cloud 账号关联的电子邮件地址。例如:--users=alex@example.com

    gcloud container fleet memberships generate-gateway-rbac  \
        --membership=ADMIN_CLUSTER_NAME \
        --role=clusterrole/cluster-admin \
        --users=YOUR_EMAIL_ADDRESS \
        --project=PROJECT_ID \
        --kubeconfig=$KUBECONFIG \
        --context=$CONTEXT\
        --apply
    

    此命令的输出类似于以下内容,为了便于阅读,已将其截断:

    Validating input arguments.
    Specified Cluster Role is: clusterrole/cluster-admin
    Generated RBAC policy is:
    --------------------------------------------
    ...
    
    Applying the generate RBAC policy to cluster with kubeconfig: /root/bmctl-workspace/ADMIN_CLUSTER_NAME/ADMIN_CLUSTER_NAME-kubeconfig, context: ADMIN_CLUSTER_NAME-admin@ADMIN_CLUSTER_NAME
    Writing RBAC policy for user: YOUR_EMAIL_ADDRESS to cluster.
    Successfully applied the RBAC policy to cluster.
    
  5. 探索完毕后,输入 exit 以退出管理员工作站。

  6. 在本地计算机上运行以下命令,以获取可通过 Connect 网关访问集群的 kubeconfig 条目:

    gcloud container fleet memberships get-credentials ADMIN_CLUSTER_NAME
    

    输出类似于以下内容:

    Starting to build Gateway kubeconfig...
    Current project_id: PROJECT_ID
    A new kubeconfig entry "connectgateway_PROJECT_ID_global_ADMIN_CLUSTER_NAME" has been generated and set as the current context.
    
  7. 您现在可以通过 Connect 网关运行 kubectl 命令:

    kubectl get nodes
    

    输出类似于以下内容:

    NAME                   STATUS   ROLES                  AGE   VERSION
    abm-admin-cluster-cp   Ready    control-plane,master   94m   v1.24.2-gke.1900
    

在 GKE on Bare Metal 1.16 及更高版本中,集群会自动注册到 GKE On-Prem API。这使得您可以使用 gcloud CLI 和控制台来升级和更新管理员集群。

创建用户集群

在脚本为虚拟机创建 L2 VXLAN 后,它会在 10.200.0.0/24 网络中分配以下 IP 地址。为用户集群配置网络和节点池设置时,您可以使用这些 IP 地址。

虚拟机名称 网络 IP 节点说明
abm-admin-cluster-cp1 10.200.0.3 管理员集群的控制平面节点
abm-user-cluster-cp1 10.200.0.4 用户集群的控制平面节点。
abm-user-cluster-w1 10.200.0.5 用户集群的工作器节点
abm-user-cluster-w2 10.200.0.6 用户集群的另一个工作器节点

您可以使用 Google Cloud 控制台、Google Cloud CLI 或 Terraform 创建用户集群。

控制台

请按照以下步骤在控制台中创建用户集群:

  1. 在控制台中,转到创建 GKE on Bare Metal 集群页面。

    转到“创建 GKE on Bare Metal 集群”

  2. 确保选择创建管理员集群的 Google Cloud 项目。

  3. 选择集群类型下,选择为现有管理员集群创建用户集群

  4. 点击下一步

集群基本信息

  1. 输入用户集群的名称或使用默认名称。

  2. 确保已选择新建的管理员集群。 您可以对本页面上的其余设置使用默认值。

  3. 点击左侧导航栏中的网络

网络

  1. 控制平面部分的控制平面节点 IP 1 字段中输入以下内容:

    10.200.0.4
    

    这是通过脚本创建的 VXLAN 中 abm-user-cluster-cp1 虚拟机的 IP 地址。

  2. 负载均衡器部分中,使用与 MetalLB 捆绑的默认负载均衡器。

  3. 新地址池部分的 IP 地址范围 1 字段中输入以下 IP 地址范围:

    10.200.0.51-10.200.0.70
    
  4. 点击完成

  5. 虚拟 IP 部分的控制平面 VIP 字段中输入以下 IP 地址:

    10.200.0.50
    
  6. Ingress VIP 输入以下 IP 地址:

    10.200.0.51
    
  7. 使用 Service 和 Pod CIDR 部分的默认 IP 地址。

  8. 点击左侧导航栏中的默认池

创建节点池

您的集群必须至少有一个节点池来存储工作器节点。节点池是用于在此集群中创建的工作器节点组的模板。

节点地址 1 字段中输入以下 IP 地址:

10.200.0.5

这是通过脚本创建的 VXLAN 中 abm-user-cluster-w1 虚拟机的 IP 地址。

创建集群

  1. 点击验证并创建以创建用户集群。

    创建用户集群需要 15 分钟或更长时间。控制台会在验证设置并创建集群时显示状态消息。

    如果配置出现问题,控制台将显示一条错误消息,该消息应该足够清晰,以便您修复配置问题并再次尝试创建集群。

    如需查看有关创建过程的详细信息,请点击显示详细信息以显示侧面板。点击 可关闭详细信息面板。

    创建集群后,将显示集群状态:正在运行

    屏幕截图集群已准备就绪

  2. 创建集群后,点击 集群以返回集群页面。

gcloud CLI

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

gcloud container bare-metal clusters create

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

gcloud container bare-metal node-pools create

如需创建用户集群,请执行以下操作:

  1. 确保您之前定义的环境变量具有正确的值。虽然示例命令使用占位符,但它们需要与脚本使用的环境变量匹配。

    echo $PROJECT_ID
    echo $ADMIN_CLUSTER_NAME
    echo $ON_PREM_API_REGION
    echo $BMCTL_VERSION
    
  2. 运行以下命令以创建用户集群。请替换以下内容:

    • USER_CLUSTER_NAME:集群的名称。

    • 请确保将 --admin-users 设置为与您的 Google 帐号关联的电子邮件地址,以便您可以管理集群。

    系统已为您填充其余标志值。 如果需要,请滚动以验证 --admin-cluster-membership 标志具有正确的管理员集群名称值,即完全指定的成员资格名称中的最后一个部分。

    gcloud container bare-metal clusters create USER_CLUSTER_NAME \
      --project=PROJECT_ID \
      --admin-cluster-membership=projects/PROJECT_ID/locations/global/memberships/ADMIN_CLUSTER_NAME \
      --location=ON_PREM_API_REGION \
      --version=BMCTL_VERSION \
      --admin-users=YOUR_EMAIL_ADDRESS \
      --metal-lb-address-pools='pool=lb-pool-1,manual-assign=True,addresses=10.200.0.51-10.200.0.70' \
      --control-plane-node-configs='node-ip=10.200.0.4' \
      --control-plane-vip=10.200.0.50 \
      --control-plane-load-balancer-port=443 \
      --ingress-vip=10.200.0.51 \
      --island-mode-service-address-cidr-blocks=10.96.0.0/20 \
      --island-mode-pod-address-cidr-blocks=192.168.0.0/16 \
      --lvp-share-path=/mnt/localpv-share \
      --lvp-share-storage-class=local-shared \
      --lvp-node-mounts-config-path=/mnt/localpv-disk \
      --lvp-node-mounts-config-storage-class=local-disks
    

以下列表介绍了这些标志:

  • --project:项目 ID,用户集群将在此项目中注册。此项目称为舰队宿主项目。

  • --admin-cluster-membership:完全指定的管理员集群名称,用于标识舰队中的管理员集群。

  • --location:GKE On-Prem API 运行并存储其元数据的 Google Cloud 区域。

  • --version:GKE on Bare Metal 版本。

  • --admin-users:添加您的电子邮件地址以授予 Kubernetes 基于角色的访问权限控制 (RBAC) 政策,从而为您提供对集群的完全管理员权限。

  • --metal-lb-address-pools:捆绑式 MetalLB 负载均衡器的地址池配置。IP 地址范围必须在脚本创建的 10.200.0.0/24 网络中。地址范围不得包含分配给虚拟机的 IP 地址,也不得包含控制平面 VIP。但请注意,入站流量 VIP 必须位于此地址范围内。

  • --control-plane-node-configs:用户集群的控制平面节点配置。node-ip 的值为 10.200.0.4,这是脚本分配给虚拟机 abm-user-cluster-cp1 的 IP 地址。

  • --control-plane-vip:控制平面的虚拟 IP。值 10.200.0.50 在脚本创建的 10.200.0.0/24 网络中,但与用于 MetalLB 负载均衡器地址池的 IP 地址范围不重叠。

  • --control-plane-load-balancer-port:负载均衡器通过其为控制平面提供服务的端口。虽然您可以配置其他值,但端口 443 是用于 HTTPS 连接的标准端口。

  • --ingress-vip:入站流量服务的虚拟 IP。此 IP 地址必须在用于 MetalLB 负载均衡器地址池的 IP 地址范围内。

  • --island-mode-service-address-cidr-blocks:用于用户集群中的 Service 的 IP 地址范围(采用 CIDR 格式)。示例命令使用了 10.96.0.0/20,这是控制台提供的默认值。CIDR 范围必须介于 /24 和 /12 之间,其中 /12 提供的 IP 地址最多。我们建议您按照 RFC 1918 中所定义,将此 IP 地址空间中的范围用于专用互联网。

  • --island-mode-pod-address-cidr-blocks:用于用户集群中的 Pod 的 IP 地址范围(采用 CIDR 格式)。示例命令使用了 192.168.0.0/16,这是控制台提供的默认值。CIDR 范围必须介于 /18 和 /8 之间,其中 /8 提供的 IP 地址最多。我们建议您按照 RFC 1918 中所定义,将此 IP 地址空间中的范围用于专用互联网。

  • --lvp-share-path:这是可以在其中创建子目录的宿主机路径。系统会为每个子目录创建一个本地 PersistentVolume (PV)。

  • --lvp-share-storage-class:这是用于创建永久性卷的 StorageClass。StorageClass 在创建集群期间创建。

  • --lvp-node-mounts-config-path:这是可以在其中发现已装载磁盘的宿主机路径。系统会为每个装载创建一个本地 PersistentVolume (PV)。

  • --lvp-node-mounts-config-storage:在创建集群的过程中创建 PV 的存储类别。

运行该命令后,您会看到如下所示的输出:

Waiting for operation [projects/PROJECT_ID/locations/ON_PREM_API_REGION/operations/operation-1678304606537-5f668bde5c57e-341effde-b612ff8a] to complete...

在示例输出中,字符串 operation-1678304606537-5f668bde5c57e-341effde-b612ff8a 是长时间运行的操作的 OPERATION_ID

如需了解操作的状态,请将输出中的 OPERATION_ID 复制到以下命令。打开另一个终端窗口并运行该命令。

gcloud container bare-metal operations describe OPERATION_ID \
    --project=PROJECT_ID \
    --location=ON_PREM_API_REGION

创建集群大约需要 15 分钟或更长时间。创建集群时,您可以不时运行上一个命令来获取当前状态。

创建集群后,您会看到如下所示的输出:

Created Anthos cluster on bare metal [https://gkeonprem.googleapis.com/v1/projects/PROJECT_ID/locations/ON_PREM_API_REGION/bareMetalClusters/USER_CLUSTER_NAME].

创建节点池

成功创建集群后,请运行以下命令以创建节点池。将 NODE_POOL_NAME 替换为节点池的名称,并确保 --cluster 标志的占位符仍设置为用户集群的名称。

gcloud container bare-metal node-pools create NODE_POOL_NAME \
  --cluster=USER_CLUSTER_NAME \
  --project=PROJECT_ID \
  --location=ON_PREM_API_REGION \
  --node-configs='node-ip=10.200.0.5'
  • -node-configs:分配给 node-ip 的值是 VXLAN 中由脚本创建的 abm-user-cluster-w1 虚拟机的 IP 地址。

运行该命令后,您会看到如下所示的输出:

Waiting for operation [projects/PROJECT_ID/locations/ON_PREM_API_REGION/operations/operation-1678308682052-5f669b0d132cb-6ebd1c2c-816287a7] to complete...

创建节点池大约需要 5 分钟或更少时间。创建节点池后,您会看到如下所示的输出:

Created node pool in Anthos cluster on bare metal [https://gkeonprem.googleapis.com/v1/projects/PROJECT_ID/locations/ON_PREM_API_REGION/bareMetalClusters/USER_CLUSTER_NAME/bareMetalNodePools/NODE_POOL_NAME].

其他用户集群命令

除了创建集群之外,您还可以运行其他 gcloud CLI 命令,例如:

  • 要列出您的用户集群,请执行以下操作:
gcloud container bare-metal clusters list \
    --project=PROJECT_ID \
    --location=ON_PREM_API_REGION
  • 要描述用户集群,请执行以下操作:
gcloud container bare-metal clusters describe USER_CLUSTER_NAME \
    --project=PROJECT_ID \
    --location=ON_PREM_API_REGION

如需了解详情,请参阅 gcloud container bare-metal clusters

其他节点池命令

除了创建节点池之外,您还可以运行其他 gcloud CLI 命令,例如:

  • 如需列出节点池,请运行以下命令:
gcloud container bare-metal node-pools list \
    --cluster=USER_CLUSTER_NAME \
    --project=PROJECT_ID \
    --location=ON_PREM_API_REGION
  • 如需描述节点池,请运行以下命令:
gcloud container bare-metal node-pools describe NODE_POOL_NAME \
    --cluster=USER_CLUSTER_NAME \
    --project=PROJECT_ID \
    --location=ON_PREM_API_REGION

如需了解详情,请参阅 gcloud container bare-metal node-pools

Terraform

您可以使用以下基本配置示例来创建具有捆绑式 MetalLB 负载均衡器的用户集群。如需了解详情,请参阅 google_gkeonprem_bare_metal_cluster 参考文档

  1. 在您克隆了 anthos-samples 的目录中,切换到 Terraform 示例所在的目录:

    cd anthos-samples/anthos-onprem-terraform/abm_user_cluster_metallb
    

    该示例提供了一个传入 main.tf 的示例变量文件。

  2. 复制 terraform.tfvars.sample 文件:

    cp terraform.tfvars.sample terraform.tfvars
    
    
    project_id          = "PROJECT_ID"
    region              = "ON_PREM_API_REGION"
    admin_cluster_name  = "ADMIN_CLUSTER_NAME"
    bare_metal_version  = "VERSION"
    admin_user_emails   = ["YOUR_EMAIL_ADDRESS", "ADMIN_2_EMAIL_ADDRESS"]
    cluster_name        = "abm-user-cluster-metallb"
    control_plane_ips   = ["10.200.0.4"]
    worker_node_ips     = ["10.200.0.5", "10.200.0.6"]
    control_plane_vip   = "10.200.0.50"
    ingress_vip         = "10.200.0.51"
    lb_address_pools    = [
        { name = "lbpool_1", addresses = ["10.200.0.51-10.200.0.70"] }
    ]
    
  3. 修改 terraform.tfvars 中的参数值并保存该文件。

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

    • project_id:项目 ID,用户集群将在此项目中注册。此项目称为舰队宿主项目。

    • region:您在本教程开头设置的 Google Cloud 区域。运行 echo $ON_PREM_API_REGION 以获取值。

    • admin_cluster_name:您在本教程开头设置的管理员集群的名称。运行 echo $ADMIN_CLUSTER_NAME 以获取值。

    • bare_metal_version:用户集群的 GKE on Bare Metal 版本。如需使用用于管理员集群的同一版本,请运行 echo $BMCTL_VERSION 以获取值。您也可以指定低于管理员集群的版本,但最多只能低一个次要版本。用户集群版本不得高于管理员集群版本。

    • cluster_name:您可以使用 TVARS 文件中的名称供用户集群使用,也可以指定您选择的名称。创建集群后,此名称便无法更改。

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

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

    terraform.tvars 中定义的默认值用于其余变量。该脚本在创建虚拟机和管理员集群时使用这些值。

    • control_plane_ips:控制平面节点的一个或多个 IPv4 地址列表。使用默认值,即脚本分配给虚拟机 abm-user-cluster-cp1 的 IP 地址。

    • worker_node_ips:工作器节点机器的一个或多个 IPv4 地址列表。使用默认值,即脚本分配给虚拟机的 abm-user-cluster-w1abm-user-cluster-w2 的 IP 地址。

    • control_plane_vip:控制平面的虚拟 IP (VIP)。使用默认值 10.200.0.50,它位于脚本创建的 10.200.0.0/24 网络中。请注意,此 IP 地址不会与用于 MetalLB 负载均衡器地址池的 IP 地址范围重叠。

    • ingress_vip:要在负载均衡器上为 Ingress 代理配置的虚拟 IP 地址。使用默认值 10.200.0.51,它位于脚本创建的 10.200.0.0/24 网络中。请注意,此 IP 地址位于用于 MetalLB 负载均衡器地址池的 IP 地址范围内。

    • lb_address_pools:定义 MetalLB 负载均衡器地址池的映射的列表。使用默认值。

  4. 将更改保存在 terraform.tfvars 中。

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

    terraform init
    

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

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

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

    terraform apply
    

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

连接到用户集群

使用控制台或 gcloud CLI 创建用户集群时,该集群会配置有您运行 gcloud container fleet memberships generate-gateway-rbac 时为管理员集群配置的 Kubernetes 基于角色的访问权限控制 (RBAC) 政策。借助这些 RBAC 政策,您可以使用 Google Cloud 身份(即与您的 Google Cloud 账号关联的电子邮件地址)连接到集群。这些 RBAC 政策可让您登录控制台,而无需任何其他配置。

在控制台中连接到集群

如果您使用 gcloud CLI 或 Terraform 创建用户集群,请转到控制台中的 GKE 集群页面:

转到 GKE 集群

确保选择了您在其中创建用户集群的项目。您应该会在列表中看到管理员集群和用户集群。

请注意,用户集群的类型列中有 Bare Metal: User。这表示集群由 GKE On-Prem API 管理。

如果您使用该脚本创建管理员集群,则该集群的类型列中会显示外部。这表示该集群并非由 GKE On-Prem API 管理。创建集群后,您可以将管理员集群配置为由 GKE On-Prem API 管理

屏幕截图集群列表

如需登录集群,请执行以下操作:

  1. 点击集群名称中的链接,然后点击侧面板上的登录

  2. 选择使用您的 Google 身份登录

  3. 点击 Login(登录)。

重复相同的步骤也可以登录管理员集群。

屏幕截图集群列表

通过命令行连接到集群

GKE On-Prem API 会为您作为用户集群创建者配置 RBAC 政策。通过这些政策,您可以使用连接网关 kubeconfig 在本地桌面上运行 kubectl 命令。

在本地计算机上:

  1. 获取可通过连接网关访问集群的 kubeconfig 条目。

    gcloud container fleet memberships get-credentials USER_CLUSTER_NAME
    

    输出类似于以下内容:

    Starting to build Gateway kubeconfig...
    Current project_id: PROJECT_ID
    A new kubeconfig entry "connectgateway_PROJECT_ID_global_USER_CLUSTER_NAME" has been generated and set as the current context.
    
  2. 您现在可以通过 Connect 网关运行 kubectl 命令:

    kubectl get nodes
    

    输出类似于以下内容:

    NAME                  STATUS   ROLES                  AGE     VERSION
    abm-user-cluster-cp   Ready    control-plane,master   14m     v1.24.2-gke.1900
    abm-user-cluster-w1   Ready    worker                 8m28s   v1.24.2-gke.1900
    

向用户集群添加其他节点池

控制台

  1. 在控制台中,转到 GKE 集群页面。

    转到 GKE 集群

  2. 在集群列表中,点击集群的名称,然后点击详细信息面板中的更多详情

  3. 点击节点标签页。

  4. 点击 添加节点池

  5. 输入节点池的名称。

  6. 节点地址 1 字段中,输入以下 IP 地址:

    10.200.0.6
    

    这是脚本创建的 abm-user-cluster-w2 虚拟机的 IP 地址。

  7. 点击创建

  8. 如果需要,再次点击节点标签页。

  9. 新节点池会显示正在调整状态。

  10. 点击右上角的 以查看节点池创建的状态。您可能需要刷新页面才能看到节点池列表中更新后的状态。

gcloud CLI

运行以下命令以创建其他节点池。将 NODE_POOL_NAME_2 替换为节点池的名称,并确保 --cluster 标志的占位符仍设置为用户集群的名称。

gcloud container bare-metal node-pools create NODE_POOL_NAME_2 \
  --cluster=USER_CLUSTER_NAME \
  --project=PROJECT_ID \
  --location=ON_PREM_API_REGION \
  --node-configs='node-ip=10.200.0.6'
  • -node-configs:分配给 node-ip 的值是 VXLAN 中由脚本创建的 abm-user-cluster-w2 虚拟机的 IP 地址。

Terraform

如果您使用 Terraform 创建了集群,则创建后该集群包含两个节点,因此 VXLAN 中没有任何其他虚拟机可用于添加其他节点。如需了解如何添加节点池,请参阅 google_gkeonprem_bare_metal_cluster 参考文档

您还可以使用 kubectl 验证新节点。您必须先运行前面显示的 gcloud container fleet memberships get-credentials 命令来提取集群配置:

kubectl get nodes

输出类似于以下内容:

NAME                  STATUS   ROLES                  AGE     VERSION
abm-user-cluster-cp   Ready    control-plane,master   24m   v1.24.2-gke.1900
abm-user-cluster-w1   Ready    worker                 18m   v1.24.2-gke.1900
abm-user-cluster-w2   Ready    worker                 52s   v1.24.2-gke.1900

清理

以下各部分介绍了如何移除您根据本指南创建的集群和虚拟机。

删除用户集群

控制台

  1. 在控制台中,转到 GKE 集群页面。

    转到 GKE 集群

  2. 在集群列表中,点击用户集群。

  3. 详细信息面板中,点击更多详细信息

  4. 点击窗口顶部附近的 删除

  5. 当系统提示您确认时,输入集群名称,然后点击确认

  6. 点击右上角的 以查看删除状态。您可能需要刷新页面才能更新集群列表。

gcloud CLI

运行以下命令以删除集群:

gcloud container bare-metal clusters delete USER_CLUSTER_NAME \
  --project=PROJECT_ID \
  --location=ON_PREM_API_REGION \
  --force

您可以使用 --force 标志来删除包含节点池的集群。如果没有 --force 标志,您必须先删除节点池,然后再删除集群。

如需了解其他标志,请参阅 gcloud container bare-metal clusters delete

Terraform

运行以下命令:

terraform destroy

等待系统删除用户集群,然后再删除管理员集群和虚拟机。

删除管理员集群和虚拟机

  1. 从 GKE On-Prem API 取消注册管理员集群:

    gcloud container bare-metal admin-clusters unenroll ADMIN_CLUSTER_NAME \
        --project=PROJECT_ID \
        --location=ON_PREM_API_REGION
    
  2. 连接到管理员工作站:

    gcloud compute ssh root@abm-ws --zone ZONE
    
  3. 删除管理员集群:

    bmctl reset -c ADMIN_CLUSTER_NAME
    

    bmctl 会从舰队中取消注册集群,然后删除集群。等待集群被删除,然后再删除虚拟机。

  4. 退出管理员工作站。

  5. 列出名称中包含 abm 的所有虚拟机:

    gcloud compute instances list | grep 'abm'
    
  6. 验证您可以安全删除名称中包含 abm 的所有虚拟机。

    验证后,您可以通过运行以下命令来删除 abm 虚拟机:

    gcloud compute instances list --format="value(name)" | \
      grep 'abm'  | \
      xargs gcloud --quiet compute instances delete --zone ZONE
    
  7. 删除服务账号:

    gcloud iam service-accounts delete baremetal-gcr@PROJECT_ID.iam.gserviceaccount.com
    

    在确认提示中输入 y

    后续步骤