K8S集群内的资源隔离
默认情况下,集群内节点是共享的,但是由于应用等级、产线事业部的重要程度不同,有些应用需要被放置在孤立的资源中,并保证这些资源不被其他应用占用,就需要实现集群内的资源隔离。污点和容忍性恰是解决资源隔离的重要手段。
Taint 和 Toleration
Taints: 避免Pod调度到特定Node上
Tolerations: 允许Pod调度到持有Taints的Node上
节点亲和性,是pod的一种属性(偏好或硬性要求),它使pod被吸引到一类特定的节点。Taint 则相反,它使节点能够排斥一类特定的 pod。
Taint 和 toleration 相互配合,可以用来避免 pod 被分配到不合适的节点上。每个节点上都可以应用一个或多个taint ,这表示对于那些不能容忍这些 taint 的 pod,是不会被该节点接受的。如果将 toleration 应用于 pod上,则表示这些 pod 可以(但不要求)被调度到具有匹配 taint 的节点上。
应用场景
• 专用节点:根据业务线将Node分组管理,希望在默认情况下不调度该节点,只有配置了污点容忍才允许分配
• 配备特殊硬件:部分Node配有SSD硬盘、GPU,希望在默认情况下不调度该节点,只有配置了污点容忍才允许分配
• 基于Taint的驱逐
污点(Taint)
使用kubectl taint 命令可以给某个node节点设置污点,Node被设置上污点之后就和Pod之间存在了一种相斥的关系,可以让Node拒绝Pod的调度执行,甚至将已经存在得Pod驱逐出去
污点的设置、查看和去除
k8s的master节点本身就带有effect类型为NoSchedule的污点,这也是为什么k8s在调度Pod时,不会调度到master节点的原因,具体查看如下:(Kubeadm在安装初始化init的时候给master打上了污点,其余节点是没有该污点的。Master节点主要任务是管理集群的,不应该跑具体的业务应用。所以不允许pod落在master节点)
如果不让pod调度到某个节点,那么可以对该节点打污点
[root@k8s-master ~]# kubectl describe node k8s-master Taints: node-role.kubernetes.io/master:NoSchedule
kubectl taint nodes k8s-master node-role.kubernetes.io/master=:NoSchedule
# 设置污点
kubectl taint nodes [node name] key1=value:NoSchedule
# 节点说明中,查看Taint字段
kubectl describe node [node name]
# 去除污点
kubectl taint nodes [node name] key1:NoSchedule-
容忍(Toleration)
设置了污点的Node将根据 taint 的 effect:NoSchedule、PreferNoSchedule、NoExecute和Pod之间产生互斥的关系,Pod将在一定程度上不会被调度到 Node 上。但我们可以在 Pod 上设置容忍(Toleration),意思是设置了容忍的 Pod 将可以在有相对应污点的 Node 中存在。
亲和性(亲和性)和反亲和性(Anti-Affinity)
一般情况下我们部署的 Pod 是通过集群的自动调度策略来选择节点的,默认情况下调度器考虑的是资源足够,并且负载尽量平均,但是有的时候我们需要能够更加细粒度的去控制 Pod 的调度,比如我们内部的一些服务 gitlab 之类的也是跑在Kubernetes集群上的,我们就不希望对外的一些服务和内部的服务跑在同一个节点上了,害怕内部服务对外部的服务产生影响;
但是有的时候我们的服务之间交流比较频繁,又希望能够将这两个服务的 Pod 调度到同一个的节点上。这就需要用到 Kubernetes 里面的一个概念:亲和性和反亲和性。
Affinity的主要优势
表达形式更丰富,不仅限于“And精确匹配”
软硬规则限制,一些软规则,并不将条件限定死,不会导致Pod无家可归。
Pod间的亲和性反亲和性规则,将调度规则细化到Pod层,从而实现了关联Pod的管理。
Pod间的亲和性策略,是基于Pod Label设定的。Pod间亲和性策略,是为了让Pod之间更好系统,哪些Pod运行在同一节点会更好,哪些Pod一定要分开,避免享互影响。
Pod亲和性规则:Pod应当(或不应当)运行在X上,如果X上运行的Pod满足了条件Y
X: 是个拓扑概念,如节点、机柜、可用区、地域等。X通过topologyKey表示,它是节点label的某个Key,这个key应当是每个节点都具有的。
Y:就是个Label Selector,定义Pod的标签条件。