k8s-Pod污点与容忍

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/hostname=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,则 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
就删除了节点污点

推荐文章

使用PhpUnit的最佳实践

使用PhpUnit的最佳实践

推荐文章

Java泛型:非法的前向引用

Java泛型:非法的前向引用

推荐文章

urllib2是否支持抢占式身份验证?

urllib2是否支持抢占式身份验证?

推荐文章

替换Python中第一个出现的字符串

替换Python中第一个出现的字符串

推荐文章

如何在Hudson CI上运行Visual Studio代码分析?

如何在Hudson CI上运行Visual Studio代码分析?

推荐文章

CruiseControl.Net Web仪表板不显示结果

CruiseControl.Net Web仪表板不显示结果

推荐文章

如何重置存储用于在Visual Studio 2008上发布网站的帐户?

如何重置存储用于在Visual Studio 2008上发布网站的帐户?

推荐文章

杀死Winword的特定实例

杀死Winword的特定实例

推荐文章

Rails 3远程表单不传递参数

Rails 3远程表单不传递参数

推荐文章

如何从Dom4j Node.selectObject或Node.selectNodes获取字符串列表

如何从Dom4j Node.selectObject或Node.selectNodes获取字符串列表

推荐文章

沿一个轴旋转相机失败

沿一个轴旋转相机失败

推荐文章

在执行SELECT INTO OUTFILE时删除“\N”

在执行SELECT INTO OUTFILE时删除“\N”

推荐文章

简单减法不起作用

简单减法不起作用

推荐文章

ASP.NET中的Singleton

ASP.NET中的Singleton

推荐文章

如何确定插入的CD是否为音频CD?

如何确定插入的CD是否为音频CD?

推荐文章

在Visual Studio中,当我从Debug切换到Release时,将主项目从控制台更改为窗口

在Visual Studio中,当我从Debug切换到Release时,将主项目从控制台更改为窗口