一、污点设置
kubectl taint node node名 key=value:污点三个可选值
当前taint effect支持如下三个选项:
NoSchedule:表示k8s将不会将Pod调度到具有该污点的Node上
PreferNoschedule:表示k8s将尽量避免将Pod调度到具有该污点的Node上
NoExecute:表示k8s将不会将Pod调度到具有该污点的Node上,同时会将Node上已经存在的Pod驱逐出去
注:每个污点有一个key和value作为污点的标签,其中value可以为空, effect描述污点的作用
二、添加,查看,删除污点
代码如下(示例):
打标签
# kubectl label nodes NODENAME nodeRole=monitor
设置污点
# kubectl taint node NODENAME nodeRole=monitor:NoSchedule
查看污点
# kubectl describe node NODENAME | grep -i taint
Taints: nodeRole=monitor:NoSchedule
取消污点:
#kubectl taint node NODENAME key:effect-
注:k8s 查看label命令:
查看节点的label:kubectl get node --show-labels
添加label:kubectl label nodes das1k8sslave001 hostName=das1k8sslave001
删除label:kubectl label node das1k8sslave001 hostName-
修改label:kubectl label nodes das1k8sslave001 hostName=das1k8sslave002 --overwrite
三、添加容忍
添加容忍:
tolerations:
- key: "nodeRole"
operator: "Equal"
value: "monitor"
effect: "NoSchedule"
#operator的值若为 Exists 将会忽略 value 值,即存在即可。
#当不指定 key 值时,表示容忍所有的污点 key
tolerations:
- operator: "Exists"
#当不指定 effect 值时,表示容忍所有的污点作用
tolerations:
- key: "key"
operator: "Exists"
代码如下(示例):
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
labels:
prometheus: k8s
name: k8s
namespace: monitoring
spec:
alerting:
alertmanagers:
- name: alertmanager-main
namespace: monitoring
port: web
image: prometheus:v2.15.2
nodeSelector:
nodeRole: monitor
tolerations:
- key: "nodeRole"
operator: "Equal"
value: "monitor"
effect: "NoSchedule"
podMonitorNamespaceSelector: {}
podMonitorSelector: {}
replicas: 1
resources:
requests:
memory: 4Gi
cpu: "2"
limits:
memory: 8Gi
cpu: "8"
ruleSelector:
matchLabels:
prometheus: k8s
role: alert-rules
securityContext:
fsGroup: 2000
runAsNonRoot: true
runAsUser: 1000
serviceAccountName: prometheus-k8s
serviceMonitorNamespaceSelector: {}
serviceMonitorSelector: {}
version: v2.15.2
storage:
volumeClaimTemplate:
spec:
storageClassName: local-storage-promethues
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 200Gi
总结
当某一node有问题时,设置当前node为不可调度,并驱逐当前node上的pod,在修复node之后再取消node为可调度节点。
//将 Node 标记为不可调度的状态,这样就不会让新创建的 Pod 在此 Node 上运行
kubectl cordon <NODE_NAME> #该node将会变为SchedulingDisabled状态,新运行的pod不会调度到该节点,原有pod不受影响
//kubectl drain 驱逐pod
kubectl drain <NODE_NAME> --ignore-daemonsets --delete-local-data --force
--ignore-daemonsets:无视 DaemonSet 管理下的 Pod。
--delete-local-data:如果有 mount local volume 的 pod,会强制杀掉该 pod。
--force:强制释放不是控制器管理的 Pod,例如 kube-proxy。
//kubectl uncordon 将 Node 标记为可调度的状态
kubectl uncordon <NODE_NAME>
//查看是否更改成功,可执行以下命,查看node状态是否变为Ready,没有了SchedulingDisabled即为。
kubectl get nodes