更新集群

使用 bmctl 创建集群后,您可以通过执行以下一系列操作来更改集群配置的某些方面:

  1. 更改集群配置文件中某些字段的值,该文件默认位于以下位置:bmctl-workspace/CLUSTER-NAME/CLUSTER-NAME.yaml

  2. 通过运行 bmctl update 命令来更新集群。

例如,通过这种方式,您可以添加或移除集群中的节点或替换集群中的节点。本文档介绍了如何对集群执行这些更新和其他更新。

但请务必注意,集群配置的许多方面都是不可变的,在创建集群后无法更新。如需查看可变字段和不可变字段的完整列表,请参阅集群配置字段参考文档。字段参考是一个可排序的表格。点击列标题可更改排列顺序。点击字段名称可查看其说明。

在集群中添加或移除节点

节点池是集群中全都具有相同配置的一组节点。请注意,节点始终属于节点池。要向集群添加新节点,您需要将其添加到特定节点池。从节点池中移除节点相当于从集群中完全移除该节点。

Anthos Clusters on Bare Metal 中有三种类型的节点池:控制平面、负载均衡器和工作器节点池。

如需在节点池中添加或移除节点,您可以在集群配置文件的特定部分中添加或移除该节点的 IP 地址。以下列表展示了您需要针对给定节点池修改清单的哪个部分:

  • 工作器节点池:在 kind: NodePool 部分显示的 spec.nodes 字段中添加/移除节点的 IP 地址。
  • 控制平面节点池:在 kind: Cluster 部分显示的 spec.controlPlane.nodePoolSpec.nodes 字段中添加/移除节点的 IP 地址。
  • 负载均衡节点池:您无法在现有负载均衡器地址池中修改(添加或移除 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

您可以通过执行以下步骤从工作器节点池中移除节点:

  1. 从集群配置文件中删除节点的 IP 地址条目:

    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: NodePool
    metadata:
      name: nodepool1
      namespace: cluster-cluster1
    spec:
      clusterName: cluster1
      nodes:
      - address: 172.18.0.5
    
  2. 更新集群:

    bmctl update cluster -c CLUSTER_NAME \
        --kubeconfig=KUBECONFIG
    

    进行以下更改:

    • CLUSTER_NAME 替换为要更新的集群的名称。
    • 如果集群是自行管理的集群(例如管理员集群或独立集群),请将 KUBECONFIG 替换为该集群的 kubeconfig 文件的路径。如果集群是用户集群,请将 KUBECONFIG 替换为管理员集群的 kubeconfig 文件的路径。

请务必注意,bmctl 必须从节点中排空 Pod,然后才能移除该节点。如果无法将 Pod 重新调度到其他节点,则不会从集群中移除节点。

bmctl update 命令成功执行后,需要一些时间才能完成 machine-preflightmachine-init 作业。您可以通过运行本文档的验证更新部分中所述的命令查看节点及其各自节点池的状态。

强制移除节点

如果 bmctl update 命令无法移除节点,则可能需要强制将其从集群中移除。如需了解详情,请参阅强制移除损坏的节点

替换高可用性控制平面节点

您可以替换管理员集群、用户集群、独立集群和混合集群中的高可用性 (HA) 控制平面节点。

您可以通过执行以下步骤来替换集群中的节点:

  1. 从集群配置文件中移除节点的 IP 地址。
  2. 更新集群。
  3. 检查集群中节点的状态。
  4. 将新节点的 IP 地址添加到同一集群配置文件中。
  5. 更新集群。

本部分的其余内容将通过示例进行说明。

以下示例集群配置文件展示了用户集群中的三个控制平面节点:

---
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 部分中列出的最后一个节点,请执行以下步骤:

  1. 通过在集群配置文件中删除节点的 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
    
  2. 通过运行以下命令来更新集群:

    bmctl update cluster -c CLUSTER_NAME \
        --kubeconfig=KUBECONFIG
    

    进行以下更改:

    • CLUSTER_NAME 替换为要更新的集群的名称。
    • 如果集群是自行管理的集群(例如管理员集群或独立集群),请将 KUBECONFIG 替换为该集群的 kubeconfig 文件的路径。如果集群是用户集群(如本示例所示),请将 KUBECONFIG 替换为管理员集群的 kubeconfig 文件的路径。
  3. bmctl update 命令成功执行后,需要一些时间来完成 machine-preflightmachine-init 作业。您可以通过运行本文档的验证更新部分中所述的命令查看节点及其各自节点池的状态。节点池和节点处于就绪状态后,您可以继续执行下一步。

  4. 通过将新控制平面节点的 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
    
  5. 通过运行以下命令来更新集群:

    bmctl update cluster -c CLUSTER_NAME \
        --kubeconfig=KUBECONFIG
    

    进行以下更改:

    • CLUSTER_NAME 替换为要更新的集群的名称。
    • 如果集群是自行管理的集群(例如管理员集群或独立集群),请将 KUBECONFIG 替换为该集群的 kubeconfig 文件的路径。如果集群是用户集群(如本示例所示),请将 KUBECONFIG 替换为管理员集群的 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 clusterbmctl 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"

修改配置文件后,请运行以下 bmctl update 命令来更新集群:

bmctl update cluster -c CLUSTER_NAME --kubeconfig=KUBECONFIG

进行以下更改:

  • CLUSTER_NAME 替换为要更新的集群的名称。
  • 如果集群是自行管理的集群(例如管理员集群或独立集群),请将 KUBECONFIG 替换为该集群的 kubeconfig 文件的路径。如果集群是用户集群,请将 KUBECONFIG 替换为管理员集群的 kubeconfig 文件的路径。