使用 bmctl
创建集群后,您可以通过执行以下一系列操作来更改集群配置的某些方面:
更改集群配置文件中某些字段的值,该文件默认位于以下位置:
bmctl-workspace/CLUSTER-NAME/CLUSTER-NAME.yaml
。通过运行
bmctl update
命令来更新集群。
例如,通过这种方式,您可以添加或移除集群中的节点或替换集群中的节点。本文档介绍了如何对集群执行这些更新和其他更新。
但请务必注意,集群配置的许多方面都是不可变的,在创建集群后无法更新。如需查看可变字段和不可变字段的完整列表,请参阅集群配置字段参考文档。字段参考是一个可排序的表格。点击列标题可更改排列顺序。点击字段名称可查看其说明。
在集群中添加或移除节点
节点池是集群中全都具有相同配置的一组节点。请注意,节点始终属于节点池。要向集群添加新节点,您需要将其添加到特定节点池。从节点池中移除节点相当于从集群中完全移除该节点。
用于裸金属的 GDCV 有三种节点池:控制平面、负载平衡器和工作器节点池。
如需在节点池中添加或移除节点,您可以在集群配置文件的特定部分中添加或移除节点的 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: 172.18.0.5
- address: 172.18.0.6
如需移除节点,请执行以下操作:
(可选)如果要移除的节点正在运行关键 Pod,请先将该节点置于维护模式。
您可以通过查看
NodePool
资源上的status.nodesDrained
和status.nodesDraining
字段来监控工作器节点的节点排空过程。修改集群配置文件以删除节点的 IP 地址条目。
更新集群:
bmctl update cluster -c CLUSTER_NAME \ --kubeconfig=ADMIN_KUBECONFIG
替换以下内容:
CLUSTER_NAME
:您要更新的集群的名称。ADMIN_KUBECONFIG
:管理员集群 kubeconfig 文件的路径。
bmctl update
命令成功执行后,需要一些时间来完成machine-preflight
和machine-init
作业。您可以通过运行本文档的验证更新部分中所述的命令查看节点及其各自节点池的状态。
强制移除节点
如果 bmctl update
命令无法移除节点,则可能需要强制将其从集群中移除。如需了解详情,请参阅强制移除损坏的节点。
替换高可用性控制平面节点
您可以替换管理员集群、用户集群、独立集群和混合集群中的高可用性 (HA) 控制平面节点。
您可以通过执行以下步骤来替换集群中的节点:
- 从集群配置文件中移除节点的 IP 地址。
- 更新集群。
- 检查集群中节点的状态。
- 将新节点的 IP 地址添加到同一集群配置文件中。
- 更新集群。
本部分的其余内容将通过示例进行说明。
以下示例集群配置文件展示了用户集群中的三个控制平面节点:
---
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: user-cluster
namespace: cluster-user-cluster
spec:
controlPlane:
nodePoolSpec:
nodes:
- address: 10.200.0.11
- address: 10.200.0.12
- address: 10.200.0.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: 10.200.0.11 - address: 10.200.0.12
通过运行以下命令来更新集群:
bmctl update cluster -c CLUSTER_NAME \ --kubeconfig=KUBECONFIG
进行以下更改:
- 将 CLUSTER_NAME 替换为要更新的集群的名称。
- 如果集群是自行管理的集群(例如管理员集群或独立集群),请将 KUBECONFIG 替换为该集群的 kubeconfig 文件的路径。如果集群是用户集群(如本示例所示),请将 KUBECONFIG 替换为admin集群的 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: 10.200.0.11 - address: 10.200.0.12 - address: 10.200.0.14
通过运行以下命令来更新集群:
bmctl update cluster -c CLUSTER_NAME \ --kubeconfig=KUBECONFIG
进行以下更改:
- 将 CLUSTER_NAME 替换为要更新的集群的名称。
- 如果集群是自行管理的集群(例如管理员集群或独立集群),请将 KUBECONFIG 替换为该集群的 kubeconfig 文件的路径。如果集群是用户集群(如本示例所示),请将 KUBECONFIG 替换为admin集群的 kubeconfig 文件的路径。
验证更新
您可以使用 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
如需详细了解如何诊断集群,请参阅创建快照以诊断集群。
可以通过更新进行更改的功能
除了添加、移除或替换节点之外,您还可以使用 bmctl update
命令修改集群配置文件中的某些可变字段值、自定义资源 (CR) 和注解。
如需更新集群资源,请修改集群配置文件并使用 bmctl update
应用您的更改。
以下部分概述了通过更改字段值、CR 或注解来更新现有集群的一些常见示例。
loadBalancer.addressPools
addressPools
部分包含为捆绑式负载均衡器指定负载均衡池的字段。您可以随时添加更多负载均衡地址池,但无法移除或修改任何现有地址池。
addressPools:
- name: pool1
addresses:
- 192.168.1.0-192.168.1.4
- 192.168.1.240/28
- name: pool2
addresses:
- 192.168.1.224/28
防止意外删除集群
如果您向集群配置文件添加 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:
bypassPreflightCheck
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
loginUser
您可以在节点访问配置下设置 loginUser
字段。此字段支持使用无密码 sudo
功能进行机器登录。
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
NetworkGatewayGroup
NetworkGatewayGroup
自定义资源用于为高级网络功能(例如出站 NAT 网关或使用 BGP 的捆绑式负载均衡功能)提供浮动 IP 地址。如需使用 NetworkGatewayGroup
自定义资源和相关的网络功能,您必须在创建集群时将 clusterNetwork.advancedNetworking
设置为 true
。
apiVersion: networking.gke.io/v1
kind: NetworkGatewayGroup
name: default
namespace: cluster-bm
spec:
floatingIPs:
- 10.0.1.100
- 10.0.2.100
BGPLoadBalancer
使用 BGP 配置捆绑式负载均衡器时,默认情况下,数据平面负载均衡使用为控制平面对等互连指定的相同外部对等连接。或者,您可以使用 BGPLoadBalancer
自定义资源(和 BGPPeer
自定义资源)单独配置数据平面负载均衡。如需了解详情,请参阅使用 BGP 配置捆绑式负载均衡器。
apiVersion: networking.gke.io/v1
kind: BGPLoadBalancer
metadata:
name: default
namespace: cluster-bm
spec:
peerSelector:
cluster.baremetal.gke.io/default-peer: "true"
BGPPeer
使用 BGP 配置捆绑式负载均衡器时,默认情况下,数据平面负载均衡使用为控制平面对等互连指定的相同外部对等连接。或者,您可以使用 BGPPeer
自定义资源(和 BGPLoadBalancer
自定义资源)单独配置数据平面负载均衡。如需了解详情,请参阅使用 BGP 配置捆绑式负载均衡器。
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
NetworkAttachmentDefinition
您可以使用 bmctl update
命令修改与网络对应的 NetworkAttachmentDefinition
自定义资源。
apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: gke-network-1
namespace: cluster-my-cluster
spec:
config: '{
"type": "ipvlan",
"master": "enp2342",
"mode": "l2",
"ipam": {
"type": "whereabouts",
"range": "172.120.0.0/24"
扩大服务网络范围
如需创建超出初始限制的服务,您可以缩小 IPv4 服务 CIDR 掩码以扩大集群的服务网络。缩小掩码(“/”之后的值)会生成更大的网络范围。
apiVersion: baremetal.cluster.gke.io/v1
kind: Cluster
metadata:
name: cluster1
namespace: cluster-cluster1
spec:
...
clusterNetwork:
services:
cidrBlocks:
- 172.26.0.0/14
...
您只能扩大 IPv4 服务 CIDR 的范围。网络范围无法缩小,这意味着无法增大掩码(“/”之后的值)。
配置 kubelet 映像拉取设置
kubelet 在集群的每个节点上运行。kubelet 负责监控节点上的容器并确保它们健康状况良好。如果需要,kubelet 会从 Container Registry 中查询并拉取映像。
手动更新 kubelet 配置并使其在所有集群节点之间保持同步可能会很困难。更糟糕的是,在升级集群时,节点上的手动 kubelet 配置更改将丢失。
为了帮助简化和持久同步更新,GKE on Bare Metal 允许您为每个集群节点池指定一些 kubelet 设置:控制平面节点、负载均衡器节点和工作器节点。这些设置适用于给定池中的所有节点,并且在集群升级过程中保持不变。这些设置的字段是可变的,因此您可以随时更新这些字段,而不仅仅是在创建集群期间。
以下受支持的字段用于控制 kubelet 的 Container Registry 拉取操作:
registryBurst
(默认值:10)registryPullQPS
(默认值:5)serializeImagePulls
(默认值:true)
如需详细了解每个 kubelet 配置字段,请参阅集群配置字段参考文档。
您可以在以下节点池的 Cluster 规范和 NodePool 规范的 kubeletConfig
部分中指定这些字段:
- Cluster 规范:
- 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
在每种情况下,该设置都适用于池中的所有节点。
使用方法
以下是调整映像拉取的一些注意事项:
由于映像默认按顺序拉取,因此耗时较长的映像拉取可能会延迟节点上安排的所有其他映像拉取。延迟的映像拉取可能会阻止升级过程(尤其是当需要在节点上部署新的 GKE on Bare Metal 映像时)。如果您受到映像拉取延迟的影响,则可以将
serializeImagePulls
设置为false
以允许并行拉取映像。如果您遇到映像拉取限制错误(例如
pull QPS exceeded
),则建议您增加registryPullQPS
和registryBurst
以提高映像拉取吞吐量。这两个字段会调整拉取速率和队列大小,可能有助于解决其他限制相关问题。不允许使用负值。
使用 bmctl update
应用更改
修改配置文件后,请运行以下 bmctl update
命令来更新集群:
bmctl update cluster -c CLUSTER_NAME --kubeconfig=KUBECONFIG
进行以下更改:
- 将 CLUSTER_NAME 替换为要更新的集群的名称。
- 如果集群是自行管理的集群(例如管理员集群或独立集群),请将 KUBECONFIG 替换为该集群的 kubeconfig 文件的路径。如果集群是用户集群,请将 KUBECONFIG 替换为admin集群的 kubeconfig 文件的路径。