一、污点设置

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

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐