资讯动态

K9s v0.17.6 节点维护实战:在 Node 视图中一键完成 Cordon / Uncordon / Drain 集群运维

发布时间:2026/9/30 6:51:13 来源:尧图企业网站定制
云原生容器编排CLI运维【免费下载链接】k9s Kubernetes CLI To Manage Your Clusters In Style!项目地址https://gitcode.com/GitHub_Trending/k9s/k9s点击查看免费下载导读本文聚焦 K9s v0.17.6 版本引入的节点直接维护能力在 Node 视图中按下快捷键即可对集群节点执行封锁cordon、解除封锁uncordon与排水drain每种操作都配有可配置参数的对话框。读完本文你将掌握 K9s 节点维护的完整操作流程、各参数含义以及这套交互能力在internal/view/node.go、internal/view/drain_dialog.go与internal/dao/node.go中的底层实现原理可用于日常集群容量调整、节点下线、故障隔离与滚动维护场景。一、版本背景为什么需要Get A Rope特性K9s 的 release_v0.17.6 以 Get A Rope! 为主题回应了长期积压的需求当你的集群需要春季大扫除——比如替换节点、腾空节点以便维护、或临时将节点从调度池中隔离时过去需要跳出终端反复执行kubectl cordon、kubectl uncordon、kubectl drain三条命令。而 v0.17.6 将这三项操作直接内置到 K9s 的 Node 视图中配合对话框完成参数配置与操作确认。该版本同时解决了 Issue #612、#608、#606、#237并合并了 PR #607 与 PR #570 等贡献。对熟悉 K9s 快捷键体系的用户而言这是一次运维不离开 TUI的体验升级。二、核心操作Node 视图中的三个维护快捷键进入 Node 视图在 K9s 中输入:node回车选中一个或多个节点后即可使用以下快捷键。发行说明v0.17.6原始定义如下快捷键操作说明cCordon 封锁节点标记节点为不可调度SchedulingDisabled弹出确认对话框uUncordon 解除封锁恢复节点可调度状态弹出确认对话框dDrain 排水驱逐节点上所有 Pod弹出参数配置对话框需要注意在当前版本的 K9s 源码中Drain 操作已绑定到r键因为d在多数资源视图中被 Describe 占用Cordon 为c、Uncordon 为u保持不变。这一点可以从 README 快捷键对照表 与 Node 视图按键绑定 中相互印证// internal/view/node.go - bindDangerousKeys aa.Bulk(ui.KeyMap{ ui.KeyC: ui.NewKeyActionWithOpts(Cordon, n.toggleCordonCmd(true), ...), ui.KeyU: ui.NewKeyActionWithOpts(Uncordon, n.toggleCordonCmd(false), ...), ui.KeyR: ui.NewKeyActionWithOpts(Drain, n.drainCmd, ...), })三个操作均支持多选批量执行当同时选中多个节点时确认对话框会显示(N) nodes的批量提示例如 Drain 对话框标题会变为Drain (3) nodes?实现一键对多个节点执行相同维护动作。2.1 只读模式的保护从 bindKeys 的实现可以看到这三项维护能力只在非只读模式下绑定func (n *Node) bindKeys(aa *ui.KeyActions) { if !n.App().Config.IsReadOnly() { n.bindDangerousKeys(aa) } ... }当 K9s 以只读模式--readonly启动或配置了只读上下文时c/u/r不会出现在 Node 视图中从入口层面杜绝误操作。三、Cordon / Uncordon确认对话框与底层实现按下c或u后toggleCordonCmd(cordon bool)会先弹出确认对话框标题分别为 Confirm Cordon 与 Confirm Uncordon单节点时提示Cordon nodeName?多节点时提示Cordon (N) marked nodes?。用户点击确认后K9s 通过 DAO 层的NodeMaintainer接口逐个节点执行操作。该接口定义在 internal/dao/types.go#L91-L98type NodeMaintainer interface { // ToggleCordon toggles cordon/uncordon a node. ToggleCordon(path string, cordon bool) error // Drain drains the given node. Drain(path string, opts DrainOptions, w io.Writer) error }3.1 ToggleCordon 的实现链核心实现在 internal/dao/node.go#L41-L81流程如下获取节点FetchNode先通过CanI检查当前用户的 RBAC 权限无权限直接报错 user is not authorized to list nodes再读取节点对象构建 cordon helper基于k8s.io/kubectl/pkg/drain的NewCordonHelperFromRuntimeObject构造操作助手状态检查UpdateIfRequired(cordon)判断节点是否已处于目标状态——若节点已封锁再执行 cordon会返回node is already cordoned反之执行 uncordon 会返回node is already uncordoned。也就是说该操作是幂等且有明确反馈的应用补丁通过PatchOrReplace将spec.unschedulable字段以补丁方式写入集群。四、Drain 排水参数对话框与执行流程Drain 是三类操作中参数最丰富的。按下r早期版本为d后K9s 会弹出Drain模态对话框由 internal/view/drain_dialog.go 的ShowDrain实现字段与源码中的 DrainOptions 结构体一一对应对话框字段对应选项含义默认值GracePeriodGracePeriodSeconds每个 Pod 的优雅终止宽限期秒-1表示不覆盖、沿用 Pod 自身配置-1TimeoutTimeout驱逐操作的总超时时间Go duration 格式如5s、2m5sIgnore DaemonSetsIgnoreAllDaemonSets忽略 DaemonSet 管理的 Pod不驱逐它们falseDelete EmptyDir DataDeleteEmptyDirData允许删除使用 emptyDir 卷的 Pod数据会丢失需谨慎falseForceForce强制删除无法优雅终止的 PodfalseDisable EvictionDisableEviction禁用 Eviction API回退到直接删除 Pod 的策略false默认参数在 drainCmd 中初始化opts : dao.DrainOptions{ GracePeriodSeconds: -1, Timeout: 5 * time.Second, }点击OK后进入执行阶段drainNodeinternal/view/node.go#L109-L135K9s 会先暂停 Node 视图的刷新、注入一个标题为Drain Progress的实时输出详情页然后对选中的每个节点依次调用 DAO 层的Drain把 kubectl drain 的详细输出流式写入该页面全部完成后刷新视图。4.1 Drain 的底层执行链internal/dao/node.go#L98-L131 中的Drain实现了一个重要的安全设计——自动先封锁再排水ensureCordoned(path)读取节点spec.unschedulable判断是否已封锁若尚未封锁自动调用ToggleCordon(path, true)先完成封锁避免 drain 过程中新的 Pod 被调度上来通过toDrainHelper将DrainOptions映射为k8s.io/kubectl/pkg/drain.Helper复用 kubectl 官方实现行为与kubectl drain完全一致GetPodsForDeletion收集节点上待驱逐的 Pod 列表若收集过程出现错误如存在未镜像的 local PV 等会逐条打印错误并汇总返回DeleteOrEvictPods按 Eviction API 优先、删除兜底的策略驱逐 Pod完成后输出Node name drained!到进度页面。五、封锁状态的可视化反馈Cordon 之后节点在 Node 视图中会立即出现明显的视觉状态。渲染层 internal/render/node.go 的diagnose通过检查节点状态数组中的SchedulingDisabled与Ready来判定节点状况若节点已封锁则返回node is cordoned错误标记随后 ColorerFunc 会将该行VALID列标记为挂起色PendingColor让封锁节点在列表中一眼可辨。这一诊断逻辑有对应的单元测试验证见 internal/render/node_int_test.go 的TestNode_diagnose输入[SchedulingDisabled, Ready]状态数组断言返回cordonErr输入[NotReady]断言返回notReadyErr覆盖了封锁且就绪未就绪同时存在等典型组合。六、运维实战建议先评估再封锁执行c前建议先用y查看节点 YAML、用 Enter 键进入showPodsK9s 会自动按spec.nodeName节点名过滤该节点上的 Pod确认负载情况Drain 默认值偏保守默认Timeout5s对大规模节点可能不足可在对话框内调整为更长的超时涉及 emptyDir 或 DaemonSet 的工作负载时按需勾选Delete EmptyDir Data与Ignore DaemonSets利用批量操作同时选中多个待维护节点空格多选后执行 drainK9s 会逐个执行并把每个节点的进度输出到Drain Progress页便于在一个界面内观察完整排水过程只读环境自动禁用在只读模式下这三项快捷键不会出现天然防止误操作适合告警大屏、演示等只读场景。七、总结K9s v0.17.6 把kubectl cordon / uncordon / drain三条命令完整封装进 Node 视图的 TUI 交互中确认对话框降低误操作风险Drain 参数对话框保留 kubectl 的完整语义底层复用k8s.io/kubectl/pkg/drainDrain Progress实时输出让长耗时排水过程透明可见封锁节点的颜色标记则提供了持续的状态反馈。配合多选批量执行与只读模式保护K9s 在节点维护这条高频运维路径上已经可以做到全程不离开终端。赞分享云原生容器编排CLI运维【免费下载链接】k9s Kubernetes CLI To Manage Your Clusters In Style!项目地址https://gitcode.com/GitHub_Trending/k9s/k9s点击查看免费下载相关推荐weibaohui/kom节点维护Drain与Cordon操作指南weibaohui/kom节点维护Drain与Cordon操作指南 引言节点维护的挑战与解决方案 在Kubernetes集群运维中节点维护是不可避免的常规云原生后端MCP 服务Nomad节点排水Drain完整指南实现零停机维护与升级运维Nomad节点排水Drain完整指南实现零停机维护与升级运维 Nomad 节点排水Drain是 HashiCorp Nomad 工作负载编排器的核心运任务调度云原生运维后端MicroK8s节点维护kubectl drain安全驱逐PodMicroK8s节点维护kubectl drain安全驱逐Pod 你是否曾因节点维护导致业务中断在Kubernetes集群管理中安全驱逐PodPod E云原生容器编排边缘计算物联网运维上一篇SysDVR 终极指南免费实现 Switch 游戏画面无线传输的完整方案下一篇MissionControl完整教程如何在Switch上免费使用各类蓝牙控制器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑