kubectl taint nodes <节点名> <键>=<值>:<效应>
// 如果 K8S_MASTER_PREFER == "TRUE"
kubectl get node | grep master | awk '{print$1}' | xargs -I {} kubectl taint nodes {} node-role.kubernetes.io/master:NoSchedule-
kubectl get node | grep master | awk '{print$1}' | xargs -I {} kubectl taint nodes {} node-role.kubernetes.io/master=:PreferNoSchedule
// 如果 K8S_MASTER_PREFER == "FALSE"
kubectl get node | grep master | awk '{print$1}' | xargs -I {} kubectl taint nodes {} node-role.kubernetes.io/master=:NoSchedule
Kubernetes节点污点(Taint)管理命令解读
这些命令用于管理Kubernetes主节点(master node)的污点(taint),控制Pod是否可以被调度到主节点上。下面是对这些命令的详细解读:
基本污点命令格式
kubectl taint nodes <节点名> <键>=<值>:<效应>
-
<节点名>
:要设置污点的节点名称 -
<键>
:污点的键(key),如node-role.kubernetes.io/master
-
<值>
:污点的值(value),可以为空 -
<效应>
:污点的效果,有三种:-
NoSchedule
:禁止调度(已运行的Pod不受影响) -
PreferNoSchedule
:尽量避免调度 -
NoExecute
:禁止调度并驱逐已运行的不容忍该污点的Pod
-
根据K8S_MASTER_PREFER值执行的不同操作
当K8S_MASTER_PREFER == "TRUE"时
-
移除NoSchedule污点:
kubectl get node | grep master | awk '{print$1}' | xargs -I {} kubectl taint nodes {} node-role.kubernetes.io/master:NoSchedule-
-
kubectl get node
:获取所有节点 -
grep master
:筛选出master节点 -
awk '{print$1}'
:提取节点名称(第一列) -
xargs -I {} kubectl taint nodes {} node-role.kubernetes.io/master:NoSchedule-
:- 对每个master节点执行移除污点的操作
-
-
后缀表示移除污点
-
-
添加PreferNoSchedule污点:
kubectl get node | grep master | awk '{print$1}' | xargs -I {} kubectl taint nodes {} node-role.kubernetes.io/master=:PreferNoSchedule
- 为每个master节点添加污点,效果为PreferNoSchedule
- 这表示系统会尽量避免将Pod调度到master节点,但不是绝对禁止
当K8S_MASTER_PREFER == "FALSE"时
kubectl get node | grep master | awk '{print$1}' | xargs -I {} kubectl taint nodes {} node-role.kubernetes.io/master=:NoSchedule
- 为每个master节点添加污点,效果为NoSchedule
- 这表示系统不会将Pod调度到master节点(除非Pod明确容忍该污点)
实际应用场景
-
开发环境(K8S_MASTER_PREFER=TRUE):
- 允许Pod在必要时调度到master节点,充分利用所有节点资源
- 但会尽量避免,保持master节点相对干净
-
生产环境(K8S_MASTER_PREFER=FALSE):
- 严格禁止Pod调度到master节点
- 确保master节点专用于运行控制平面组件,提高集群稳定性
这些命令通常用于在资源有限的环境中(如小型集群或开发环境)充分利用master节点的资源,或者在需要严格隔离的生产环境中保护master节点。
如何查看某个节点有哪些 Taint ?
查看 Kubernetes 节点的 Taint(污点)
要查看某个节点的污点(Taint)信息,可以使用以下几种方法:
方法1:使用 kubectl describe node
命令
kubectl describe node <节点名称>
在输出结果中查找 Taints:
部分,例如:
Taints: node-role.kubernetes.io/master:PreferNoSchedule
方法2:使用 kubectl get node
并显示污点列
kubectl get node <节点名称> -o jsonpath='{.spec.taints}'
或者更易读的格式:
kubectl get node <节点名称> -o jsonpath='{.spec.taints}' | jq
方法3:使用 -o wide
或 -o custom-columns
查看所有节点的污点
查看所有节点的污点:
kubectl get nodes -o wide --show-labels
或者使用自定义列:
kubectl get nodes -o custom-columns=NAME:.metadata.name,TAINTS:.spec.taints
方法4:使用 JSON 或 YAML 输出格式
kubectl get node <节点名称> -o yaml
# 或
kubectl get node <节点名称> -o json
然后在输出中查找 spec.taints
部分。
示例输出
$ kubectl describe node master-node
...
Taints: node-role.kubernetes.io/master:PreferNoSchedule
...
或
$ kubectl get node worker-node -o jsonpath='{.spec.taints}' | jq
[
{
"effect": "NoSchedule",
"key": "dedicated",
"value": "gpu"
}
]
这些方法都可以帮助你查看节点上设置的污点信息,选择最适合你需求的方式即可。
如何一条命令查看k8s集群所有节点的污点,以友好的形式输出?
可以使用以下命令,以清晰友好的格式查看 Kubernetes 集群中所有节点的污点信息:
最佳解决方案(表格形式)
kubectl get nodes -o custom-columns="NAME:.metadata.name,TAINTS:.spec.taints" | awk 'NR==1 {print $0} NR>1 {printf "%-30s ", $1; $1=""; print $0}'
替代方案(更详细的 JSON 格式)
kubectl get nodes -o json | jq -r '.items[] | {name: .metadata.name, taints: .spec.taints}'
替代方案(简单列表)
kubectl describe nodes | grep -e "^Name:" -e "^Taints:" | sed 's/^Name:/\\n&/'
最友好的输出格式(推荐)
kubectl get nodes -o go-template='{{printf "%-30s %-s\n" "NODE" "TAINTS"}}{{range .items}}{{printf "%-30s " .metadata.name}}{{if .spec.taints}}{{range .spec.taints}}{{.key}}={{.value}}:{{.effect}} {{end}}{{else}}<none>{{end}}{{"\n"}}{{end}}'
输出示例
NODE TAINTS
master-node node-role.kubernetes.io/master=:PreferNoSchedule
worker-node1 dedicated=gpu:NoSchedule
worker-node2 <none>
这个命令会:
- 以对齐的表格形式显示所有节点
- 清晰展示节点名称和污点信息
- 对于没有污点的节点会显示
<none>
- 每个污点会显示完整的 key=value:effect 格式
选择最适合你需求的格式即可,第一个和最后一个方案通常是最实用的。
k8s 的污点key命名规则有什么讲究吗?
$ kubectl get node k8s-master01 -o jsonpath='{.spec.taints}' | jq
[
{
"effect": "PreferNoSchedule",
"key": "node-role.kubernetes.io/master"
}
]
在 Kubernetes 中,污点(Taint)的键(Key)命名 node-role.kubernetes.io/master
遵循 Kubernetes 的标签和注解的命名规范,有一定的规则和最佳实践:
1. 命名规则解析
node-role.kubernetes.io/master
的格式可以拆解为:
-
前缀(Prefix):
node-role.kubernetes.io/
- 表示这是一个与节点角色(Node Role)相关的标准键。
- Kubernetes 保留了一些标准前缀(如
kubernetes.io/
、k8s.io/
),用于核心组件或广泛认可的用途。
-
名称(Name):
master
- 表示该污点用于标识主节点(Master Node)。
2. 命名的规则讲究
(1) 分层结构
Kubernetes 推荐使用 域名反转格式(类似 Java 包名),例如:
-
node-role.kubernetes.io/master
(官方主节点污点) -
example.com/gpu
(自定义污点)
(2) 前缀的约束
-
保留前缀(如
kubernetes.io/
、k8s.io/
)通常由 Kubernetes 核心组件使用。 -
自定义前缀应使用你控制的域名(如
company.com/
),避免冲突。
(3) 键的语义化
- 键名应明确表达用途,例如:
-
node-role.kubernetes.io/master
:标识主节点。 -
disktype.ssd
:标识 SSD 磁盘节点。 -
gpu.nvidia.com/model
:标识 GPU 型号。
-
3. 为什么主节点污点用这种格式?
-
历史原因:早期 Kubernetes 主节点默认带有
node-role.kubernetes.io/master:NoSchedule
污点,防止工作负载调度到主节点。 -
向后兼容:即使现在主节点通常用
control-plane
角色,旧版键名仍被保留。 -
标准化:通过统一的前缀(
kubernetes.io/
)标识这是 Kubernetes 核心功能相关的污点。
4. 自定义污点的最佳实践
如果需自定义污点,建议:
kubectl taint nodes <节点名> yourdomain.com/key=value:Effect
例如:
kubectl taint nodes worker-node1 gpu.vendor.com/nvidia=true:NoSchedule
5. 常见官方污点键
键名 | 用途 |
---|---|
node-role.kubernetes.io/master |
旧版主节点标识(Kubernetes <1.24) |
node-role.kubernetes.io/control-plane |
新版控制平面节点标识(Kubernetes ≥1.24) |
node.kubernetes.io/not-ready |
节点未就绪时自动添加 |
node.kubernetes.io/unreachable |
节点不可达时自动添加 |
总结
-
node-role.kubernetes.io/master
是 Kubernetes 历史遗留的标准键名,遵循分层命名规范。 - 自定义污点应使用你拥有的域名作为前缀(如
company.com/
),避免与 Kubernetes 保留键冲突。 - 新版本(≥1.24)推荐使用
node-role.kubernetes.io/control-plane
替代master
。