将节点置于维护模式

如果您需要修复或维护节点,则应首先将节点置于维护模式。这会正常排空现有的 Pod 和工作负载,但不包括 API 服务器等关键系统 Pod。维护模式还会阻止节点接收新的 Pod 分配。在维护模式下,您可以在节点上运行,而不会中断 Pod 流量。

运作方式

GKE on Bare Metal 提供了一种将节点置于维护模式的方法。此方法可让其他集群组件正确知道节点处于维护模式。将节点置于维护模式时,无法在节点上安排其他 pod,并且现有 pod 会停止。

您可以在特定节点上手动使用 Kubernetes 命令(例如 kubectl cordonkubectl drain),而不是使用维护模式。如果您运行 GKE on Bare Metal 1.12.0 版 (anthosBareMetalVersion: 1.12.0) 或更低版本,请参阅有关如果您不使用维护模式过程节点会取消封锁的已知问题。

使用维护模式进程时,GKE on Bare Metal 执行以下操作:

  • 节点污点会被添加到指定节点,以指示在这些节点上无法安排或执行任何 Pod。

  • 系统会强制执行 20 分钟的超时,以确保节点不会因等待 Pod 停止而停滞。如果 Pod 被配置为容忍所有污点或具有终结器,则其可能不会停止。GKE on Bare Metal 会尝试停止所有 Pod,但如果超时,节点将进入维护模式。此超时可防止正在运行的 Pod 阻止升级。

将节点置于维护模式

选择要在集群配置文件的 maintenanceBlocks 下,通过指定选择节点的 IP 地址范围,选择要进入维护模式的节点。您选择的节点必须处于就绪状态且在集群中正常运行。

如需将节点置于维护模式,请执行以下操作:

  1. 修改集群配置文件以选择要置于维护模式的节点。

    您可以使用自己选择的编辑器修改配置文件,也可以运行以下命令直接修改集群自定义资源:

    kubectl -n CLUSTER_NAMESPACE edit cluster CLUSTER_NAME

    替换以下内容:

    • CLUSTER_NAMESPACE:集群的命名空间。
    • CLUSTER_NAME:集群的名称。
  2. maintenanceBlocks 部分添加到集群配置文件,以指定要置于维护模式的节点的单个 IP 地址或地址范围。

    以下示例展示了如何通过指定 IP 地址范围来选择多个节点:

    metadata:
      name: my-cluster
      namespace: cluster-my-cluster
    spec:
      maintenanceBlocks:
        cidrBlocks:
        - 172.16.128.1-172.16.128.64
    
  3. 保存并应用更新后的集群配置。

    GKE on Bare Metal 开始将节点置于维护模式。

  4. 运行以下命令以获取集群中节点的状态:

    kubectl get nodes --kubeconfig=KUBECONFIG

    响应如下所示:

    NAME                       STATUS   ROLES           AGE     VERSION
    user-anthos-baremetal-01   Ready    control-plane   2d22h   v1.27.4-gke.1600
    user-anthos-baremetal-04   Ready    worker          2d22h   v1.27.4-gke.1600
    user-anthos-baremetal-05   Ready    worker          2d22h   v1.27.4-gke.1600
    user-anthos-baremetal-06   Ready    worker          2d22h   v1.27.4-gke.1600
    

    请注意,节点仍然可调度,但污点会阻止任何 Pod(没有适当的容忍设置)被调度到节点上。

  5. 运行以下命令以获取维护模式下的节点数:

    kubectl get nodepools --kubeconfig ADMIN_KUBECONFIG
    

    响应应类似于以下示例:

    NAME   READY   RECONCILING   STALLED   UNDERMAINTENANCE   UNKNOWN
    np1    3       0             0         1                  0
    

    此示例中的此 UNDERMAINTENANCE 列显示了一个节点处于维护模式。

    GKE on Bare Metal 还会在节点进入维护模式时将以下污点添加到节点:

    • baremetal.cluster.gke.io/maintenance:NoExecute
    • baremetal.cluster.gke.io/maintenance:NoSchedule

结算和维护模式

GKE on Bare Metal 的结算基于集群为能够运行工作负载的节点具备的 vCPU 数量。将节点置于维护模式时,NoExecuteNoSchedule 污点将添加到节点,但它们不会停用结算功能。将节点置于维护模式后,封锁节点 (kubectl cordon NODE_NAME) 以将其标记为无法安排。将节点标记为无法安排后,该节点及其关联的 vCPU 将从结算中排除。

价格页面中所述,您可以使用 kubectl 查看每个用户集群的 vCPU 容量(计入 Anthos 费用的部分)。该命令不会考虑节点是否可安排,它仅提供每个节点的 vCPU 数量。

要确定用户集群的每个节点的 vCPU 数量,请使用以下代码:

kubectl get nodes \
    --kubeconfig USER_KUBECONFIG \
    -o=jsonpath="{range .items[*]}{.metadata.name}{\"\t\"} \
    {.status.capacity.cpu}{\"\n\"}{end}"

USER_KUBECONFIG 替换为用户集群的 kubeconfig 文件的路径。

从维护模式中移除节点

如需从维护模式中移除节点,请执行以下操作:

  1. 修改集群配置文件以清除要从维护模式中移除的节点。

    您可以使用自己选择的编辑器修改配置文件,也可以运行以下命令直接修改集群自定义资源:

    kubectl -n CLUSTER_NAMESPACE edit cluster CLUSTER_NAME

    替换以下内容:

    • CLUSTER_NAMESPACE:集群的命名空间。
    • CLUSTER_NAME:集群的名称。
  2. 修改 IP 地址以从维护模式中移除特定节点,或者移除 maintenanceBlocks 部分从维护模式中移除所有操作。

  3. 保存并应用更新后的集群配置。

  4. 使用 kubectl 命令检查节点的状态。