k8s污点与容忍
- k8s污点管理常用命令
- effect标记值
- 查看污点
- 添加污点
- 删除污点
- node污点与容忍
- 污点容忍yaml示例
- 容忍放大
- 基于污点的驱逐
- 驱逐时排除指定服务
- 设置master调度
- 设置master尽量不调度
- 允许master节点调度pod
- 恢复Master Only状态
- 将node标记为不可调度状态(节点警戒)
- 设置node不可用并驱逐节点上的所有pod(腾空节点)
- 设置node为可用
k8s污点管理常用命令
effect标记值
effect标记值
查看污点
对于k8s1.24+
,master节点将不再添加node-role.kubernetes.io/master
标签, 只会添加node-role.kubernetes.io/control-plane
标签。更多信息请参考 KEP-2067:重命名 kubeadm “master” 标签和污点。
https://kubernetes.io/zh-cn/blog/2022/04/07/upcoming-changes-in-kubernetes-1-24/
# 查看所有node的污点信息:ml-citation{ref="1,5" data="citationList"}
kubectl describe nodes | grep -i Taints# 查看污点
kubectl describe nodes node名 |grep Taints
# Taints: node.kubernetes.io/unreachable:NoSchedule
添加污点
# 添加污点
kubectl taint nodes node名 key=value:effect值# 添加 NoSchedule 污点
kubectl taint nodes node1 app=monitoring:NoSchedule# 添加 NoExecute 污点(驱逐现有 Pod)
kubectl taint nodes node2 disk=ssd:NoExecute# 添加新污点
kubectl taint nodes node1 app=logging:NoExecute# 添加 尽量不调度 PreferNoSchedule
kubectl taint nodes k8s-master02 node-role.kubernetes.io/master:PreferNoSchedule## effect是标记值
kubectl taint nodes node1 key1=value1:NoSchedule
kubectl taint nodes node1 key1=value1:NoExecute
kubectl taint nodes node1 key2=value2:PreferNoSchedule# 给master1机器加NoSchedule污点--k8s1.23
kubectl taint nodes m1 node-role.kubernetes.io/control-plane:NoSchedule
删除污点
# 去除污点
kubectl taint nodes node名 key:effec值-
## 或
kubectl taint nodes node名 key=value-
## 建议
kubectl taint nodes node名 key-# 删除指定 key 和 effect 的污点
kubectl taint nodes node1 app=monitoring:NoSchedule-# 删除所有 effect 类型的污点(需明确指定 key 和 effect)
kubectl taint nodes node2 disk=ssd:NoExecute-# 去除污点NoSchedule,最后一个"-"代表删除
kubectl taint nodes k8s-master02 node-role.kubernetes.io/master:NoSchedule-# 删除旧污点
kubectl taint nodes node1 app=monitoring:NoSchedule-
node污点与容忍
参考: 官方污点文档
三只兔子的故事来了解k8s污点与容忍
为什么Node要使用污点:
- 安全考虑
- Node职责角色分工不同
- 硬件不同
污点也类似于在node上打一个标签.例如专用节点
,比如GPU,SSD等,一般pod不会运行在这种专用节点,如果pod想运行在这种专用节点上,需要配置污点容忍
.
Taint
: 污点,避免pod调度到特定Node上,相当于排斥
Pod
Tolerations
: 污点容忍,允许pod调度到带有特定Taints
的Node上
污点容忍yaml示例
apiVersion: v1
kind: Pod
metadata:name: nginxlabels:env: test
spec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresent# 污点容忍tolerations:# 容忍key=example-key 等effect值存在NoSchedule- key: "example-key"operator: "Exists"# value: "example-value" # 可不配置effect: "NoSchedule"
容忍放大
k8s的一些基础静态pod,比如apiserver
,配置的就是容忍放大,下方是示例
容忍放大,只要key
或effect
存在即容忍.
apiVersion: v1
kind: Pod
metadata:name: apiserverlabels:env: test
spec:containers:- name: apiserverimage: apiserverimagePullPolicy: IfNotPresent# 污点容忍tolerations:# 容忍所有effect值为NoSchedule的污点- effect: NoScheduleoperator: Exists# 容忍污点key值CriticaAddonsOnly存在- key: CriticaAddonsOnlyoperator: Exists# 容忍所有effect值为NoExecute的污点- effect: NoExecuteoperator: Exists
基于污点的驱逐
参考: 官方文档
kubelet 驱逐策略详解
污点的 effect 值 NoExecute
会影响(驱逐)已经在节点上运行的 Pod,如果Pod没有配置容忍
effect 值为 NoExecute 的污点,会被立即驱逐
.
Pod配置了容忍NoExecute
,但在容忍度定义中没有指定 tolerationSeconds(宽限期)
,则 Pod 还会一直在这个节点上运行。
Pod配置了容忍NoExecute
,,而且指定了 tolerationSeconds(宽限期)
, 则 Pod 还能在这个节点上继续运行这个指定的时间长度。
当节点故障
时,节点控制器会自动给节点添加一个(内置)污点
.如果异常状态恢复正常,kubelet 或节点控制器能够移除相关的污点。
驱逐时排除指定服务
# 说明:此命令将驱逐节点上运行的pod服务
## --ignore-daemonsets 驱逐的时候排除daemonset类型服务
[root@wps]# kubectl drain 10.226.xxx.xxx --ignore-daemonsets
设置master调度
设置master尽量不调度
尽量不调度
的污点PreferNoSchedule
;
禁止调度并驱逐
的污点NoExecute
# master添加 尽量不调度 PreferNoSchedule
kubectl taint nodes k8s-master02 node-role.kubernetes.io/master:PreferNoSchedule
允许master节点调度pod
# 去除污点NoSchedule,最后一个"-"代表删除污点# 允许所有master节点调度pod
kubectl taint nodes --all node-role.kubernetes.io/master-# 允许master2节点调度pod;
kubectl taint nodes k8s-master02 node-role.kubernetes.io/master:NoSchedule-
恢复Master Only状态
参考: https://cloud.tencent.com/developer/article/1788356
# 指定master1为Only状态(加污点,不允许pod调度)
kubectl taint node maser1 node-role.kubernetes.io/master="":NoSchedule
将node标记为不可调度状态(节点警戒)
# 将node标记为不可调度状态(节点警戒)
kubectl cordon node名
设置node不可用并驱逐节点上的所有pod(腾空节点)
当节点磁盘空间不足时,Pod被驱逐的顺序为: BestEffort
先于 Burstable
# 切换到名为ek8s的集群
kubectl config use-context ek8s# 查看node状态
kubectl get nodes# 设置节点不可用并驱逐节点上的所有pod(腾空节点)
## 节点排水(驱逐节点上的所有pod)
## 忽略节点上不能杀死的特定系统Pod,例如:CNI插件,daemonSet
## --delete-local-data 清空本地数据
## --ignore-daemonsets 忽略daemonsets错误
## --force 强制执行
kubectl drain ek8s-node-1 --ignore-daemonsets --force # 考试执行
## 如果报错,加--delete-local-data 清空本地数据
kubectl drain ek8s-node-1 --delete-local-data --ignore-daemonsets --force # 练习执行# 查看node状态
kubectl get nodes# 查看污点
kubectl describe nodes node名 |grep Taints
# Taints: node.kubernetes.io/unreachable:NoSchedule
设置node为可用
# 标记my-node 节点为可以调度
kubectl uncordon node名# 取消污点
## 如果已存在具有指定键和效果的污点,则替换其值为指定值。
kubectl taint nodes node名 dedicated=special-user:NoSchedule# 去除污点NoSchedule,最后一个"-"代表删除
kubectl taint nodes node名 node-role.kubernetes.io/master:NoSchedule-# 查看污点是否去除
kubectl describe nodes node名 |grep Taints