本页面是指南的第二部分,该指南将向您介绍适用于 Bare Metal 的小型 GDCV 安装的概念验证。第一部分设置最小基础架构介绍了如何设置硬件、规划 IP 地址以及设置必要的 Google Cloud 基础架构。本文档以上一部分中的设置和规划为基础,介绍了如何创建管理员集群和用户集群。然后,您可以继续创建 Service 和 Ingress。
本指南可帮助您创建最小的 GKE on Bare Metal 安装。此最小安装可能不适合您的实际生产需求和应用场景。如需了解生产安装,请参阅安装指南。
准备工作
确保您已按照本指南的上一部分设置最小基础架构所述设置了硬件并规划了 IP 地址。或者,使用 Google Cloud 控制台创建 GKE on Bare Metal 管理员集群流程的前提条件部分中的网络要求规划工具。
如果要使用 Terraform 创建用户集群,则需要在管理员工作站或其他计算机上使用 Terraform。
确保您已安装最新的 Google Cloud CLI 组件:
gcloud components update
请按照以下步骤激活并使用 GKE On-Prem API:
在项目中启用 API:
gcloud services enable \ --project PROJECT_ID \ gkeonprem.googleapis.com
将
PROJECT_ID
替换为您的舰队宿主项目的项目 ID。如果您收到
PERMISSION_DENIED
错误,请仔细检查您输入的项目 ID。如果项目 ID 正确无误,请运行gcloud auth login
以使用有权访问项目的账号登录 Google Cloud CLI。如果这是您首次在项目中启用 GKE On-Prem API,则需要初始化该 API。为此,您可以调用 gcloud CLI 命令,该命令可用于显示可用于创建集群的版本:
gcloud container bare-metal clusters query-version-config \ --project=PROJECT_ID \ --location="us-central1"
过程概览
创建基本集群包括以下主要步骤:
收集用于指定集群配置的信息。
创建管理员集群,用于管理用户集群。
创建用户集群,用于运行工作负载。
1. 收集信息
使用您在设置最小基础架构中或通过网络规划器准备的信息来填充下表中的每个占位符。这些占位符与包含一个管理员集群和一个用户集群的最小安装的集群配置文件中的字段值相对应。某些占位符设置为生成的集群配置文件中预填充的值,但所有占位符均可修改。
基本集群信息 | |
您要创建的管理员集群的名称。管理员工作站上的集群工件的位置和命名基于集群名称。集群命名空间源自集群名称。 | ADMIN_CLUSTER_NAME |
您要创建的用户集群的名称。管理员工作站上的集群工件的位置和命名基于集群名称。集群命名空间源自集群名称。 | USER_CLUSTER_NAME |
您在本指南第一部分中下载的 bmctl 的版本。 |
CLUSTER_VERSION |
账号信息 | |
管理员工作站上的 SSH 私钥文件的路径。默认情况下,路径为 /home/USERNAME/.ssh/id_rsa 。 |
SSH_PRIVATE_KEY_PATH |
您要用于将集群连接到 Google Cloud 以及查看日志和指标的 Google Cloud 项目的 ID。此项目也称为舰队宿主项目。 | PROJECT_ID |
与您的 Google Cloud 账号关联的电子邮件地址。例如:alex@example.com 。 |
GOOGLE_ACCOUNT_EMAIL |
节点机器 IP 地址 | |
管理员集群控制平面节点的 IP 地址。 | ADMIN_CP_NODE_IP |
用户集群控制平面节点的 IP 地址。 | USER_CP_NODE_IP |
用户集群工作器节点的 IP 地址。 | USER_WORKER_NODE_IP |
VIP 地址 | |
管理员集群的 Kubernetes API 服务器的 VIP 地址。 | ADMIN_CP_VIP |
用户集群的 Kubernetes API 服务器的 VIP 地址。 | USER_CP_VIP |
用作 Ingress 代理的外部地址的 VIP。 | USER_INGRESS_VIP |
用作 LoadBalancer 类型的 Service 的外部 IP 地址的 IP 地址范围。请注意,此范围包含 MetalLB 所需的 Ingress VIP。其他 IP 地址不能与此范围重叠。 | START_IP-END_IP |
Pod 和 Service CIDR | |
供管理员集群上的 Pod 使用的 IP 地址范围(采用 CIDR 地址块表示法)。建议的起始值是 192.168.0.0/16 ,即在生成的集群配置文件中预填充的值。 |
192.168.0.0/16 |
供管理员集群上的 Service 使用的 IP 地址范围(采用 CIDR 地址块表示法)。建议的起始值是 10.96.0.0/20 ,即在生成的集群配置文件中预填充的值。 |
10.96.0.0/20 |
供用户集群上的 Pod 使用的 IP 地址范围(采用 CIDR 地址块表示法)。建议的起始值是 192.168.0.0/16 ,即在生成的集群配置文件中预填充的值。 |
192.168.0.0/16 |
供用户集群上的 Service 使用的 IP 地址范围(采用 CIDR 地址块表示法)。建议的起始值是 10.96.0.0/20 ,即在生成的集群配置文件中预填充的值。 |
10.96.0.0/20 |
2. 创建管理员集群
以下步骤为最小管理员集群和用户集群安装创建管理员集群。在继续操作之前,请确保已为上面的收集信息部分的表中的每个占位符提供了值。
如需为最小安装创建管理员集群,请执行以下操作:
使用以下命令设置 GKE on Bare Metal 可用于创建集群的默认凭据:
gcloud auth application-default login
如需生成集群配置文件,请从管理员工作站上的
/baremetal
目录运行以下命令:bmctl create config -c ADMIN_CLUSTER_NAME \ --enable-apis --create-service-accounts --project-id=PROJECT_ID
验证管理员集群配置文件:
以下集群配置文件填充了您在上一部分的规划表中输入的值。除了您输入的值之外,请注意与生成的配置文件之间的以下差异:
- 此示例中删除了注释,以增强可读性。
- 删除了
NodePool
规范。管理员集群不允许使用工作器节点。
gcrKeyPath: bmctl-workspace/.sa-keys/PROJECT_ID-anthos-baremetal-gcr.json sshPrivateKeyPath: SSH_PRIVATE_KEY_PATH gkeConnectAgentServiceAccountKeyPath: bmctl-workspace/.sa-keys/PROJECT_ID-anthos-baremetal-connect.json gkeConnectRegisterServiceAccountKeyPath: bmctl-workspace/.sa-keys/PROJECT_ID-anthos-baremetal-register.json cloudOperationsServiceAccountKeyPath: bmctl-workspace/.sa-keys/PROJECT_ID-anthos-baremetal-cloud-ops.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 profile: default anthosBareMetalVersion: CLUSTER_VERSION gkeConnect: projectID: PROJECT_ID controlPlane: nodePoolSpec: nodes: - address: ADMIN_CP_NODE_IP clusterNetwork: pods: cidrBlocks: - 192.168.0.0/16 services: cidrBlocks: - 10.96.0.0/20 loadBalancer: mode: bundled ports: controlPlaneLBPort: 443 vips: controlPlaneVIP: ADMIN_CP_VIP clusterOperations: projectID: PROJECT_ID location: us-central1 storage: lvpNodeMounts: path: /mnt/localpv-disk storageClassName: local-disks lvpShare: path: /mnt/localpv-share storageClassName: local-shared numPVUnderSharedPath: 5 nodeConfig: podDensity: maxPodsPerNode: 250
将管理员工作站上生成的配置文件的内容替换为上面示例中的内容。
打开生成的文件
bmctl-workspace/ADMIN_CLUSTER_NAME/ADMIN_CLUSTER_NAME.yaml
,并将其内容替换为您在上一步中验证的示例内容。如需创建管理员集群,请从管理员工作站上的
/baremetal
目录运行以下命令:bmctl create cluster -c ADMIN_CLUSTER_NAME
bmctl
命令在运行预检检查和创建集群时会向屏幕显示输出。详细信息会写入管理员工作站上的baremetal/bmctl-workspace/ADMIN_CLUSTER_NAME/log
文件夹中的日志。集群创建过程可能需要几分钟时间才能完成。
验证集群已创建且正在运行:
kubectl --kubeconfig bmctl-workspace/ADMIN_CLUSTER_NAME/ADMIN_CLUSTER_NAME-kubeconfig \ get nodes
如果集群正在运行,响应将如下所示:
NAME STATUS ROLES AGE VERSION node-01 Ready control-plane 16h v1.25.7-gke.1000
如需向您的用户账号授予集群的 Kubernetes
clusterrole/cluster-admin
角色,请运行以下gcloud
命令:gcloud container fleet memberships generate-gateway-rbac \ --membership=ADMIN_CLUSTER_NAME \ --role=clusterrole/cluster-admin \ --users=GOOGLE_ACCOUNT_EMAIL \ --project=PROJECT_ID \ --kubeconfig=bmctl-workspace/ADMIN_CLUSTER_NAME/ADMIN_CLUSTER_NAME-kubeconfig \ --context=ADMIN_CLUSTER_NAME-admin@ADMIN_CLUSTER_NAME \ --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/<var class="edit"scope="ADMIN_CLUSTER_NAME">ADMIN_CLUSTER_NAME</var>/<var class="edit"scope="ADMIN_CLUSTER_NAME">ADMIN_CLUSTER_NAME</var>-kubeconfig, context: <var class="edit"scope="ADMIN_CLUSTER_NAME">ADMIN_CLUSTER_NAME</var>-admin@<var class="edit"scope="ADMIN_CLUSTER_NAME">ADMIN_CLUSTER_NAME</var> Writing RBAC policy for user: GOOGLE_ACCOUNT_EMAIL to cluster. Successfully applied the RBAC policy to cluster.
此外,您还可以通过 RBAC 政策在 Google Cloud 控制台中登录集群以查看更多集群详细信息。
(可选)在 GKE On-Prem API 中注册集群。借助此 Google Cloud 托管的 API,您可以使用 Google Cloud 控制台或 gcloud CLI 管理管理员集群生命周期。
gcloud container bare-metal admin-clusters enroll ADMIN_CLUSTER_NAME \ --project=PROJECT_ID \ --admin-cluster-membership=projects/PROJECT_ID/locations/global/memberships/ADMIN_CLUSTER_NAME \ --location=us-central1
3. 创建用户集群
以下步骤将为最小管理员集群和用户集群安装创建用户集群。在继续操作之前,请确保已为上面的收集信息部分的表中的每个占位符提供了值。
如果您使用 Terraform 创建用户集群,则该集群会自动注册到 GKE On-Prem API。借助此 Google Cloud 托管的 API,您可以使用 Google Cloud 控制台、gcloud CLI 和 Terraform 管理集群生命周期。如果您使用 bmctl
,则可以选择在创建集群后在 GKE On-Prem API 中注册该集群。
如需为最小安装创建用户集群,请执行以下操作:
bmctl
生成集群配置文件:
bmctl create config -c USER_CLUSTER_NAME \ --project-id=PROJECT_ID
验证用户集群配置文件:
以下集群配置文件填充了您之前在规划表中输入的值。除了您输入的值之外,请注意与生成的配置文件之间的以下差异:
- 此示例中删除了注释,以增强可读性。
- 集群类型
spec.type
已设置为user
。 - 添加了
spec.clusterSecurity.authorization.clusterAdmin.gcpAccounts
字段,以将clusterrole/cluster-admin
授予您的账号。此外,您还可以通过此字段在 Google Cloud 控制台中登录您的集群,以查看更多集群详细信息。
--- apiVersion: v1 kind: Namespace metadata: name: cluster-USER_CLUSTER_NAME --- apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: USER_CLUSTER_NAME namespace: cluster-USER_CLUSTER_NAME spec: type: user profile: default anthosBareMetalVersion: CLUSTER_VERSION gkeConnect: projectID: PROJECT_ID controlPlane: nodePoolSpec: nodes: - address: USER_CP_NODE_IP clusterNetwork: pods: cidrBlocks: - 192.168.0.0/16 services: cidrBlocks: - 10.96.0.0/20 loadBalancer: mode: bundled ports: controlPlaneLBPort: 443 vips: controlPlaneVIP: USER_CP_VIP ingressVIP: USER_INGRESS_VIP addressPools: - name: pool1 addresses: - START_IP-END_IP clusterOperations: projectID: PROJECT_ID location: us-central1 clusterSecurity: authorization: clusterAdmin: gcpAccounts: - GOOGLE_ACCOUNT_EMAIL storage: lvpNodeMounts: path: /mnt/localpv-disk storageClassName: local-disks lvpShare: path: /mnt/localpv-share storageClassName: local-shared numPVUnderSharedPath: 5 nodeConfig: podDensity: maxPodsPerNode: 250 --- apiVersion: baremetal.cluster.gke.io/v1 kind: NodePool metadata: name: node-pool-1 namespace: cluster-USER_CLUSTER_NAME spec: clusterName: USER_CLUSTER_NAME nodes: - address: USER_WORKER_NODE_IP
将管理员工作站上生成的配置文件的内容替换为上面示例中的内容。
打开生成的文件
bmctl-workspace/USER_CLUSTER_NAME/USER_CLUSTER_NAME.yaml
,并将其内容替换为您在上一步中验证的示例内容。创建用户集群:
bmctl create cluster -c USER_CLUSTER_NAME \ --kubeconfig ADMIN_KUBECONFIG
bmctl
命令在运行预检检查和创建集群时会向屏幕显示输出。详细信息会写入管理员工作站上的baremetal/bmctl-workspace/USER_CLUSTER_NAME/log
文件夹中的日志。集群创建过程可能需要几分钟时间才能完成。
验证集群已创建且正在运行:
kubectl --kubeconfig bmctl-workspace/USER_CLUSTER_NAME/USER_CLUSTER_NAME-kubeconfig \ get nodes
如果集群正在运行,响应将如下所示:
NAME STATUS ROLES AGE VERSION nuc-3 Ready control-plane 4m32s v1.26.2-gke.1001 nuc-4 Ready worker 2m2s v1.26.2-gke.1001
(可选)在 GKE On-Prem API 中注册集群:
gcloud container bare-metal clusters enroll USER_CLUSTER_NAME \ --project=PROJECT_ID \ --admin-cluster-membership=projects/PROJECT_ID/locations/global/memberships/ADMIN_CLUSTER_NAME \ --location=us-central1
控制台
请按照以下步骤在控制台中创建用户集群:
在控制台中,转到创建 GKE on Bare Metal 集群页面。
确保已选择 Google Cloud 项目列表
PROJECT_ID
。在选择集群类型下,选择为现有管理员集群创建用户集群
点击下一步。
集群基本信息
输入
USER_CLUSTER_NAME
作为用户集群的名称或使用默认值。确保已选择新建的管理员集群。
在 GCP API 位置中,选择 us-central1。
在适用于裸金属版本的 GDCV 中,选择
CLUSTER_VERSION
或使用默认值。您可以对本页面上的其余设置使用默认值。点击左侧导航栏中的网络。
网络
在控制平面部分的控制平面节点 IP 1 字段中输入以下内容:
USER_CP_NODE_IP
在负载均衡器部分中,使用与 MetalLB 捆绑的默认负载均衡器。
转到新建地址池部分。在 IP 地址范围 1 字段中输入 IP 地址范围:
10.200.0.51-10.200.0.70
点击完成。
在虚拟 IP 部分中,输入控制平面 VIP 的 IP 地址:
USER_CP_VIP
为 Ingress VIP 输入 IP 地址:
USER_INGRESS_VIP
在 Service CIDR 和 Pod CIDR 部分中,如果您未更改规划工具中的 Service CIDR 和 Pod CIDR,则可以使用默认值。
如果您更改了 CIDR,则输入要使用的 CIDR:
- Service CIDR:
10.96.0.0/20
- Pod CIDR:
192.168.0.0/16
点击左侧导航栏中的默认池。
创建节点池
您的集群必须至少有一个节点池来存储工作器节点。节点池是用于在此集群中创建的工作器节点组的模板。
在节点地址 1 字段中输入用户集群工作器节点的 IP 地址:
USER_WORKER_NODE_IP
创建集群
点击验证并创建以创建用户集群。
创建用户集群需要 15 分钟或更长时间。控制台会在验证设置并创建集群时显示状态消息。
如果配置出现问题,控制台将显示一条错误消息,该消息应该足够清晰,以便您修复配置问题并再次尝试创建集群。
如需查看有关创建过程的详细信息,请点击显示详细信息以显示侧面板。点击
可关闭详细信息面板。创建集群后,将显示集群状态:正在运行。
创建集群后,点击
集群以返回集群页面。
gcloud CLI
本部分介绍如何使用 gcloud CLI 创建用户集群和节点池。
运行以下命令以创建用户集群:
gcloud container bare-metal clusters create USER_CLUSTER_NAME \ --project=PROJECT_ID \ --location=us-central1 \ --admin-cluster-membership=ADMIN_CLUSTER_NAME \ --admin-cluster-membership-project=PROJECT_ID \ --admin-cluster-membership-location=global \ --version=CLUSTER_VERSION \ --admin-users=GOOGLE_ACCOUNT_EMAIL \ --island-mode-service-address-cidr-blocks=10.96.0.0/20 \ --island-mode-pod-address-cidr-blocks=192.168.0.0/16 \ --metal-lb-address-pools='pool=lb-pool-1,manual-assign=True,addresses=START_IP-END_IP' \ --control-plane-node-configs='node-ip=USER_CP_NODE_IP' \ --control-plane-vip=USER_CP_VIP \ --control-plane-load-balancer-port=443 \ --ingress-vip=USER_INGRESS_VIP \ --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
此命令的输出类似如下所示:
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=us-central1
创建集群大约需要 15 分钟或更长时间。创建集群时,您可以不时运行上一个命令来获取当前状态。
创建集群后,您会看到如下所示的输出:
Created Anthos cluster on bare metal [https://gkeonprem.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/bareMetalClusters/USER_CLUSTER_NAME].
创建集群后,运行以下命令以在新创建的集群上创建节点池。
gcloud container bare-metal node-pools create node-pool-1 \ --cluster=USER_CLUSTER_NAME \ --project=PROJECT_ID \ --location=us-central1 \ --node-configs node-ip=USER_WORKER_NODE_IP
如需了解详情和其他示例,请参阅以下内容:
Terraform
本部分介绍如何使用 Terraform 创建用户集群和节点池。
创建一个目录,并在该目录中创建一个新文件。文件名必须具有
.tf
扩展名。在本指南中,该文件名为main.tf
。mkdir DIRECTORY && cd DIRECTORY && touch main.tf
验证用户集群 Terraform 资源:
以下 Terraform 资源示例填充了您在上一部分的规划表中输入的值。
resource "google_gkeonprem_bare_metal_cluster" "cluster-basic" { provider = google-beta name = "USER_CLUSTER_NAME" project = "PROJECT_ID" location = "us-central1" admin_cluster_membership = "projects/PROJECT_ID/locations/global/memberships/ADMIN_CLUSTER_NAME" bare_metal_version = "CLUSTER_VERSION" network_config { island_mode_cidr { service_address_cidr_blocks = ["10.96.0.0/20"] pod_address_cidr_blocks = ["192.168.0.0/16"] } } control_plane { control_plane_node_pool_config { node_pool_config { labels = {} operating_system = "LINUX" node_configs { labels = {} node_ip = "USER_CP_NODE_IP" } } } } load_balancer { port_config { control_plane_load_balancer_port = 443 } vip_config { control_plane_vip = "USER_CP_VIP" ingress_vip = "USER_INGRESS_VIP" } metal_lb_config { address_pools { pool = "pool1" addresses = [ "START_IP-END_IP" ] avoid_buggy_ips = true manual_assign = true } } } storage { lvp_share_config { lvp_config { path = "/mnt/localpv-share" storage_class = "local-shared" } shared_path_pv_count = 5 } lvp_node_mounts_config { path = "/mnt/localpv-disk" storage_class = "local-disks" } } security_config { authorization { admin_users { username = "GOOGLE_ACCOUNT_EMAIL" } } } } resource "google_gkeonprem_bare_metal_node_pool" "node-pool-default" { provider = google-beta name = "node-pool-1" bare_metal_cluster = google_gkeonprem_bare_metal_cluster.cluster-basic.name project = "PROJECT_ID" location = "us-central1" node_pool_config { operating_system = "LINUX" node_configs { node_ip = "USER_WORKER_NODE_IP" } } }
将 Terraform 资源复制到
main.tf
并保存该文件。初始化并创建 Terraform 方案:
terraform init
Terraform 会安装任何所需的库,例如 Google Cloud 提供程序。
检查配置,并根据需要进行更改:
terraform plan
应用 Terraform 方案以创建用户集群:
terraform apply
出现提示时,输入
yes
。创建基本用户集群和节点池大约需要 15 分钟或更长时间,具体取决于网络情况。
如需为用户集群创建 kubeconfig 文件,请在管理员工作站上运行以下命令:
bmctl get credentials --cluster USER_CLUSTER_NAME \ --admin-kubeconfig bmctl-workspace/ADMIN_CLUSTER_NAME/ADMIN_CLUSTER_NAME-kubeconfig
该命令的输出会显示用户集群的 kubeconfig 文件的名称,例如:
bmctl-workspace/USER_CLUSTER_NAME/USER_CLUSTER_NAME-TIMESTAMP-kubeconfig
文件名中的
TIMESTAMP
表示文件的创建日期和时间。由于此文件包含集群的身份验证凭据,因此您应该将其存储在具有受限访问权限的安全位置。
验证集群已创建且正在运行:
kubectl --kubeconfig bmctl-workspace/USER_CLUSTER_NAME/USER_CLUSTER_NAME-TIMESTAMP-kubeconfig \ get nodes
如果集群正在运行,响应将如下所示:
NAME STATUS ROLES AGE VERSION nuc-3 Ready control-plane 4m32s v1.26.2-gke.1001 nuc-4 Ready worker 2m2s v1.26.2-gke.1001
如需了解详情和其他示例,请参阅以下内容:
连接到用户集群
如果您使用 bmctl
创建了用户集群,则您的电子邮件地址会包含在示例用户配置文件的 clusterSecurity
部分中。如果您使用 Terraform 创建了集群,则您的电子邮件地址会包含在示例 google_gkeonprem_bare_metal_cluster
资源的 security_config
部分中。这些示例会为您配置基于角色的访问权限控制 (RBAC) 政策,这些政策会:
向您授予集群的 Kubernetes
clusterrole/cluster-admin
角色。允许您使用 Google 身份在 Google Cloud 控制台中登录集群。您可以在控制台的 GKE 集群页面上查看集群。
允许您使用 Connect 网关的 kubeconfig 在本地计算机上运行
kubectl
命令。
如需获取 Connect 网关的 kubeconfig,请从本地计算机运行以下命令:
获取可通过 Connect 网关访问集群的 kubeconfig 条目。
gcloud container fleet memberships get-credentials USER_CLUSTER_NAME \ --project=PROJECT_ID
输出类似于以下内容:
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.
您现在可以通过 Connect 网关运行
kubectl
命令:kubectl get nodes
输出类似于以下内容:
NAME STATUS ROLES AGE VERSION nuc-3 Ready control-plane 4m32s v1.26.2-gke.1001 nuc-4 Ready worker 2m2s v1.26.2-gke.1001
许多
kubectl
命令需要管理员集群的 kubeconfig。您将需要在管理员工作站上运行这些命令。