如果您已使用 Terraform 管理 VMware 和本地
VMware 资源,则仅使用 Terraform 为 Google Distributed Cloud 软件创建管理员集群,仅适用于
VMware。 Google Cloud 您还可以使用 gkectl
或 Google 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 创建管理员集群的概要步骤:
填写配置文件。使用 google_gkeonprem_vmware_admin_cluster 资源和以下示例创建
main.tf配置文件。创建
bootstrap集群。运行gkectl register bootstrap以创建引导集群。当该命令完成引导集群的创建后,输出会告知您完成管理员集群配置。 该进程会继续运行,直到创建管理员集群为止。创建管理员集群。在另一个终端窗口中或在有权访问 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_ADDRESS:vCenter Server 地址。管理员工作站配置文件:使用
vCenter.credentials.address字段中的值。vcenter.address字段对应于gkectl register bootstrap命令中的--vcenter-address标志。
DATA_CENTER:vCenter 数据中心的名称。管理员工作站配置文件:使用
vCenter.datacenter字段中的值。vcenter.datacenter字段对应于gkectl register bootstrap命令中的--vcenter-datacenter标志。
VCENTER_CLUSTER:vCenter 集群的名称。管理员工作站配置文件:使用
vCenter.cluster字段中的值。vcenter.cluster字段对应于gkectl register bootstrap命令中的--vcenter-cluster标志。
RESOURCE_POOL:您的 vCenter 资源池的名称或路径。管理员工作站配置文件:使用
vCenter.resourcePool字段中的值。vcenter.resource_pool字段对应于gkectl register bootstrap命令中的--vcenter-resource-pool标志。
DATASTORE:vCenter 数据存储区的名称。您指定的值必须是名称,而不是路径。如果您需要输入路径,请添加以下 字段:folder = "FOLDER"管理员工作站配置文件:使用
vCenter.datastore字段中的值。vcenter.datastore字段对应于--vcenter-datastore标志在gkectl register bootstrap命令中。
如果您想为集群节点使用 虚拟机存储政策, 请移除
vcenter.datastore字段,并改为添加vcenter.storage_policy_name。此外,请将--vcenter-storage-policy标志添加到gkectl register bootstrap命令。您必须为vcenter.datastore或vcenter.storage_policy_name指定值,但不能同时为两者指定值。FOLDER:集群虚拟机所在的 vCenter 文件夹的名称。如果您未使用文件夹,请移除此字段。管理员工作站配置文件:使用
vCenter.folder字段中的值。vcenter.folder字段对应于gkectl register bootstrap命令中的--vcenter-folder标志。
CA_CERT_DATA:PEM 格式的 vCenter CA 证书,但所有换行符都替换为字符串\n。运行以下命令以将换行符替换为
\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标志中指定管理员工作站路径。复制上一个命令的输出,并将其粘贴到
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 拉取系统映像。或者,您可以提供自己的容器注册表服务器,以便改为从您的私有注册表服务器拉取系统映像。
如需配置私有注册表,请执行以下操作:
将以下部分添加到管理员集群配置文件中:
private_registry_config { address = "ADDRESS" ca_cert = "CA_CERT" }替换以下内容:
ADDRESS:运行您的私有注册表的机器的 IP 地址或 FQDN(完全限定域名)。CA_CERT:公钥的 CA 证书数据,但所有换行符都替换为字符串\n。
运行以下命令以将换行符替换为
\n:awk 'ORS="\\n" {print}' PUBLIC_KEY_PATH将
PUBLIC_KEY_PATH替换为公钥的路径。复制上一个命令的输出,并将其粘贴到
CA_CERT占位变量中。
如果您的网络由代理服务器提供支持,请添加以下内容:
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 所在的目录中,运行以下命令:
初始化 Terraform:
terraform initTerraform 会安装所有需要的库,例如 Google Cloud 提供程序。根据需要修复
maint.tf中的所有错误。创建 Terraform 方案:
terraform plan -out tfplan检查配置,并根据需要进行更改。
在应用方案之前,您必须先创建引导集群,如下一部分中所述。
创建引导集群
运行 gkectl register bootstrap 命令时,系统会提示您输入 vCenter 账号用户名和密码。确保您有可用的凭证。如果您使用 gkeadm 创建管理员工作站,则用户名和密码位于 credential.yaml 文件中。
使用 SSH 登录管理员工作站。
使用 Google Cloud CLI 进行身份验证:
gcloud auth login
运行以下命令以创建引导集群。许多标志值与
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_NAME:gkectl 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 地址 的值,以英文逗号分隔。
如果您添加了标志,请确保添加命令行续行反斜杠 字符 (\)。
系统提示时,输入(或复制并粘贴)vCenter 用户名。用户名不会回显到屏幕。
系统提示时,输入(或复制并粘贴)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 命令。
在安装了 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.您现在可以通过 Connect 网关运行只读
kubectl命令,例如:kubectl get pods -A如果您需要管理员集群的完整管理权限,请参阅 设置 Connect 网关。