k8s-Pod污点与容忍
2021-11-25 18:44
274 查看
目录为什么要用污点和容忍? 官方解释 Taints参数 标记污点 容忍污点 取消所有节点污点
Pod污点与容忍
大白话先解释一下污点与容忍
污点:被打上污点Taints的节点,不会被调度器部署pod应用。 容忍:允许调度器部署pod应用到打上污点Taints的节点。
为什么要用污点和容忍?
为什么用污点? 因为k8s集群每一个请求都需要走master节点kube-apiserver,因此master节点非常重要,所以pod应用一般不部署master节点。那么给master节点打上污点Taints,这样调度的时候就不会部署到带有污点的机器了 为什么用容忍? 比如被打上污点Taints的master节点需要部署某个pod应用,那么就需要容忍声明,这样就可以调度到带有污点的机器了
官方解释
对于nodeAffinity无论是硬策略还是软策略方式,都是调度 pod 到预期节点上,而Taints恰好与之相反,如果一个节点标记为 Taints ,除非 pod 也被标识为可以容忍污点节点,否则该 Taints 节点不会被调度 pod。 比如用户希望把 Master 节点保留给 Kubernetes 系统组件使用,或者把一组具有特殊资源预留给某些 pod,则污点就很有用了,pod 不会再被调度到 taint 标记过的节点。我们使用kubeadm搭建的集群默认就给 master 节点添加了一个污点标记,所以我们看到我们平时的 pod 都没有被调度到 master 上去:
$ kubectl describe node master Name: master Roles: master Labels: beta.kubernetes.io/arch=amd64 beta.kubernetes.io/os=linux kubernetes.io/hostnam ad8 e=master node-role.kubernetes.io/master= ...... Taints: node-role.kubernetes.io/master:NoSchedule Unschedulable: false
我们可以使用上面的命令查看 master 节点的信息,其中有一条关于 Taints 的信息:node-role.kubernetes.io/master:NoSchedule,就表示给 master 节点打了一个污点的标记,其中影响的参数是NoSchedule,表示 pod 不会被调度到标记为 taints 的节点
Taints参数
node-role.kubernetes.io/master:NoSchedule NoSchedule: 不调度到污点节点上去 PreferNoSchedule:NoSchedule 的软策略版本,表示尽量不调度到污点节点上去 NoExecute:该选项意味着一旦Taint生效,如该节点内正在运行的pod没有对应Tolerate设置,会直接被逐出
标记污点
# kubectl taint node sg-14 test=sg14:PreferNoSchedule node/sg-14 tainted
上面的命名将 sg-14 节点标记为了污点,影响策略是 PreferNoSchedule,只会影响新的 pod 调度,如果仍然希望某个 pod 调度到 taint 节点上,则必须在 Spec 中做出Toleration定义,才能调度到该节点,
由于 master 节点被标记为了污点节点,所以我们这里要想 pod 能够调度到 master 节点去,就需要增加容忍的声明:
容忍污点
tolerations: - key: "node-role.kubernetes.io/master" operator: "Exists" effect: "NoSchedule"
eg:
apiVersion: apps/v1 kind: Deployment metadata: name: deployment spec: replicas: 1 # pod数量 selector: # 选择器 matchLabels: # 标签 release: stable # 选择标签 template: # 模版 metadata: name: test-tag # 控制器名字 labels: release: stable # 设置控制器标签 spec: containers: - name: nginx # 镜像名称 image: nginx # 镜像 tolerations: - key: "node-role.kubernetes.io/master" operator: "Exists" effect: "NoSchedule"
然后创建上面的资源,我们可以看到有一个 pod 副本被调度到了 master 节点,这就是容忍的使用方法。
对于 tolerations 属性的写法,其中pod的 key、value、effect 与 Node 的 Taint 设置需保持一致, 还有以下几点说明:
如果 operator 的值是 Exists,则 ad8 value 属性可省略 如果 operator 的值是 Equal,则表示其 key 与 value 之间的关系是 equal(等于) 如果不指定 operator 属性,则默认值为 Equal 另外,还有两个特殊值: tolerations: - key: "key" operator: "Equal" value: "value" effect: "NoScheduale"
取消所有节点污点
[root@sg-14 deployment]# kubectl taint node sg-14 test- node/sg-14 untainted 就删除了节点污点
相关文章推荐
- K8S 之Taints(污点) 和 Tolerations(容忍)--初探;
- pod调度之Taints和Tolerations(污点和容忍)
- Kubernetes1.6新特性:POD高级调度-污点和容忍特性/报告节点问题特性
- Kubernetes的污点和容忍(上篇)
- k8s实践(六):Pod资源管理
- k8s中pod的资源对象(名称空间,获取策略,重启策略,健康检查)
- K8S学习002--Pod概念与网络通讯方式
- k8s中pod亲和性以及node亲和性配置
- k8s删除pod、node前的注意事项
- k8s实践(六):Pod资源管理
- k8s实践(十四):Pod驱逐迁移和Node节点维护
- Pod memory usage in k8s
- K8S部署EFK收集pod日志,通过邮件报警ERROR【19】
- k8s_单个pod中多个容器的通信实验(基础)的零散笔记
- k8s启动Pod遇到CrashLoopBackOff的解决方法
- k8s创建pod
- k8s核心yml--Pod、Deployment、Service
- k8s自主式pod之应用策略规则
- k8s查看pod的命令
- K8S中pod在挂载volume时出现FailedMount错误(exit status 32)