cka-节点污点(taint)及pod的tolerations
了解污点
创建的pod只是调度到了两台node上,虽然master的状态也是Ready,但是并没有pod调度上去,这就是因为taint的问题了。
如果我们给某节点设置了taint(污点)的话,只有那些设置了tolerations(容忍污点)的pod才能运行在此节点上。
首先查看某节点是否设置了taint
[root@vms10 pod]#  kubectl describe nodes vms11 |grep -E '(Roles|Taints)'
Roles:              <none>
Taints:             <none>
[root@vms10 pod]#可以看到此时vms11上并没有任何taint的设置。
为节点设置taint的语法:
kubectl taint nodes 节点名 key值=value值:effect  effect的值一般是NoSchedule。
如果要对所有节点设置:
kubectl taint nodes --all key值=value值:NoSchedule注:这里value的值是可以不写的,如果不写话语法就是这样的:
kubectl taint nodes 节点名 key值=:NoSchedule
删除taint
kubectl taint nodes 节点名 key-现在为vms11设置taint:
[root@vms10 pod]# kubectl taint nodes vms11.rhce.cc keyxx=valuexx:NoSchedule
node/vms11.rhce.cc tainted
[root@vms10 pod]# kubectl describe nodes vms11 |grep -E '(Roles|Taints)'
Roles:              <none>
Taints:             keyxx=valuexx:NoSchedule
[root@vms10 pod]#现在查看现有pod(上一节里创建):
可以发现,pod依然是在vms11上运行,说明如果对某节点设置taint的话,则是不影响当前正在运行的pod的。
删除此deployment,并重新创建一个新的deployment:
root@vms10 pod]# kubectl delete deployments. nginx 
deployment.extensions "nginx" deleted
[root@vms10 pod]# kubectl run nginx --image=nginx --replicas=4
...
deployment.apps/nginx created
[root@vms10 pod]# 
可以看到,现在所有的pod都是运行在vms12上了,因为vms11存在taint(污点)。
自行删除此deployment。
如果需要pod在含有taint的节点上运行,则定义pod的时候需要指定toleration属性。
在pod里定义toleration的格式为:
tolerations:
- key: "key值"
  operator: "Equal"
  value: "value值"
  effect: "值"operator的值一般是
Equal 意思是value需要和taint的value值一样(默认)
Exists 意思是可以不指定value的值
在operator的值为Equal
首先删除vms12上diskxx=ssdxx标签,在vms11上设置此标签:
[root@vms10 ~]# kubectl label nodes vms12.rhce.cc diskxx-
node/vms12.rhce.cc labeled
[root@vms10 ~]# 
[root@vms10 ~]# kubectl label nodes vms11.rhce.cc diskxx=ssdxx
node/vms11.rhce.cc labeled
[root@vms10 ~]# 创建podtaint.yaml:
[root@vms10 pod]# cat podtaint.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: web1
  labels:
    role: myrole
spec:
  nodeSelector:
    diskxx: ssdxx
  containers:
    - name: web
      image: nginx
      imagePullPolicy: Always
      ports:
        - name: web
          containerPort: 80
          protocol: TCP
[root@vms10 pod]#[root@vms10 pod]# kubectl apply -f podtaint.yaml
pod/web1 created
[root@vms10 pod]# kubectl get pods -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP       NODE     NOMINATED NODE   READINESS GATES
web1   0/1     Pending   0          5s    <none>   <none>   <none>           <none>
[root@vms10 pod]#因为要求web1要在vms11上运行(因为vms11上有diskxx=ssdxx标签),但vms11上有污点,所以此时pod处于Pending状态。
删除此pod:
[root@vms10 pod]# kubectl delete -f podtaint.yaml
pod "web1" deleted
[root@vms10 pod]#修改podtaint.yaml的内容:
[root@vms10 pod]# cat podtaint.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: web1
  labels:
    role: myrole
spec:
  nodeSelector:
    diskxx: ssdxx
  tolerations:
  - key: "keyxx"
    operator: "Equal"
    value: "valuexx"
    effect: "NoSchedule"
  containers:
    - name: web
      image: nginx
      imagePullPolicy: Always
      ports:
        - name: web
          containerPort: 80
          protocol: TCP
[root@vms10 pod]#再次创建pod:
可以看到此时pod在vms11上正常运行了。
注:并不是节点设置了taint,pod设置了toleration 这个pod就一定会在此节点上运行,所以这里用label来指定pod在vms11上运行。
删除此pod:
[root@vms10 pod]# kubectl delete -f podtaint.yaml 
pod "web1" deleted
[root@vms10 pod]#删除vms11的taint设置,然后给vms11重新设置多个taint:
[root@vms10 ~]# kubectl taint nodes vms11.rhce.cc keyxxx-
node/vms11.rhce.cc untainted
[root@vms10 ~]#[root@vms10 ~]# kubectl taint nodes vms11.rhce.cc key123=value123:NoSchedule
node/vms11.rhce.cc tainted
[root@vms10 ~]# kubectl taint nodes vms11.rhce.cc keyxx=valuexx:NoSchedule
node/vms11.rhce.cc tainted
[root@vms10 ~]#[root@vms10 ~]# kubectl describe nodes vms11 |grep -E -A1 '(Roles|Taints)'
Roles:              <none>
Labels:             beta.kubernetes.io/arch=amd64
--
Taints:             key123=value123:NoSchedule
                    keyxx=valuexx:NoSchedule
[root@vms10 ~]#在podtaint.yaml不修改的情况下再次运行:
[root@vms10 pod]# kubectl apply -f podtaint.yaml
pod/web1 created
[root@vms10 pod]# kubectl get pods -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP       NODE     NOMINATED NODE   READINESS GATES
web1   0/1     Pending   0          2s    <none>   <none>   <none>           <none>
[root@vms10 pod]#pod的状态为Pending,说明pod的toleration设置只要有一个和节点的taint不匹配,那么就不允许创建pod。
删除此pod并修改podtaint.yaml文件:
[root@vms10 pod]# cat podtaint.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: web1
  labels:
    role: myrole
spec:
  nodeSelector:
    diskxx: ssdxx
  tolerations:
  - key: "keyxx"
    operator: "Equal"
    value: "valuexx"
    effect: "NoSchedule"
  - key: "key123"
    operator: "Equal"
    value: "value123"
    effect: "NoSchedule"
  containers:
    - name: web
      image: nginx
      imagePullPolicy: Always
      ports:
        - name: web
          containerPort: 80
          protocol: TCP
[root@vms10 pod]#运行并查看pod:
[root@vms10 pod]# kubectl apply -f podtaint.yaml
pod/web1 created
[root@vms10 pod]#
说明,pod里的toleration必须要和节点所有的taint值匹配才可以。
自行删除此pod。
operator的值为Exists
如果在设置节点taint的时候,如果value
取消vms11的key123=value123这个taint值:
[root@vms10 ~]# kubectl taint nodes vms11.rhce.cc key123-
node/vms11.rhce.cc untainted
[root@vms10 ~]# kubectl taint nodes vms11.rhce.cc keyxx-
node/vms11.rhce.cc untainted
[root@vms10 ~]# 
[root@vms10 ~]# kubectl describe nodes vms11 |grep -E '(Roles|Taints)'
Roles:              <none>
Taints:             keyxx=valuexx:NoSchedule
[root@vms10 ~]#修改podtaint.yaml,配置operator的值为Exists:
[root@vms10 pod]# cat podtaint.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: web1
  labels:
    role: myrole
spec:
  nodeSelector:
    diskxx: ssdxx
  tolerations:
  - key: "keyxx"
    operator: "Exists"
    value: "valuexx"
    effect: "NoSchedule"
  containers:
    - name: web
      image: nginx
      imagePullPolicy: Always
      ports:
        - name: web
          containerPort: 80
          protocol: TCP
[root@vms10 pod]#[root@vms10 pod]# kubectl apply -f podtaint.yaml 
The Pod "web1" is invalid: 
* spec.tolerations[0].operator: Invalid value: core.Toleration{Key:"keyxx", Operator:"Exists", Value:"valuexx", Effect:"NoSchedule", TolerationSeconds:(*int64)(nil)}: value must be empty when `operator` is 'Exists'
* spec.tolerations: Forbidden: existing toleration can not be modified except its tolerationSeconds
[root@vms10 pod]#说明,在value值不为空的情况下,operator不能选择Exists。
修改vms11的taint值:
[root@vms10 ~]# kubectl taint nodes vms11.rhce.cc keyxx=:NoSchedule --overwrite
node/vms11.rhce.cc modified
[root@vms10 ~]# 
[root@vms10 ~]# kubectl describe nodes vms11 |grep -E '(Roles|Taints)'
Roles:              <none>
Taints:             keyxx:NoSchedule
[root@vms10 ~]#keyxx=后面直接是冒号:说明此时value的值为空,修改podtaint.yaml的值:
[root@vms10 pod]# cat podtaint.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: web1
  labels:
    role: myrole
spec:
  nodeSelector:
    diskxx: ssdxx
  tolerations:
  - key: "keyxx"
    operator: "Exists"
    effect: "NoSchedule"
  containers:
    - name: web
      image: nginx
      imagePullPolicy: Always
      ports:
        - name: web
          containerPort: 80
          protocol: TCP
[root@vms10 pod]#此时并没有设置value的值,然后创建pod:
[root@vms10 pod]# kubectl apply -f podtaint.yaml 
pod/web1 configured
[root@vms10 pod]# 
[root@vms10 pod]# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
web1   1/1     Running   0          10m
[root@vms10 pod]#正常运行,说明在没有设置value的时候,可以用Exists,不过如果要使用Equal的话,应该按照如下格式写:
- key: "keyxx"
    operator: "Exists"
    value: ""
effect: "NoSchedule"自行删除web1这个pod。

 
            