姜正则妈妈 發表於 2019-9-18 20:38:00

kubernetes(k8s)Pod污点与容忍

<h3>污点(taints)与容忍(tolerations)</h3>
<p>对于nodeAffinity无论是硬策略还是软策略方式,都是调度 pod 到预期节点上,而Taints恰好与之相反,如果一个节点标记为 Taints ,除非 pod 也被标识为可以容忍污点节点,否则该 Taints 节点不会被调度 pod。</p>
<p>比如用户希望把 Master 节点保留给 Kubernetes 系统组件使用,或者把一组具有特殊资源预留给某些 pod,则污点就很有用了,pod 不会再被调度到 taint 标记过的节点。我们使用kubeadm搭建的集群默认就给 master 节点添加了一个污点标记,所以我们看到我们平时的 pod 都没有被调度到 master 上去:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">$ kubectl describe node master
Name:               master
Roles:            master
Labels:             beta.kubernetes.io</span>/arch=<span style="color: rgba(0, 0, 0, 1)">amd64
                  beta.kubernetes.io</span>/os=<span style="color: rgba(0, 0, 0, 1)">linux
                  kubernetes.io</span>/<span style="color: rgba(0, 0, 255, 1)">hostname</span>=<span style="color: rgba(0, 0, 0, 1)">master
                  node</span>-role.kubernetes.io/master=<span style="color: rgba(0, 0, 0, 1)">
......
Taints:             node</span>-role.kubernetes.io/<span style="color: rgba(0, 0, 0, 1)">master:NoSchedule
Unschedulable:      </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
......</span></pre>
</div>
<p>我们可以使用上面的命令查看 master 节点的信息,其中有一条关于 Taints 的信息:node-role.kubernetes.io/master:NoSchedule,就表示给 master 节点打了一个污点的标记,其中影响的参数是NoSchedule,表示 pod 不会被调度到标记为 taints 的节点,除了 NoSchedule 外,还有另外两个选项:</p>
<p>PreferNoSchedule:NoSchedule 的软策略版本,表示尽量不调度到污点节点上去<br>NoExecute:该选项意味着一旦 Taint 生效,如该节点内正在运行的 pod 没有对应 Tolerate 设置,会直接被逐出<br>污点 taint 标记节点的命令如下:</p>
<div class="cnblogs_code">
<pre>$ kubectl taint nodes node02 test=<span style="color: rgba(0, 0, 0, 1)">node02:NoSchedule
node </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">node02</span><span style="color: rgba(128, 0, 0, 1)">"</span> tainted</pre>
</div>
<p>上面的命名将 node02 节点标记为了污点,影响策略是 NoSchedule,只会影响新的 pod 调度,如果仍然希望某个 pod 调度到 taint 节点上,则必须在 Spec 中做出Toleration定义,才能调度到该节点,比如现在我们想要将一个 pod 调度到 master 节点:(taint-demo.yaml)</p>
<div class="cnblogs_code">
<pre>apiVersion: apps/<span style="color: rgba(0, 0, 0, 1)">v1beta1
kind: Deployment
metadata:
name: taint
labels:
    app: taint
spec:
replicas: </span><span style="color: rgba(128, 0, 128, 1)">3</span><span style="color: rgba(0, 0, 0, 1)">
revisionHistoryLimit: </span><span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">
template:
    metadata:
      labels:
      app: taint
    spec:
      containers:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: nginx
      image: nginx:</span><span style="color: rgba(128, 0, 128, 1)">1.7</span>.<span style="color: rgba(128, 0, 128, 1)">9</span><span style="color: rgba(0, 0, 0, 1)">
      ports:
      </span>-<span style="color: rgba(0, 0, 0, 1)"> name: http
          containerPort: </span><span style="color: rgba(128, 0, 128, 1)">80</span><span style="color: rgba(0, 0, 0, 1)">
      tolerations:
      </span>- key: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">node-role.kubernetes.io/master</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
      operator: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Exists</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
      effect: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">NoSchedule</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<p>由于 master 节点被标记为了污点节点,所以我们这里要想 pod 能够调度到 master 节点去,就需要增加容忍的声明:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">tolerations:
</span>- key: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">node-role.kubernetes.io/master</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
operator: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Exists</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
effect: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">NoSchedule</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<p>然后创建上面的资源,查看结果:</p>
<div class="cnblogs_code">
<pre>$ kubectl create -f taint-<span style="color: rgba(0, 0, 0, 1)">demo.yaml
deployment.apps </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">taint</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> created
$ kubectl get pods </span>-<span style="color: rgba(0, 0, 0, 1)">o wide
NAME                                    READY   STATUS             RESTARTS   AGE       IP             NODE
......
taint</span>-845d8bb4fb-57mhm                  <span style="color: rgba(128, 0, 128, 1)">1</span>/<span style="color: rgba(128, 0, 128, 1)">1</span>       Running            <span style="color: rgba(128, 0, 128, 1)">0</span>          1m      <span style="color: rgba(128, 0, 128, 1)">10.244</span>.<span style="color: rgba(128, 0, 128, 1)">4.247</span><span style="color: rgba(0, 0, 0, 1)">   node02
taint</span>-845d8bb4fb-bbvmp                  <span style="color: rgba(128, 0, 128, 1)">1</span>/<span style="color: rgba(128, 0, 128, 1)">1</span>       Running            <span style="color: rgba(128, 0, 128, 1)">0</span>          1m      <span style="color: rgba(128, 0, 128, 1)">10.244</span>.<span style="color: rgba(128, 0, 128, 1)">0.33</span><span style="color: rgba(0, 0, 0, 1)">    master
taint</span>-845d8bb4fb-zb78x                  <span style="color: rgba(128, 0, 128, 1)">1</span>/<span style="color: rgba(128, 0, 128, 1)">1</span>       Running            <span style="color: rgba(128, 0, 128, 1)">0</span>          1m      <span style="color: rgba(128, 0, 128, 1)">10.244</span>.<span style="color: rgba(128, 0, 128, 1)">4.246</span><span style="color: rgba(0, 0, 0, 1)">   node02
......</span></pre>
</div>
<p>我们可以看到有一个 pod 副本被调度到了 master 节点,这就是容忍的使用方法。</p>
<p>对于 tolerations 属性的写法,其中pod的&nbsp; key、value、effect 与 Node 的 Taint 设置需保持一致, 还有以下几点说明:</p>
<p>如果 operator 的值是 Exists,则 value 属性可省略<br>如果 operator 的值是 Equal,则表示其 key 与 value 之间的关系是 equal(等于)<br>如果不指定 operator 属性,则默认值为 Equal<br>另外,还有两个特殊值:</p>
<div class="cnblogs_code">
<pre>$ kubectl taint nodes node01 key=<span style="color: rgba(0, 0, 0, 1)">value:NoSchedule

    tolerations:
    </span>- key: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">key</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
      operator: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Equal</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
      value: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">value</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
      effect: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">NoScheduale</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<p>&nbsp;</p>
<p>空的 key(是指key没有指定,而不是指key为空字符串) 如果再配合operator Exists 就能匹配所有的 key 与 value,也是能容忍所有 node 的所有 Taints<br>空的 effect 匹配所有的 effect</p>
<p><br>最后,如果我们要取消节点的污点标记,可以使用下面的命令:</p>
<div class="cnblogs_code">
<pre>$ kubectl taint nodes node02 test-<span style="color: rgba(0, 0, 0, 1)">
node </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">node02</span><span style="color: rgba(128, 0, 0, 1)">"</span> untainted</pre>
</div>
<p>这就是污点和容忍的使用方法。</p>
<p>&nbsp;</p>
<p>原文:https://www.jianshu.com/p/0d08337e5943</p><br><br>
来源:https://www.cnblogs.com/linyouyi/p/11545211.html
頁: [1]
查看完整版本: kubernetes(k8s)Pod污点与容忍