创建集群后,您可以更改集群配置的某些方面。例如,您可以执行以下操作:
- 添加、移除或替换节点。
- 为集群添加或移除注解。
- 修改集群和节点池资源中的可变字段的值。
- 修改其他自定义资源。
您可以使用 bmctl
或 Google Cloud CLI 更新集群。如果您使用 Terraform 创建了管理员集群或用户集群,则可以使用 Terraform 来更新集群。请注意以下几点:
创建集群后,集群配置的许多方面是不可变的,且无法更新。如需查看可变字段和不可变字段的完整列表,请参阅集群配置字段参考。字段参考是一个可排序的表格。点击列标题可更改排列顺序。点击字段名称可查看其说明。
gcloud CLI 和 Terraform 仅支持更新管理员集群和用户集群。您必须使用
bmctl
更新其他集群类型。gcloud CLI 和 Terraform 仅支持对集群和节点池资源进行更改。您必须使用
kubectl
或bmctl
更新影响集群的其他自定义资源。
本页面适用于管理底层技术基础设施生命周期的管理员、架构师和运维人员。如需详细了解我们在 Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE Enterprise 用户角色和任务。
如何更新集群
通常,您需要执行以下一系列操作来更新集群:
bmctl
更改集群配置文件中适用字段的值,该文件默认位于此处:
bmctl-workspace/CLUSTER-NAME/CLUSTER-NAME.yaml
通过运行
bmctl update
命令来更新集群:bmctl update cluster -c CLUSTER_NAME --kubeconfig=KUBECONFIG
替换以下内容:
CLUSTER_NAME
:您要更新的集群的名称。KUBECONFIG
:对于管理员集群、混合集群或独立集群,输入集群的 kubeconfig 文件的路径。对于用户集群,输入admin集群的 kubeconfig 文件的路径。
gcloud CLI
仅为要修改的配置指定标志。
运行适用的更新命令:
Terraform
更改用于创建集群或节点池的 Terraform 配置文件中适用字段的值。如需详细了解字段说明,请参阅 Terraform 参考文档:
通过运行
terraform apply
命令更新配置。
以下部分概述了更新现有集群的一些常见示例。
在集群中添加或移除节点
节点池是集群中具有相同配置的一组节点。请注意,节点始终属于节点池。要向集群添加新节点,您需要将其添加到特定节点池。从节点池中移除节点相当于从集群中完全移除该节点。
Google Distributed Cloud 中有三种类型的节点池:控制平面节点池、负载均衡器节点池和工作器节点池。以下部分介绍了如何在每种类型的节点池中添加或移除节点。
bmctl
如需在节点池中添加或移除节点,您可以在集群配置文件的特定部分中添加或移除节点的 IP 地址。以下列表显示了给定节点池要修改的部分:
- 工作器节点池:在
NodePool
规范的spec.nodes
部分中添加或移除节点的 IP 地址。 - 控制平面节点池:在
Cluster
规范的spec.controlPlane.nodePoolSpec.nodes
部分中添加或移除节点的 IP 地址。 - 负载均衡器节点池:在
Cluster
规范的spec.loadBalancer.nodePoolSpec.nodes
部分中添加或移除节点的 IP 地址。
示例:移除工作器节点
以下示例集群配置文件展示了两个工作器节点的规范:
---
apiVersion: baremetal.cluster.gke.io/v1
kind: NodePool
metadata:
name: nodepool1
namespace: cluster-cluster1
spec:
clusterName: cluster1
nodes:
- address: 192.0.2.1
- address: 192.0.2.2
如需移除节点,请执行以下操作:
(可选)如果要移除的节点正在运行关键 Pod,请先将该节点置于维护模式。
您可以通过查看
NodePool
资源上的status.nodesDrained
和status.nodesDraining
字段来监控工作器节点的节点排空过程。修改集群配置文件以删除节点的 IP 地址条目。
更新集群:
bmctl update cluster1 \ --kubeconfig=ADMIN_KUBECONFIG
gcloud CLI
您可以使用 update
命令添加或移除节点。您使用的 update
命令以及用于指定 IP 地址的标志取决于要更新的节点池类型:
工作器节点池:运行
gcloud container bare-metal node-pools update
并在--node-configs 'node-ip=IP_ADDRESS'
标志中指定 IP 地址。管理员集群上的控制平面节点池:运行
gcloud container bare-metal admin-clusters update
并在--control-plane-node-configs 'node-ip=IP_ADDRESS'
标志中指定 IP 地址。用户集群上的控制平面节点池:运行
gcloud container bare-metal clusters update
并在--control-plane-node-configs 'node-ip=IP_ADDRESS'
标志中指定 IP 地址。负载均衡器节点池:运行
gcloud container bare-metal clusters update
并在以下标志中指定 IP 地址 ---metal-lb-load-balancer-node-configs 'node-ip=IP_ADDRESS'
或--bgp-load-balancer-node-configs 'node-ip=IP_ADDRESS'
您用于指定 IP 地址的标志仅接受一个 node-ip
。您可以在节点池中添加每个 IP 地址的标志。
update
命令会将所有 IP 地址替换为您指定的 IP 地址。如需添加节点,请在 update
命令中添加现有节点的 IP 地址和新节点的 IP 地址。同样,您可以通过仅添加要保留的节点的 IP 地址来移除节点。
示例:移除工作器节点
本部分使用示例数据介绍如何从节点池中移除工作器节点。其他可能有用的 gcloud CLI 命令也包括在以下步骤中。
(可选)如果要移除的节点正在运行关键 Pod,请先将该节点置于维护模式。
您可以通过查看
NodePool
资源上的status.nodesDrained
和status.nodesDraining
字段来监控工作器节点的节点排空过程。运行
list
命令以列出集群中的所有节点池:gcloud container bare-metal node-pools list \ --cluster=abm-user-cluster1 \ --project=example-project-12345 \ --location=us-central1
输出类似于以下内容:
NAME LOCATION STATE node-pool-1 us-central1 RUNNING node-pool-2 asia-east1 RUNNING
运行
describe
命令以列出节点池中的所有 IP 地址:gcloud container bare-metal node-pools describe node-pool-1 \ --cluster=abm-user-cluster1 \ --project=example-project-12345 \ --location=us-central1
为了便于阅读,以下示例输出已被截断:
annotations: ... baremetal.cluster.gke.io/version: 1.33 ... name: projects/example-project-12345/locations/us-central1/bareMetalClusters/abm-user-cluster1/bareMetalNodePools/node-pool-1 nodePoolConfig: nodeConfigs: - nodeIp: 192.0.2.1 - nodeIp: 192.0.2.2 operatingSystem: LINUX state: RUNNING ...
请注意示例输出中的以下内容:
name
字段包含节点池的完全限定名称。在命令中指定节点池名称时,您可以指定完全限定名称,也可以指定节点池名称(例如node-pool-1
)以及--cluster
、--project
标志和--location
标志。nodeConfigs
部分包含两个带节点 IP 地址的nodeIp
字段。
运行以下命令以移除 IP 地址为 192.0.2.1 的节点:
gcloud container bare-metal node-pools update node-pool-1 \ --cluster=abm-user-cluster1 \ --project=example-project-12345 \ --location=us-central1 \ --node-configs='node-ip=192.0.2.2'
update
命令会将所有 IP 地址替换为您指定的 IP 地址。由于未包含 192.0.2.1,因此该节点已被移除。此命令的输出类似如下所示:
Waiting for operation [projects/example-project-12345/locations/us-central1/operations/operation-1697154681749-6078d9def4030-76686d6e-9fcb1de9] to complete
在示例输出中,字符串
operation-1697154681749-6078d9def4030-76686d6e-9fcb1de9
是长时间运行的操作的OPERATION_ID
。您可以通过在另一个终端窗口中运行以下命令来了解操作的状态:gcloud container bare-metal operations describe operation-1697154681749-6078d9def4030-76686d6e-9fcb1de9 \ --project= example-project-12345 \ --location=us-central1
您可以经常重复运行该命令以检查状态。
如果节点移除失败,您可以强制将其从集群中移除。如需了解详情,请参阅重置 Google Distributed Cloud 中的故障节点。
替换高可用性控制平面节点
bmctl
您可以使用 bmctl
替换所有集群类型中的高可用性 (HA) 控制平面节点。
您可以通过执行以下步骤来替换集群中的节点:
- 从集群配置文件中移除节点的 IP 地址。
- 更新集群。
- 检查集群中节点的状态。
- 将新节点的 IP 地址添加到同一集群配置文件中。
- 更新集群。
示例:替换高可用性控制平面节点
以下示例集群配置文件展示了用户集群中的三个控制平面节点:
---
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: user-cluster
namespace: cluster-user-cluster
spec:
controlPlane:
nodePoolSpec:
nodes:
- address: 192.0.2.11
- address: 192.0.2.12
- address: 192.0.2.13
如需替换 spec.controlPlane.nodePoolSpec.nodes
部分中列出的最后一个节点,请执行以下步骤:
通过在集群配置文件中删除节点的 IP 地址条目来移除节点。进行此更改后,集群配置文件应如下所示:
--- apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: user-cluster namespace: cluster-user-cluster spec: controlPlane: nodePoolSpec: nodes: - address: 192.0.2.11 - address: 192.0.2.12
通过运行以下命令来更新集群:
bmctl update cluster -c CLUSTER_NAME \ --kubeconfig=KUBECONFIG
进行以下更改:
- 将 CLUSTER_NAME 替换为要更新的集群的名称。
- 如果集群是自行管理的集群(例如管理员集群或独立集群),请将 KUBECONFIG 替换为该集群的 kubeconfig 文件的路径。如果集群是用户集群(如本示例所示),请将 KUBECONFIG 替换为管理员集群的 kubeconfig 文件的路径。
bmctl update
命令成功执行后,需要一些时间来完成machine-preflight
和machine-init
作业。您可以通过运行本文档的验证更新部分中所述的命令查看节点及其各自节点池的状态。节点池和节点处于就绪状态后,您可以继续执行下一步。通过将新控制平面节点的 IP 地址添加到集群配置文件的
spec.controlPlane.nodePoolSpec.nodes
部分,将新控制平面节点添加到节点池中。进行此更改后,集群配置文件应如下所示:--- apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: user-cluster namespace: cluster-user-cluster spec: controlPlane: nodePoolSpec: nodes: - address: 192.0.2.11 - address: 192.0.2.12 - address: 192.0.2.14
通过运行以下命令来更新集群:
bmctl update cluster -c CLUSTER_NAME \ --kubeconfig=KUBECONFIG
gcloud CLI
您可以使用 gcloud CLI 替换管理员集群和用户集群中的高可用性 (HA) 控制平面节点。
您可以通过执行以下步骤来替换集群中的节点:
通过运行适用的
update
命令移除节点的 IP 地址:- 用户集群:
gcloud container bare-metal clusters update
- 管理员集群:
gcloud container bare-metal admin-clusters update
- 用户集群:
通过运行
gcloud container bare-metal operations describe OPERATION_ID
来检查集群中的节点移除状态。通过运行适用的
update
命令添加新节点的 IP 地址。
示例:替换高可用性控制平面节点
本部分使用示例数据介绍如何替换集群中的控制平面。其他可能有用的 gcloud CLI 命令也包括在以下步骤中。
运行
list
命令以列出Google Cloud 项目中的所有用户集群:gcloud container bare-metal clusters list \ --project=example-project-12345 \ --location=-
设置
--location=-
时,意味着列出所有区域中的所有集群。如果您需要缩小列表范围,请将--location
设置为特定区域。输出类似于以下内容:
NAME LOCATION VERSION ADMIN_CLUSTER STATE abm-user-cluster1a us-central1 1.33 abm-admin-cluster1 RUNNING abm-user-cluster1b europe-west1 1.33 abm-admin-cluster1 RUNNING
在集群上运行
describe
命令:gcloud container bare-metal clusters describe abm-user-cluster1 \ --project=example-project-12345 \ --location=us-central1
为了便于阅读,示例输出已被截断:
... controlPlane: controlPlaneNodePoolConfig: nodePoolConfig: nodeConfigs: - nodeIp: 192.0.2.11 - nodeIp: 192.0.2.12 - nodeIp: 192.0.2.13 operatingSystem: LINUX ... name: projects/example-project-1234567/locations/us-central1/bareMetalClusters/abm-user-cluster1a ...
请注意示例输出中的以下内容:
name
字段包含集群的完全限定名称。在命令中指定集群名称时,您可以指定完全限定名称,也可以指定集群名称(例如abm-user-cluster1a
)以及--project
和--location flags
。nodeConfigs
部分包含三个nodeIp
字段,各字段包含控制平面节点 IP 地址。
移除 IP 地址为
192.0.2.13
的节点:gcloud container bare-metal cluster update abm-user-cluster1a \ --project=example-project-12345 \ --location=us-central1 \ --control-plane-node-configs 'node-ip=192.0.2.11' --control-plane-node-configs 'node-ip=192.0.2.12'
此命令的输出类似如下所示:
Waiting for operation [projects/example-project-12345/locations/us-central1/operations/operation-1956154681749-6078d9def4030-76686d6e-9fcb1d7] to complete
在示例输出中,字符串
operation-1956154681749-6078d9def4030-76686d6e-9fcb1de7
是长时间运行的操作的OPERATION_ID
。您可以通过在另一个终端窗口中运行以下命令来了解操作的状态:gcloud container bare-metal operations describe operation-1956154681749-6078d9def4030-76686d6e-9fcb1de7 \ --project= example-project-12345 \ --location=us-central1
您可以经常重复运行该命令以检查状态。
添加 IP 地址为
192.0.2.14
的新节点:gcloud container bare-metal cluster update abm-user-cluster1a \ --project=example-project-12345 \ --location=us-central1 \ --control-plane-node-configs 'node-ip=192.0.2.11' --control-plane-node-configs 'node-ip=192.0.2.12' --control-plane-node-configs 'node-ip=192.0.2.14'
验证更新
kubectl
您可以使用 kubectl get
命令查看节点及其各自的节点池的状态。
例如,以下命令会显示集群命名空间 cluster-my-cluster
中的节点池的状态:
kubectl -n cluster-my-cluster get nodepools.baremetal.cluster.gke.io
系统会返回类似于以下内容的结果:
NAME READY RECONCILING STALLED UNDERMAINTENANCE UNKNOWN
cluster-my-cluster 3 0 0 0 0
cluster-my-cluster-lb 2 0 0 0 0
np1 3 0 0 0 0
Reconciling=1
表示协调步骤仍在进行中。您应该等待状态更改为 Reconciling=0
。
您还可以通过运行以下命令来检查集群中节点的状态:
kubectl get nodes --kubeconfig=KUBECONFIG
gcloud CLI
如前所述,运行 update
命令后,您可以使用 gcloud container bare-metal
operations describe OPERATIONS_ID
检查操作的状态。该命令的输出提供了节点的状态,例如:
...
metrics:
- intValue: '1'
metric: NODES_RECONCILING
- intValue: '2'
metric: NODES_HEALTHY
- intValue: '0'
metric: NODES_FAILED
- intValue: '0'
metric: NODES_IN_MAINTENANCE
- intValue: '3'
metric: NODES_TOTAL
stage: HEALTH_CHECK
...
无论使用哪个工具更新节点池,您都可以通过运行适用的 describe
命令来获取节点池的当前状态,如上所示。
如需详细了解如何诊断集群,请参阅创建快照以诊断集群。
负载均衡器地址池
bmctl
addressPools
部分包含用于为 MetalLB 和边界网关协议 (BGP) 捆绑式负载均衡器指定负载均衡池的字段。您可以随时添加更多负载均衡地址池,但无法移除任何现有地址池。从 Google Distributed Cloud 1.16.0 版开始,您可以随时修改 addressPools.avoidBuggyIPs
和 addressPools.manualAssign
的值。
addressPools:
- name: pool1
addresses:
- 198.51.100.0-198.51.100.4
- 198.51.100.240/28
- name: pool2
addresses:
- 198.51.100.224/28
gcloud CLI
您可以随时为捆绑式负载均衡器添加更多负载均衡地址池,但无法移除任何现有地址池。您在 gcloud container bare-metal clusters update
中指定的用于添加地址池的标志取决于捆绑式负载均衡器的类型:
- MetalLB(第 2 层):使用
--metal-lb-address-pools
标志。 - 边界网关协议 (BGP):使用
--bgp-address-pools
标志。
这些标志的值采用以下格式:
'pool=NAME,avoid-buggy-ips=True|False,manual-assign=True|False,addresses=IP_ADDRESS_RANGE_1;IP_ADDRESS_RANGE_2;...' \
该值的各部分以关键字 pool
、avoid-buggy-ip
、manual-assign
和 addresses
开头。每个部分之间用英文逗号分隔。
pool
:您为池选择的名称。avoid-buggy-ips
:如果将其设置为True
,则 IP 地址管理 (IPAM) 控制器不会将以.0
或.255
结尾的 IP 地址分配给 Service。这样可以避免有问题的用户设备错误地丢弃发送到这些特殊 IP 地址的流量。如果未指定,则默认为False
。从 Google Distributed Cloud 1.16.0 版开始,您可以在现有地址池中修改此值。manual-assign
:如果您不希望 IPAM 控制器自动将此池中的 IP 地址分配给 Service,请将其设置为True
。之后,开发者便可以创建LoadBalancer
类型的 Service 并手动指定池中的一个地址。如果未指定,则manual-assign
设置为False
。从 Google Distributed Cloud 1.16.0 版开始,您可以在现有地址池中修改此值。在
addresses
列表中:每个地址都必须是采用 CIDR 或带连字符的范围格式的范围。如需指定池中的单个 IP 地址(例如对于入站流量 VIP),请在 CIDR 表示法中使用/32
(例如 192.0.2.1/32)。
请注意以下语法规则:
- 用英文单引号将整个值括起来。
- 不允许使用空格。
- 用英文分号分隔每个 IP 地址范围。
您可以指定多个标志实例,如以下示例所示:
--metal-lb-address-pools='pool=pool2,avoid-buggy-ips=False,manual-assign=True,addresses=198.51.100.0/30;198.51.100.64-198.51.100.72' --metal-lb-address-pools='pool=pool3,avoid-buggy-ips=True,manual-assign=True,addresses=203.0.113.0/28'
如需详细了解负载均衡器地址池,请参阅“配置捆绑式负载均衡”中的 loadBalancer.addressPools。
防止意外删除集群
bmctl
如果您向集群配置文件添加 baremetal.cluster.gke.io/prevent-deletion: "true"
注释,则无法删除集群。例如,运行 kubectl delete cluster
或 bmctl reset
cluster
会产生错误。
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: ci-10c3c6f4d9c698e
namespace: cluster-ci-10c3c6f4d9c698e
annotations:
baremetal.cluster.gke.io/prevent-deletion: "true"
spec:
clusterNetwork:
gcloud CLI
如果您指定值为 baremetal.cluster.gke.io/prevent-deletion="true"
的 --add-annotations
标志,则将无法删除集群。例如:
添加注释以防止意外删除集群:
gcloud container bare-metal clusters update abm-user-cluster1a \ --project=example-project-12345 \ --location=us-central1 \ --add-annotations=baremetal.cluster.gke.io/prevent-deletion="true"
尝试删除用户集群:
gcloud container bare-metal clusters delete abm-user-cluster1a \ --project=example-project-12345 \ --location=us-central1 \ --force \ --allow-missing
此命令的响应类似如下所示:
ERROR: (gcloud.container.bare-metal.clusters.delete) INVALID_ARGUMENT: invalid request: admission webhook "vcluster.kb.io" denied the request: annotations[baremetal.cluster.gke.io/prevent-deletion]: Invalid value: "true": Annotation "baremetal.cluster.gke.io/prevent-deletion" should be removed in order to delete this cluster
如需移除注释,请在
update
命令中指定--remove-annotations=baremetal.cluster.gke.io/prevent-deletion="true"
。
绕过预检检查
此功能仅适用于 bmctl update
。
bypassPreflightCheck
字段的默认值为 false
。如果您在集群配置文件中将此字段设置为 true
,则在将资源应用于现有集群时系统会忽略内部预检检查。
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: cluster1
namespace: cluster-cluster1
annotations:
baremetal.cluster.gke.io/private-mode: "true"
spec:
bypassPreflightCheck: true
添加或移除集群管理员
bmctl
您可以通过在集群配置文件的 clusterSecurity.authorization.clusterAdmin.gcpAccounts
部分中指定电子邮件地址,添加或移除作为用户集群的集群管理员的用户或服务账号。这些账号将被授予集群上的 cluster-admin 角色,向该用户提供对集群的完整访问权限。
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: cluster1
namespace: cluster-cluster1
spec:
clusterSecurity:
authorization:
clusterAdmin:
gcpAccounts:
- alex@example.com
- hao@example.com
- my-sa@example-project-12345.iam.gserviceaccount.com
更新用户集群以添加账号时,请务必将列表中的所有账号(现有账号和新账号)都包括在内,因为 bmctl update
会使用您在配置文件中指定的内容覆盖列表。如需移除账号,请从集群配置文件中移除该账号并运行 bmctl update
。
gcloud CLI
您可以通过在 --admin-users
标志中指定电子邮件地址,添加或移除作为集群管理员的用户或服务账号。该标志只接受一个电子邮件地址。如需添加多个用户,请在每个标志中指定一个账号,例如:
gcloud container bare-metal clusters update abm-user-cluster1a \
--project=example-project-12345 \
--location=us-central1 \
--admin-users=alex@example.com \
--admin-users=hao@example.com
--admin-users=my-sa@example-project-12345.iam.gserviceaccount.com
update
命令会覆盖整个授权列表。指定要作为集群管理员的所有现有用户和新用户。
设置登录用户
您可以指定要用于对集群中的节点机器进行无密码 sudo
功能访问的非根用户名。SSH 密钥 sshPrivateKeyPath
必须可用于指定用户。集群创建和更新操作会检查是否可以通过指定的用户和 SSH 密钥访问节点机器。
bmctl
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: cluster1
namespace: cluster-cluster1
annotations:
baremetal.cluster.gke.io/private-mode: "true"
spec:
nodeAccess:
loginUser: abm
gcloud CLI
您可以在 --login-user
标志中指定要用于访问节点机器的用户,例如:
gcloud container bare-metal clusters update abm-user-cluster1a \
--project=example-project-12345 \
--location=us-central1 \
--login-user=abm
如需为用户启用无密码 sudo
访问权限,请在每个集群节点机器上按照以下步骤操作:
使用
sudo visudo
打开 sudoers 文件进行修改:sudo visudo -f /etc/sudoers
visudo
命令会锁定 sudoers 文件以防止同时进行修改,并在保存时验证该文件的语法。对于登录用户,向 sudoers 文件添加一个条目,如下所示:
USERNAME ALL=(ALL) NOPASSWD: ALL
关闭并保存该文件。
如需以登录用户的权限运行命令,请运行以下命令:
su - USERNAME
如需验证登录用户运行
sudo
命令是否不需要密码,请运行以下sudo
命令:sudo ip a
高级网络设置
您可以在创建集群后在各种自定义资源中配置高级网络设置功能。如需使用自定义资源和相关的网络设置功能,您必须在创建集群时启用高级网络设置。
bmctl
创建集群时,在集群配置中将 clusterNetwork.advancedNetworking
设置为 true
:
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: cluster1
namespace: cluster-cluster1
spec:
clusterNetwork:
...
advancedNetworking: true
...
gcloud CLI
在创建集群时,在 gcloud container bare-metal clusters create
命令中添加 --enable-advanced-networking
标志。
创建启用了高级网络设置的集群后,您可以使用 kubectl apply
配置本部分中所述的自定义资源。
NetworkGatewayGroup
NetworkGatewayGroup
自定义资源用于为高级网络功能(例如出站 NAT 网关或使用 BGP 的捆绑式负载均衡功能)提供浮动 IP 地址。
apiVersion: networking.gke.io/v1
kind: NetworkGatewayGroup
name: default
namespace: cluster-bm
spec:
floatingIPs:
- 10.0.1.100
- 10.0.2.100
BGP 负载均衡
您可以在集群资源和其他自定义资源中配置边界网关协议 (BGP) 负载均衡。gcloud container bare-metal clusters
create
和 update
命令支持在集群资源中配置 BGP,但不支持自定义资源。
使用 BGP 配置捆绑式负载均衡器时,默认情况下,数据平面负载均衡使用为控制平面对等互连指定的相同外部对等连接。或者,您可以使用 BGPLoadBalancer
自定义资源和 BGPPeer
自定义资源单独配置数据平面负载均衡。如需了解详情,请参阅使用 BGP 配置捆绑式负载均衡器。
BGPLoadBalancer
apiVersion: networking.gke.io/v1
kind: BGPLoadBalancer
metadata:
name: default
namespace: cluster-bm
spec:
peerSelector:
cluster.baremetal.gke.io/default-peer: "true"
BGPPeer
apiVersion: networking.gke.io/v1
kind: BGPPeer
metadata:
name: bgppeer1
namespace: cluster-bm
labels:
cluster.baremetal.gke.io/default-peer: "true"
spec:
localASN: 65001
peerASN: 65002
peerIP: 10.0.3.254
sessions: 2
扩大服务网络范围
如需创建超出初始限制的服务,您可以缩小 IPv4 服务 CIDR 掩码以扩大集群的服务网络。缩小掩码(“/”之后的值)会生成更大的网络范围。您只能扩大 IPv4 服务 CIDR 的范围。网络范围无法缩小,这意味着无法增大掩码(“/”之后的值)。
bmctl
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: cluster1
namespace: cluster-cluster1
spec:
...
clusterNetwork:
services:
cidrBlocks:
- 192.0.2.0/14
...
gcloud CLI
如需扩大用户集群上的 IPv4 服务 CIDR 的范围,请在 --island-mode-service-address-cidr-blocks
标志中指定新范围。
gcloud container bare-metal clusters update cluster1 \
--project=example-project-12345 \
--location=us-central1 \
--island-mode-service-address-cidr-blocks=192.0.2.0/14
配置 kubelet 映像拉取设置
kubelet 在集群的每个节点上运行。kubelet 负责监控节点上的容器并确保它们健康状况良好。如有需要,kubelet 会查询映像并从 Artifact Registry 中拉取映像。
手动更新 kubelet 配置并使其在所有集群节点之间保持同步可能会很困难。更糟糕的是,当您升级集群时,节点上的手动 kubelet 配置更改会丢失。
为了有助于使同步更新更简单、更持久,Google Distributed Cloud 允许您为每个集群节点池指定一些 kubelet 设置:控制平面节点、负载均衡器节点和工作器节点。这些设置适用于给定池中的所有节点,并且在集群升级过程中保持不变。这些设置的字段是可变的,因此您可以随时更新这些字段,而不仅仅是在创建集群期间更新。
bmctl
以下支持的字段用于控制 kubelet 的 Artifact Registry 拉取操作:
registryBurst
(默认值:10)registryPullQPS
(默认值:5)serializeImagePulls
(默认值:true)
如需详细了解每个 kubelet 配置字段,请参阅集群配置字段参考文档。
您可以在以下节点池的 Cluster 规范和 NodePool 规范的 kubeletConfig
部分中指定这些字段:
- 集群规范:
- 控制平面节点
spec.controlPlane.nodePoolSpec.kubeletConfig
- 负载均衡器节点
spec.loadBalancer.nodePoolSpec.kubeletConfig
- NodePool 规范:
- 工作器节点
spec.kubeletConfig
以下示例展示了集群配置文件中添加的字段及其默认值。请注意,注解 preview.baremetal.cluster.gke.io/custom-kubelet: "enable"
为必填项。
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: cluster1
namespace: cluster-cluster1
annotations:
preview.baremetal.cluster.gke.io/custom-kubelet: "enable"
spec:
...
controlPlane:
nodePoolSpec:
kubeletConfig:
registryBurst: 10
registryPullQPS: 5
serializeImagePulls: true
...
loadBalancer:
nodePoolSpec:
kubeletConfig:
registryBurst: 10
registryPullQPS: 5
serializeImagePulls: true
...
apiVersion: baremetal.cluster.gke.io/v1
kind: NodePool
metadata:
name: node-pool-new
namespace: cluster-cluster1
spec:
clusterName: cluster1
...
kubeletConfig:
registryBurst: 10
registryPullQPS: 5
serializeImagePulls: true
在每种情况下,该设置都适用于池中的所有节点。
gcloud CLI
以下标志用于控制 kubelet 的 Artifact Registry 拉取操作:
控制平面节点
负载均衡器节点
- --bgp-load-balancer-registry-burst
- --bgp-load-balancer-registry-pull-qps
- --disable-bgp-load-balancer-serialize-image-pulls
- --enable-bgp-load-balancer-serialize-image-pulls
- --metal-lb-load-balancer-registry-burst
- --metal-lb-load-balancer-registry-pull-qps
- --disable-metal-lb-load-balancer-serialize-image-pull
- --enable-metal-lb-load-balancer-serialize-image-pulls
工作器节点
使用方法
以下是调整映像拉取的一些注意事项:
由于默认情况下映像是按序拉取的,因此映像拉取需要很长时间,这可能会延迟在节点上调度的所有其他映像拉取。延迟的映像拉取可能会阻止升级过程(尤其是在节点上需要部署新的 Google Distributed Cloud 映像时)。如果您受到映像拉取延迟的影响,则可以停用序列化映像拉取,以允许并行映像拉取。
如果您遇到映像拉取限制错误(例如
pull QPS exceeded
),则建议您增加*-registry-pull-qps
和*-registry-burst
以提高映像拉取吞吐量。这两个字段会调整拉取速率和队列大小,可能有助于解决其他限制相关问题。不允许使用负值。
Keepalived 自定义设置
从 1.32 版开始,Google Distributed Cloud 提供了 Keepalived 配置的一些自定义设置。使用捆绑式负载均衡时,控制平面负载均衡器会提供控制平面虚拟 IP (VIP) 地址。Google Distributed Cloud 将 Keepalived 和 HAProxy 作为负载均衡器节点上的 Kubernetes 静态 Pod 运行,以通告控制平面 VIP。keepalived 在负载均衡器节点上使用虚拟路由器冗余协议 (VRRP) 以实现高可用性。
1.32 版及更高版本的集群具有以下 Keepalived 自定义设置:
对于高可用性控制平面,Google Distributed Cloud 会自动配置 Keepalived VRRP 配置,以使故障切换行为具有确定性,并防止具有不同 MAC 地址的 ARP 回复交织:
每个 Keepalived 实例都会在 VRRP 路由器中自动配置不同的
priority
值。每个 Keepalived 实例都会自动配置
nopreempt
,以避免在非主实例重启时进行选举。
Google Distributed Cloud 可让您指定在控制平面节点转换为主服务器角色后,一次发送的无偿 ARP (GARP) 消息数量。如需更改要发送的 GARP 消息数量,请将
controlPlane.loadBalancer.keepalivedVRRPGARPMasterRepeat
字段添加到集群配置文件中,将其设置为新值,然后更新集群。此值会映射到 Keepalived 的vrrp_garp_master_repeat
设置。该默认值为 5。以下示例展示了如何在集群配置文件中指定
keepalivedVRRPGARPMasterRepeat
:apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: hybrid-ha-lb namespace: cluster-hybrid-ha-lb spec: type: hybrid profile: default anthosBareMetalVersion: 1.33 gkeConnect: projectID: project-fleet controlPlane: loadBalancer: keepalivedVRRPGARPMasterRepeat: 1 nodePoolSpec: nodes: - address: 10.200.0.2 - address: 10.200.0.3 - address: 10.200.0.4 ...
安装或卸载捆绑的 NVIDIA GPU Operator
借助 NVIDIA GPU Operator,您可以在集群中运行与 GPU 相关的工作负载。从 Google Distributed Cloud 1.33.0 版开始,集群捆绑了完整的 NVIDIA GPU Operator 栈,可提供一种托管式解决方案来处理在集群工作器节点上预配 GPU 所需的 NVIDIA 软件组件。
前提条件
在安装捆绑式 NVIDIA GPU Operator 之前,请确保您的环境满足以下要求:
正常运行的集群:您已使用 Google Distributed Cloud 创建了一个正常运行的裸金属集群。
NVIDIA GPU:集群工作器节点上已安装 NVIDIA GPU。 以下有关安装 NVIDIA GPU Operator 的部分包含验证 GPU 是否已正确安装且由操作系统识别的步骤。
兼容的 NVIDIA 驱动程序版本:您使用的 NVIDIA 驱动程序版本必须与 GPU、操作系统以及您的应用使用的 CUDA 版本兼容。如需了解详情,请参阅版本信息。
您可以选择以下 NVIDIA 驱动程序安装选项:
使用操作系统映像中预安装的 NVIDIA 驱动程序。
按照 NVIDIA 驱动程序安装快速入门指南中的说明手动安装 NVIDIA 驱动程序。
在启用捆绑的 NVIDIA GPU Operator 之前,必须先安装 NVIDIA GPU 驱动程序并使其处于就绪状态。
版本信息
本部分包含捆绑的 NVIDIA GPU Operator 的软件版本信息。
软件组件版本
Google Distributed Cloud 发布版本 1.33 捆绑了 NVIDIA GPU Operator 25.3.1 版。在 Google Distributed Cloud 中,捆绑包包含以下映像:
- NVIDIA Container Toolkit v1.17.8 版
- NVIDIA DCGM Exporter v3.3.9-3.6.1
- NVIDIA Kubernetes Device Plugin v0.17.1
- Node Feature Discovery v0.17.2
Google Distributed Cloud 1.33 版捆绑的映像版本可能与 25.3.1 版本说明中列出的软件组件版本不完全一致。
驱动程序兼容性
如需了解驱动程序兼容性信息,请参阅 NVIDIA Docs Hub 上的版本 25.3.1 的平台支持。
更新捆绑的 NVIDIA GPU Operator
如果您已在集群上安装 NVIDIA GPU Operator,则在升级到新的次要版本时,系统会安装最新捆绑版本的 NVIDIA GPU Operator。
安装捆绑的 Operator
在捆绑的 NVIDIA GPU Operator 处于预览版阶段时,您可以使用 bmctl update
将以下注解添加到具有 GPU 节点的集群,以安装该 Operator:
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: cluster1
namespace: cluster-cluster1
annotations:
preview.baremetal.cluster.gke.io/nvidia-gpu-operator: "enable"
spec:
...
应用注解后,NVIDIA GPU Operator 栈会安装到集群。
卸载捆绑的 Operator
在捆绑的 NVIDIA GPU Operator 处于预览版阶段时,您可以使用 bmctl update
从具有 GPU 节点的集群中移除以下注解,以卸载该 Operator:
preview.baremetal.cluster.gke.io/nvidia-gpu-operator: "enable"
移除注解后,NVIDIA GPU Operator 栈的所有组件都会从集群中移除。
启用动态资源分配
动态资源分配是一个 Kubernetes API,可让您在 Pod 和容器之间请求和共享 GPU 等通用资源。第三方驱动程序管理这些资源。借助此功能,您可以动态且精确地分配裸金属集群中的 GPU 资源,从而运行 AI 工作负载,以提高资源利用率和高需求工作负载的性能。
动态资源分配适用于 1.33 版及更高版本的集群预览版。以下说明介绍了如何配置集群以使用动态资源分配。 启用后,您可以将 GPU 工作负载配置为使用动态资源分配。
配置集群以启用动态资源分配:
修改集群配置文件,以添加
preview.baremetal.cluster.gke.io/dynamic-resource-allocation: "enable"
预览版注解,并在kubeletConfig
部分的featureGates
下添加DynamicResourceAllocation: true
:apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: dra namespace: cluster-dra annotations: preview.baremetal.cluster.gke.io/dynamic-resource-allocation: "enable" spec: controlPlane: nodePoolSpec: kubeletConfig: featureGates: DynamicResourceAllocation: true # ... other cluster configuration
通过运行
bmctl update
命令来更新集群:bmctl update cluster -c CLUSTER_NAME \ --kubeconfig=ADMIN_KUBECONFIG
替换以下内容:
CLUSTER_NAME
:您要更新的用户集群的名称。ADMIN_KUBECONFIG
:管理员集群 kubeconfig 文件的路径。
应用此配置后,裸金属机器的
READY
字段可能会在True
和False
之间多次切换。等待READY
字段稳定在True
,然后再继续操作。如需在具有 GPU 节点的节点池中启用
DynamicResourceAllocation
特性门控,请在 NodePool 规范的kubeletConfig
部分的featureGates
部分中将DynamicResourceAllocation
设置为true
:如需了解如何添加和更新节点池,请参阅管理集群中的节点池。
apiVersion: baremetal.cluster.gke.io/v1 kind: NodePool metadata: name: np namespace: cluster-dra spec: clusterName: dra kubeletConfig: featureGates: DynamicResourceAllocation: true nodes: # ... other node pool configuration
添加或更新节点池后,请等待节点池中的所有裸金属机器达到
Ready
状态。如需检查集群裸金属机器的状态,请使用以下命令:
kubectl get baremetalmachines --kubeconfig ADMIN_KUBECONFIG -A
裸金属机器准备就绪后,响应应类似于以下示例响应:
NAMESPACE NAME CLUSTER READY INSTANCEID MACHINE ABM VERSION DESIRED ABM VERSION cluster-admin 10.200.0.2 dra true baremetal://10.200.0.2 10.200.0.2 1.33.0-gke.793 1.33.0-gke.793 cluster-user-dra 10.200.0.6 user-dra true baremetal://10.200.0.6 10.200.0.6 1.33.0-gke.793 1.33.0-gke.793 cluster-user-dra 10.200.0.7 user-dra true baremetal://10.200.0.7 10.200.0.7 1.33.0-gke.793 1.33.0-gke.793 cluster-user-dra 10.200.0.8 user-dra true baremetal://10.200.0.8 10.200.0.8 1.33.0-gke.793 1.33.0-gke.793
限制
捆绑的 NVIDIA GPU Operator 存在以下限制:
捆绑的 NVIDIA GPU Operator 仅支持以下 NVIDIA 软件组件:
- NVIDIA Container Toolkit
- NVIDIA DCGM Exporter
- NVIDIA Kubernetes Device Plugin
- 适用于 Kubernetes 的 NVIDIA MIG Manager。
在预览版期间,NVIDIA GPU Operator 配置是固定的。如果您尝试自定义任何设置,系统会将这些设置协调回原始安装设置。
捆绑的 NVIDIA GPU Operator 无法用于安装 NVIDIA GPU 驱动程序。
在预览版期间,此功能使用
resource.k8s.io/v1beta1
API 组,这与此功能的开源 Kubernetes API 组resource.k8s.io/v1
不同。与v1beta1
API 组相比,v1
开源 API 组提供更多功能,稳定性更高。
后续步骤
如需将动态资源分配用于 GPU 工作负载,请参阅使用动态资源分配管理 GPU 设备。
如需详细了解动态资源分配,请参阅 Kubernetes 文档中的动态资源分配。