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

在 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 # 标记节点为可调度