一、问题三:节点维护如何不影响服务?

Day018-K8s污点和容忍:集群资源精细化隔离-维护如何不影响服务

在 Kubernetes 集群中,节点维护(如版本升级、系统升级、漏洞修复)时,可通过以下策略确保服务不受影响:

1、标记节点为不可调度

  • 添加污点(Taint)

维护前为节点添加污点,阻止新 Pod 调度到该节点:

shell kubectl taint nodes <节点名> maintenance=true:NoSchedule

  • 效果

  • NoSchedule:新 Pod 不会调度到该节点

  • NoExecute(可选):若需立即驱逐现有 Pod,使用此效果

2、优雅驱逐现有 Pod

  • 使用 kubectl drain 命令

安全驱逐节点上的 Pod,并等待它们在其他节点重新启动:

shell kubectl drain <节点名> --ignore-daemonsets --delete-emptydir-data

  • 参数说明

  • --ignore-daemonsets:忽略 DaemonSet 管理的 Pod(如日志收集组件)。

  • --delete-emptydir-data:删除使用 emptyDir 卷的临时数据。

3、确保多副本和滚动更新

  • Deployment 多副本配置:

通过多副本(Replicas)确保服务的高可用性:

yaml spec: replicas: 3 # 至少 3 副本,分布在不同节点 strategy: type: RollingUpdate rollingUpdate: maxUnavailable: 1 # 允许最多 1 个 Pod 不可用

  • 滚动更新:

维护时 Kubernetes 会逐个替换 Pod,确保服务始终有可用实例。

4、配置 Pod 中断预算(PDB)

  • 定义最小可用实例数:

通过 PDB 确保维护期间至少有指定数量的 Pod 可用:

yaml apiVersion: policy/v1 kind: PodDisruptionBudget metadata: name: my-app-pdb spec: minAvailable: 2 # 至少保持 2 个 Pod 运行 selector: matchLabels: app: my-app

5、维护完成后恢复节点

  • 移除污点

维护完成后,移除节点的污点以允许新 Pod 调度:

shell kubectl taint nodes <节点名> maintenance=true:NoSchedule-

  • 重新调度 Pod(可选)

若需将 Pod 迁回原节点,可手动删除其他节点上的 Pod,触发调度器重新分配。

示意图解析

  • 正常状态:Pod 均匀分布在多个节点。
  • 维护阶段
  • 标记目标节点为不可调度(添加污点)。
  • 驱逐目标节点的 Pod,调度器将其重新分配到健康节点。
  • 执行维护操作(升级、修复)。
  • 维护完成后,恢复节点并允许调度。

示例操作流程

1、标记节点并驱逐 Pod:

kubectl taint node node01 maintenance=true:NoSchedule
kubectl drain node01 --ignore-daemonsets --delete-emptydir-data

2、执行维护操作:

# 在 node01 上执行系统升级或补丁安装

3、恢复节点:

kubectl taint node node01 maintenance=true:NoSchedule-
kubectl uncordon node01  # 标记节点为可调度