使用 Terraform 创建管理员集群

如果您已使用 Terraform 管理 VMware 和本地 VMware 资源,则仅使用 Terraform 为 Google Distributed Cloud 软件创建管理员集群,仅适用于 VMware。 Google Cloud 您还可以使用 gkectlGoogle Cloud 控制台创建管理员集群。

准备工作

  • 确保您已设置并且可以登录管理员工作站,如创建管理员工作站中所述。

  • 确保服务账号的 JSON 密钥文件位于管理员工作站上。

  • 查看 IP 地址规划文档。确保您有足够的 IP 地址供三个控制平面节点和一个控制平面 VIP 使用。如果您计划创建任何 kubeception 用户集群,则必须有足够的 IP 地址供这些用户集群的控制平面节点使用。

  • 查看负载均衡概览,并重新考虑有关要使用的负载均衡器类型的决定。对于手动负载均衡器,您必须先设置负载均衡器,然后才能创建管理员集群。

  • 如果您使用 gkectl 创建管理员集群,请决定您要为 Google Distributed Cloud 组件使用公共注册表还是私有注册表。如需了解如何使用私有 Docker 注册表,请参阅 privateRegistry。Terraform 和 Google Cloud 控制台均不支持使用私有 Docker 注册表来存储系统组件。

  • 决定您要在管理员集群节点上运行的操作系统类型。

  • 如果您的组织要求出站流量通过代理服务器,请务必将所需的 API 和 Artifact Registry 地址列入许可名单

  • 在 1.29 版及更高版本中,服务器端预检检查默认处于启用状态。服务器端预检检查需要额外的防火墙规则。在管理员集群的防火墙规则中,搜索“预检检查”,并确保已配置所有必需的防火墙规则。服务器端预检检查在引导集群上运行,而不是在管理员工作站上本地运行。

过程概览

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

以下是使用 Terraform 创建管理员集群的概要步骤:

  1. 填写配置文件。使用 google_gkeonprem_vmware_admin_cluster 资源和以下示例创建 main.tf 配置文件。

  2. 创建 bootstrap 集群。运行 gkectl register bootstrap 以创建引导集群。当该命令完成引导集群的创建后,输出会告知您完成管理员集群配置。 该进程会继续运行,直到创建管理员集群为止。

  3. 创建管理员集群。在另一个终端窗口中或在有权访问 GKE On-Prem API 的另一台计算机上,运行 terraform 命令,以按照已完成的 main.tf 配置文件中所指定的创建新的管理员集群。

填写配置文件

以下示例展示了如何使用 MetalLB 创建具有三个控制平面节点的高可用性 (HA) 管理员集群。在 1.28 及更高版本中,新管理员集群必须具有高可用性。由于此要求,您必须将 control_plane_node.replicas 设置为 3。

如需了解详情和其他示例,请参阅 google_gkeonprem_vmware_admin_cluster 参考文档。 如需了解如何使用私有注册表存储系统映像,请参阅 配置私有 Container Registry

填写以下示例中的占位变量,然后将其复制并粘贴到 main.tf。如果您使用 gkeadm 创建管理员工作站,请打开管理员工作站配置文件,以便将 vCenter 部分中的值复制到相应的占位变量。

resource "google_gkeonprem_vmware_admin_cluster" "admin-cluster-metallb" {
  provider = google-beta
  name = "ADMIN_CLUSTER_NAME"
  project = "PROJECT_ID"
  location = "REGION"
  description = "DESCRIPTION"
  bootstrap_cluster_membership = "projects/PROJECT_ID/locations/REGION/memberships/bootstrap-ADMIN_CLUSTER_NAME"
  on_prem_version = "VERSION"
  image_type = "IMAGE_TYPE"
  vcenter {
    address = "VCENTER_ADDRESS"
    datacenter = "DATA_CENTER"
    cluster = "VCENTER_CLUSTER"
    resource_pool = "RESOURCE_POOL"
    datastore = "DATASTORE"
    ca_cert_data = "CA_CERT_DATA"
  }
  network_config {
    service_address_cidr_blocks = ["10.96.232.0/24"]
    pod_address_cidr_blocks = ["192.168.0.0/16"]
    vcenter_network = "NETWORK"
    dhcp_ip_config {
      enabled = true
    }
    host_config {
      dns_servers = ["DNS_SERVERS"]
      ntp_servers = ["NTP_SERVERS"]
    }
    ha_control_plane_config {
      control_plane_ip_block {
        gateway = "GATEWAY"
        netmask = "NETMASK"
        ips {
          hostname = "CONTROL_PLANE_HOST_1"
          ip       = "CONTROL_PLANE_NODE_IP_1"
        }
        ips {
          hostname = "CONTROL_PLANE_HOST_2"
          ip       = "CONTROL_PLANE_NODE_IP_2"
        }
        ips {
          hostname = "CONTROL_PLANE_HOST_3"
          ip       = "CONTROL_PLANE_NODE_IP_3"
        }
      }
    }
  }
  control_plane_node {
     cpus = NUM_CPUS
     memory = MEMORY
     replicas = 3
  }
  load_balancer {
    vip_config {
      control_plane_vip = "CONTROL_PLANE_VIP"
    }
    metal_lb_config {
      enabled = true
    }
  }
}

替换以下内容:

  • ADMIN_CLUSTER_NAME:管理员集群的名称。名称的长度上限为 20 个字符。

  • PROJECT_ID: Google Cloud 项目 ID。

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

    location 字段对应于 --location 标志在 gkectl register bootstrap 命令中。

  • DESCRIPTION:管理员集群的说明。

  • VERSION:集群的 Google Distributed Cloud 版本。仅在 1.28 版及更高版本中支持使用 Terraform 创建集群。您在此处指定的版本必须与您在 --bundle-path 标志中在 gkectl register bootstrap 命令中指定的软件包版本一致。如需查看版本列表,请参阅 Google Distributed Cloud 版本

  • IMAGE_TYPE:要在管理员集群节点上运行的操作系统映像的类型。请指定以下其中一项:“ubuntu_containerd”“cos” “ubuntu_cgv2”或“cos_cgv2”。

  • VCENTER_ADDRESSvCenter Server 地址

    • 管理员工作站配置文件:使用 vCenter.credentials.address字段中的值。

    • vcenter.address 字段对应于 gkectl register bootstrap 命令中的 --vcenter-address 标志。

  • DATA_CENTERvCenter 数据中心的名称。

    • 管理员工作站配置文件:使用 vCenter.datacenter字段中的值。

    • vcenter.datacenter 字段对应于 gkectl register bootstrap 命令中的 --vcenter-datacenter 标志。

  • VCENTER_CLUSTERvCenter 集群的名称。

    • 管理员工作站配置文件:使用 vCenter.cluster字段中的值。

    • vcenter.cluster 字段对应于 gkectl register bootstrap 命令中的 --vcenter-cluster 标志。

  • RESOURCE_POOL:您的 vCenter 资源池的名称或路径。

    • 管理员工作站配置文件:使用 vCenter.resourcePool字段中的值。

    • vcenter.resource_pool 字段对应于 gkectl register bootstrap 命令中的 --vcenter-resource-pool 标志。

  • DATASTOREvCenter 数据存储区的名称。您指定的值必须是名称,而不是路径。如果您需要输入路径,请添加以下 字段:folder = "FOLDER"

    • 管理员工作站配置文件:使用 vCenter.datastore字段中的值。

    • vcenter.datastore 字段对应于 --vcenter-datastore 标志在 gkectl register bootstrap 命令中。

    如果您想为集群节点使用 虚拟机存储政策, 请移除 vcenter.datastore 字段,并改为添加 vcenter.storage_policy_name 。此外,请将 --vcenter-storage-policy 标志添加到 gkectl register bootstrap 命令。您必须为 vcenter.datastorevcenter.storage_policy_name 指定值,但不能同时为两者指定值。

  • FOLDER:集群虚拟机所在的 vCenter 文件夹的名称。如果您未使用文件夹,请移除此字段。

    • 管理员工作站配置文件:使用 vCenter.folder字段中的值。

    • vcenter.folder 字段对应于 gkectl register bootstrap 命令中的 --vcenter-folder 标志。

  • CA_CERT_DATA:PEM 格式的 vCenter CA 证书,但所有换行符都替换为字符串 \n

    1. 运行以下命令以将换行符替换为 \n

      awk 'ORS="\\n" {print}' CA_CERT_PATH_LOCAL
      

      CA_CERT_PATH_LOCAL 替换为 vCenter Server 的 根 CA 证书的路径。如果您使用 gkeadm 创建管理员工作站,则可以使用管理员工作站配置文件中 caCertPath 字段中的值,该值是本地计算机上的路径。gkeadm 将 CA 证书文件复制到管理员工作站。您必须在 gkectl register bootstrap 命令的 --vcenter-ca-cert-path 标志中指定管理员工作站路径。

    2. 复制上一个命令的输出,并将其粘贴到 CA_CERT_DATA 占位变量中。

  • NETWORK:您的 vCenter 网络 的名称。

    • 管理员工作站配置文件:使用 vCenter.network字段中的值。

    • network_config.vcenter_network 字段对应于 gkectl register bootstrap 命令中的 --vcenter-network 标志。

  • GATEWAY:具有控制平面集群节点的子网的默认网关的 IP 地址。

  • NETMASK:具有控制平面集群节点的子网的网络掩码。

  • DNS_SERVERS:DNS 服务器的 IP 地址。

  • NTP_SERVERS:时间 (NTP) 服务器的 IP 地址。

  • control_plane_ip_block.ips 部分中,输入三个控制平面节点的 IP 地址和(可选)主机名。如果您未输入主机名,请从配置中移除 hostname 字段。

  • NUM_CPUS:管理员集群中的每个控制平面节点的 vCPU 数量。必须至少为 4。

  • MEMORY:管理员集群中每个控制平面节点的内存大小(以 MiB 为单位)。必须至少为 8192,但我们建议使用 16384。

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

可选:配置私有注册表

默认情况下,在创建或升级集群期间,Google Distributed Cloud 会使用组件访问服务账号gcr.io/gke-on-prem-release 拉取系统映像。或者,您可以提供自己的容器注册表服务器,以便改为从您的私有注册表服务器拉取系统映像。

如需配置私有注册表,请执行以下操作:

  1. 将以下部分添加到管理员集群配置文件中:

    private_registry_config {
      address = "ADDRESS"
      ca_cert = "CA_CERT"
    }
    

    替换以下内容:

    • ADDRESS:运行您的私有注册表的机器的 IP 地址或 FQDN(完全限定域名)。

    • CA_CERT:公钥的 CA 证书数据,但所有换行符都替换为字符串 \n

    1. 运行以下命令以将换行符替换为 \n

      awk 'ORS="\\n" {print}' PUBLIC_KEY_PATH
      

      PUBLIC_KEY_PATH 替换为公钥的路径。

    2. 复制上一个命令的输出,并将其粘贴到 CA_CERT 占位变量中。

  2. 如果您的网络由代理服务器提供支持,请添加以下内容:

    proxy {
      url: "PROXY_SERVER_ADDRESS"
      no_proxy: "BYPASS_LIST"
    }
    

    替换以下内容:

    • PROXY_SERVER_ADDRESS:代理服务器的 HTTP 地址。即使端口号与该方案的默认端口相同,也要填写此端口号。

    • BYPASS_LIST:不应通过代理服务器的 IP 地址、IP 地址范围、主机名和域名的列表(以英文逗号分隔)。

    示例:

    url: "http://my-proxy.example.local:80"
    no_proxy: "192.0.2.0/24,my-host.example.local,198.51.100.0"
    

    当 Google Distributed Cloud 向这些地址、主机或网域之一发送请求时,该请求会绕过代理服务器并直接发送到目标。

如需详细了解如何使用私有注册表,包括普通集群和高级集群之间的区别,请参阅配置私有容器注册表

验证配置文件和方案

main.tf 所在的目录中,运行以下命令:

  1. 初始化 Terraform:

    terraform init
    

    Terraform 会安装所有需要的库,例如 Google Cloud 提供程序。根据需要修复 maint.tf 中的所有错误。

  2. 创建 Terraform 方案:

    terraform plan -out tfplan
    

    检查配置,并根据需要进行更改。

在应用方案之前,您必须先创建引导集群,如下一部分中所述。

创建引导集群

运行 gkectl register bootstrap 命令时,系统会提示您输入 vCenter 账号用户名和密码。确保您有可用的凭证。如果您使用 gkeadm 创建管理员工作站,则用户名和密码位于 credential.yaml 文件中。

  1. 使用 SSH 登录管理员工作站。

  2. 使用 Google Cloud CLI 进行身份验证:

    gcloud auth login
    
  3. 运行以下命令以创建引导集群。许多标志值与 main.tf 字段中的值相同。不过请注意,该命令会采用您必须在提供的占位变量中指定的其他值。

    gkectl register bootstrap \
        --target-cluster-name=ADMIN_CLUSTER_NAME \
        --project-id=PROJECT_ID \
        --location=REGION \
        --vcenter-address=VCENTER_ADDRESS \
        --vcenter-datacenter=DATA_CENTER \
        --vcenter-cluster=VCENTER_CLUSTER \
        --vcenter-resource-pool=RESOURCE_POOL \
        --vcenter-datastore=DATASTORE \
        --vcenter-network=NETWORK \
        --vcenter-ca-cert-path=CA_CERT_PATH \
        --bundle-path=BUNDLE_PATH \
        --component-access-service-account-key-path=COMPONENT_ACCESS_SA_PATH \
        --register-service-account-key-path=CONNECT_REGISTER_SA_PATH \
        --stackdriver-service-account-key-path=LOG_MON_SA_PATH \
        --cloud-audit-logging-service-account-key-path=CLOUD_AUDIT_SA_PATH \
        --admin-kubeconfig-out=KUBECONFIG_NAME
    

    将以下内容替换为管理员工作站路径:

    • CA_CERT_PATH:vCenter Server 的根 CA 证书的路径。
    • BUNDLE_PATH:软件包文件的路径。如果您使用 gkeadm 创建管理员工作站,则软件包文件位于 /var/lib/gke/bundles/ 中。文件名取决于 Google Distributed Cloud 版本,例如 gke-onprem-vsphere-1.31.0-gke.889-full.tgz
    • COMPONENT_ACCESS_SA_PATH:组件访问服务帐号的密钥文件的路径。
    • CONNECT_REGISTER_SA_PATH:连接注册服务账号的密钥文件的路径。
    • LOG_MON_SA_PATH:日志记录监控服务帐号的密钥文件的路径。
    • CLOUD_AUDIT_SA_PATH:审核日志记录服务帐号的路径。如果您未创建审核日志记录服务账号,请指定日志记录监控服务账号的密钥文件路径。
    • KUBECONFIG_NAMEgkectl register bootstrap 命令创建的 kubeconfig 文件的名称。如果您未指定此标志,该命令会在当前工作目录中创建名为 kubeconfig 的文件。如果已存在名为 kubeconfig 的文件,则该命令会覆盖该文件。

    根据需要修改命令,以添加以下标志:

    • 如果您在 main.tf 中指定了文件夹,请添加以下标志:--vcenter-folder=FOLDER
    • 如果您在 main.tf 中指定了虚拟机存储政策,请移除 --vcenter-datastore 并添加以下标志: --vcenter-storage-policy-name=STORAGE_POLICY_NAME
    • 如果您的管理员工作站位于代理服务器后面的网络上,请添加以下标志:

      • --proxy-url=PROXY_URL
      • --no-proxy=NO_PROXY

      替换以下内容:

      • PROXY_URL:代理服务器的网址。
      • NO_PROXY:从代理中排除的网域和 IP 地址 的值,以英文逗号分隔。

    如果您添加了标志,请确保添加命令行续行反斜杠 字符 (\)。

  4. 系统提示时,输入(或复制并粘贴)vCenter 用户名。用户名不会回显到屏幕。

  5. 系统提示时,输入(或复制并粘贴)vCenter 密码。密码不会回显到屏幕。

该命令会运行多项验证。gkectl 成功创建引导集群后,您会看到如下所示的输出,为了便于阅读,已经过截断处理:

Running workstation validations
- Validation Category: Workstation
    - [SUCCESS] Workstation OS
    - [SUCCESS] Workstation Hardware
    - [SUCCESS] Workstation Package
    - [SUCCESS] Workstation NTP
    - [SUCCESS] Workstation Docker
...
All validation results were SUCCESS.
Unpacking GKE on-prem bundle: /var/lib/gke/bundles/gke-onprem-vsphere-1.31.0-gke.889-full.tgz
...
Successfully created and registered the bootstrap cluster
...
Waiting for preflight checks to run or OnPremAdminCluster to be applied...... -

该进程会继续运行,直到创建管理员集群为止。

如果您在创建管理员集群之前退出 gkectl register bootstrap 命令,管理员集群创建会失败,您需要使用以下命令删除引导集群:

gkectl delete bootstrap \
    --target-cluster-name=ADMIN_CLUSTER_NAME \
    --project-id=PROJECT_ID \
    --location=REGION \
     --register-service-account-key-path=CONNECT_REGISTER_SA_PATH

创建管理员集群

应用 Terraform 方案以创建管理员集群:

terraform apply "tfplan"

创建管理员集群大约需要 15 分钟或更长时间。您可以在 Google Cloud 控制台中的 GKE 集群页面上查看集群。

连接到管理员集群

gkectl register bootstrap 命令会为管理员工作站上的管理员集群创建 kubeconfig 文件。如果您在运行 gkectl register bootstrap 时未指定 --admin-kubeconfig-out 标志,则该命令会在您运行命令的目录中创建一个名为 kubeconfig 的 kubeconfig 文件。

您需要限制对此 kubeconfig 的访问权限,因为它包含集群的身份验证凭据。

此外,您还可以通过 Connect 网关运行只读 kubectl 命令。

  1. 在安装了 gcloud CLI 的计算机上运行以下命令,以获取可通过 Connect 网关访问集群的 kubeconfig 条目。

    gcloud container fleet memberships get-credentials ADMIN_CLUSTER_NAME \
        --project=PROJECT_ID
    

    输出类似于以下内容:

    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.
    
  2. 您现在可以通过 Connect 网关运行只读 kubectl 命令,例如:

    kubectl get pods -A
    

    如果您需要管理员集群的完整管理权限,请参阅 设置 Connect 网关