k8s——污点、容忍+3个存储卷(emptyDir、hostpath和nfs)
污点(Taint)和容忍(Tolerations)
污点(Taint)
概念
- 节点亲和性,是Pod的一种属性(偏好或硬性要求),它使Pod被吸引到一类特定的节点。Taint则相反,它使节点能够排斥一类特定的Pod
- Taint和Toleration相互配合,可以用来避免Pod被分配到不合适的节点上。每个节点上都可以应用一个或多个taint ,这表示对于那些不能容忍这些taint的Pod,是不会被该节点接受的。如果将toleration应用于Pod上,则表示这些 Pod 可以(但不一定)被调度到具有匹配taint的节点上
- 使用kubectl taint命令可以给某个Node节点设置污点,Node被设置上污点之后就和 Pod 之间存在了一种相斥的关系,可以让Node拒绝 Pod 的调度执行,甚至将Node已经存在的Pod驱逐出去
污点的组成格式
key=value:effect
每个污点有一个key和value作为污点的标签,其中value可以为空,effect描述污点的作用
effect支持如下三个选项
●NoSchedule:表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上
●PreferNoSchedule:表示 k8s 将尽量避免将 Pod 调度到具有该污点的 Node 上
●NoExecute:表示 k8s 将不会将 Pod 调度到具有该污点的 Node 上,同时会将 Node 上已经存在的 Pod 驱逐出去
master上的NoSchedule污点
master 就是因为有 NoSchedule 污点,k8s 才不会将 Pod 调度到 master 节点上
kubectl describe node master01
node上设置污点
#设置污点
kubectl taint nodes node01 key1=value1:NoSchedule
#节点说明中,查找 Taints 字段
kubectl describe node node01
去除污点
#去除污点
kubectl taint nodes node01 key1:NoSchedule-
#节点说明中,查找 Taints 字段
kubectl describe node node01
污点实例测试
1.先创建两个pod资源分别在两个node节点上
kubectl get pods -o wide
2.在node02上创建污点
kubectl taint nodes node02 check=mycheck:NoExecute
3.kubectl get pods -o wide
查看 Pod 状态,会发现 node02 上的 Pod 已经被全部驱逐(注:如果是 Deployment 或者 StatefulSet 资源类型,为了维持副本数量则会在别的 Node 上再创建新的 Pod
容忍(Tolerations)
概念
设置了污点的 Node 将根据 taint 的 effect:NoSchedule、PreferNoSchedule、NoExecute 和 Pod 之间产生互斥的关系,Pod 将在一定程度上不会被调度到 Node 上。但我们可以在 Pod 上设置容忍(Tolerations),意思是设置了容忍的 Pod 将可以容忍污点的存在,可以被调度到存在污点的Node上
测试污点
1.在node02设置污点的基础上,再在node01上设置污点
kubectl taint nodes node01 check=mycheck:NoExecute
2.vim demo1.yaml
==========================================================
apiVersion: v1
kind: Pod
metadata:
name: myapp03
labels:
app: myapp03
spec:
containers:
- name: myapp01
image: nginx
==========================================================
3.kubectl apply -f demo1.yaml
4.kubectl get pods -o wide
在设置污点的基础上设置容忍
vim demo2.yaml
==========================================================
apiVersion: v1
kind: Pod
metadata:
name: myapp04
labels