【k8s】k8s taint 污点的查看、添加、删除

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"时

  1. 移除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节点执行移除污点的操作
      • -后缀表示移除污点
  2. 添加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明确容忍该污点)

实际应用场景

  1. 开发环境(K8S_MASTER_PREFER=TRUE)

    • 允许Pod在必要时调度到master节点,充分利用所有节点资源
    • 但会尽量避免,保持master节点相对干净
  2. 生产环境(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>

这个命令会:

  1. 以对齐的表格形式显示所有节点
  2. 清晰展示节点名称和污点信息
  3. 对于没有污点的节点会显示 <none>
  4. 每个污点会显示完整的 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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容