更新集群

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

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

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

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

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

在集群中添加或移除节点

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

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

如需在节点池中添加或移除节点,您可以在集群配置文件的特定部分中添加或移除节点的 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

如需移除节点,请执行以下操作:

  1. (可选)如果要移除的节点正在运行关键 Pod,请先将该节点置于维护模式

    您可以通过查看 NodePool 资源上的 status.nodesDrainedstatus.nodesDraining 字段来监控工作器节点的节点排空过程。

  2. 修改集群配置文件以删除节点的 IP 地址条目。

  3. 更新集群:

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

    替换以下内容:

    • CLUSTER_NAME:您要更新的集群的名称。
    • ADMIN_KUBECONFIG:管理员集群 kubeconfig 文件的路径。

    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 替换为admin集群的 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 替换为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 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 替换为admin集群的 kubeconfig 文件的路径。

停用 kubelet 只读端口

从 1.15.0 版开始,GKE on Bare Metal 默认停用 kubelet 只读端口 10255。您应将所有配置为从这个不安全的 kubelet 端口 10255 读取数据的客户工作负载迁移到使用安全的 kubelet 端口 10250。

只有使用 1.15.0 或更高版本创建的集群才会默认停用此端口。对于使用低于 1.15.0 的版本创建的集群,kubelet 只读端口 10255 仍可访问,即使在集群升级到 1.15.0 版或更高版本后也是如此。

进行此更改的原因是 kubelet 会通过未经身份验证的端口 10255 泄露低敏感度信息,包括在节点上运行的所有 Pod 的完整配置信息,这些信息可能被攻击者利用。它还会泄露指标和状态信息,这些信息可以提供业务敏感的数据洞见。

CIS Kubernetes 基准建议停用 kubelet 只读端口。如需在 1.14 版中手动停用该端口,请完成以下步骤:

  1. 修改集群配置文件并添加以下注解:

    baremetal.cluster.gke.io/enable-kubelet-read-only-port: "false"
    

    以下示例集群配置文件显示此注解已添加:

    [...]
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: cluster-my-cluster
    ---
    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      annotations:
        baremetal.cluster.gke.io/enable-kubelet-read-only-port: "false"
      name: my-cluster
      namespace: cluster-my-cluster
    [...]
    
  2. 修改集群 webhook 验证集群资源:

    kubectl edit validatingwebhookconfigurations lcm-validating-webhook-configuration
    
  3. 通过删除包含 UPDATE 动词的行暂时停用 webhook验证:

    - admissionReviewVersions:
    - v1
    clientConfig:
      caBundle: 
      service:
        name: lcm-webhook-service
        namespace: kube-system
        path: /validate-baremetal-cluster-gke-io-v1-cluster
        port: 443
    failurePolicy: Fail
    matchPolicy: Equivalent
    name: vcluster.kb.io
    namespaceSelector: {}
    objectSelector: {}
    rules:
    - apiGroups:
      - baremetal.cluster.gke.io
      apiVersions:
      - v1
      operations:
      - CREATE
      - UPDATE # <- DELETE THIS LINE
      - DELETE
      resources:
      - clusters
      scope: '*'
    sideEffects: None
    timeoutSeconds: 10
    
  4. 向集群自定义资源添加注解:

    kubectl edit clusters CLUSTER_NAME --kubeconfig KUBECONFIG_PATH
    

    进行以下更改:

    • CLUSTER_NAME 替换为要更新的集群的名称。
    • KUBECONFIG_PATH 替换为集群的 kubeconfig 文件的路径。
  5. 添加注解,如以下更新后的示例集群自定义资源所示:

    apiVersion: baremetal.cluster.gke.io/v1
    kind: Cluster
    metadata:
      annotations:
        baremetal.cluster.gke.io/enable-kubelet-read-only-port: "false"
    [...]
    
  6. 保存并关闭集群自定义资源。

  7. 通过将 UPDATE 动词重新添加到集群 webhook 验证集群资源来重新启用 webhook 验证:

    kubectl edit validatingwebhookconfigurations lcm-validating-webhook-configuration
    

    在自定义资源中,将 UPDATE 动词重新添加到 operations 部分中:

    - admissionReviewVersions:
    - v1
    clientConfig:
      caBundle: 
      service:
        name: lcm-webhook-service
        namespace: kube-system
        path: /validate-baremetal-cluster-gke-io-v1-cluster
        port: 443
    failurePolicy: Fail
    matchPolicy: Equivalent
    name: vcluster.kb.io
    namespaceSelector: {}
    objectSelector: {}
    rules:
    - apiGroups:
      - baremetal.cluster.gke.io
      apiVersions:
      - v1
      operations:
      - CREATE
      - UPDATE # <- ADD THIS LINE BACK
      - DELETE
      resources:
      - clusters
      scope: '*'
    sideEffects: None
    timeoutSeconds: 10
    

    保存并关闭集群自定义资源。

升级到 1.15.0 版或更高版本时,这些更改会保留。