用于将调度到的上,如果没有匹配的标签就会调度失败(Pending);也就是将Pod分配给指定的节点;

  作用:

  应用场景:

  :根据业务线将Node进行分组管理,例如划分资源池:核心资源池(独占资源)、一级资源池和二级资源池;:部分Node配有SSD硬盘,GPU;

  如果两个节点打同样的命名标签,那么会随机分配到同命名标签的一台上;

  例如:我们现在想将pod分配到核心业务池上;

  1.我们可以通过如下命令查看node现有labeltelegram中文版下载的网站在哪里

  2.然后现在给k8s-node1这个节点添加一个核心资源池的标签

  3.将pod调度到带有核心资源池标签的node上

  当node被添加了标签之后,我们就可以将pod调度到带有指定标签的node上了,只需要在pod的spce字段内添加nodeSelector字段然后指定标签即可;

  4.然后运行此yaml查看这个pod的调度情况
telegram的的官网的最新下载的网站在哪呢
  根据上面的Events事件我们可以看到pod通过被调度到了上,也就是我们带有的节点上;

  k8s亲和性分为和,其中pod还具有;

  :根据节点的标签去调度Pod;:根据已有的Pod标签去调度Pod;

  亲和性调度可以分为软策略和硬策略:

  :软策略就是优先满足调度要求的节点的话,如果没有满足的话,POD 就会忽略这条规则,继续完成调度过程;说白了就是优先满足符合条件的节点,但是不保证,如果没有符合条件的节点的话就会调度到其他节点上;:如果没有满足条件的节点的话,就不断重试直到满足条件为止,简单说就是你必须满足我的要求,不然就不干了;

  nodeAffinity:节点亲和性,与nodeSelector作用一样,但相比nodeSelector更灵活,能满足更多条件,例如匹配有更多的逻辑组合,不只是字符串的完全相等,支持的操作符有:In、Notln、Exits、DoesNotExist、Gt、Lt;

  例如:将pod分配到核心业务池(带有ResourcePool=kernel标签的node)上;

  (1)硬策略

  然后运行此yaml,那么这三个pod只会运行在 满足 的节点(k8s-node1)上,如果没有节点满足这个条件,则一直处于 pending 状态;

  根据上面的Events事件我们可以看到使用分配的pod也是通过被调度到了上,也就是我们带有的节点上;

  (2)软策略

  如果存在两个候选节点,都满足 preferredDuringSchedulingIgnoredDuringExecution 规则,

  其中一个节点具有标签 label-1:key-1,另一个节点具有标签 label-2:key-2, 调度器会考察各个节点的 weight

  取值,并将该权重值添加到节点的其他得分值之上;具体可参考官网释意:

  https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity

  然后运行此yaml可以发现:软策略就是第一选择是 telegram的的官网下载的方法在哪呢 node label ResourcePool=kernel 的节点,如果没有,就采用默认 scheduler 的调度策略,。

  此时把k8s-node1节点上的"ResourcePool=kernel"标签删除,然后重建pod看是否会被调度到其他节点

  kubectl label node/节点名称

  可以发现若是没有标签符合的节点,将会调度到其他节点,不会处于pending状态,这就是软策略

  主要解决 Pod 可以和哪些 Pod 部署在同一个拓扑域中的问题(其中拓扑域用主机标签实现,可以是单个主机,也可以是多个主机组成的 cluster、zone 等等);

  用途:比如一个 Pod 在一个节点上了,那么我这个也得在这个节点(亲和性),主要是解决 Pod 不能和哪些 Pod 部署在同一个拓扑域中的问题;

  用途:假如你这个 Pod 在节点上了,那么我就不想和你待在同一个节点上(反亲和性)。

  它们都是的来约束,而不是基于节点上的标签;

  Pod 间亲和性与反亲和性的类型

  与节点亲和性类似,Pod 的亲和性与反亲和性也有两种类型:

  用途:可以使用 requiredDuringSchedulingIgnoredDuringExecution 亲和性来告诉调度器, 将两个服务的 Pod 放到同一个云提供商可用区内,因为它们彼此之间通信非常频繁。

  用途:可以使用 preferredDuringSchedulingIgnoredDuringExecution 反亲和性来将同一服务的多个 Pod 分布到多个云提供商可用区中。

  由于我们这里只有一个集群,并没有区域或者机房的概念,所以我们这里直接使用主机名来作为拓扑域:

  测试1- Pod的(把 创建在和上面)

  测试2- Pod的(把 创建在和上面)。

  要使用 Pod 间亲和性,可以使用 Pod 规约中的 .affinity.podAffinity 字段。 对于 Pod 间反亲和性,可以使用

  Pod 规约中的 .affinity.podAntiAffinity 字段。

  测试pod配置如下

  (1)亲和性

  运行此yaml可以看到应用容器my-web三个副本均和测试容器test-busybox在同一个节点上(k8s-node1)

  (2)反亲和性

  然后运行此yaml会发现我们3个的应用容器my-web会和测试容器test-busybox不在同一个节点上,当然现在是软限制,如果没有合适的节点的话可能还会随机调度到同一个节点上telegram 的中文在哪呢,所以;因为要做到高可用,多个副本肯定是不能在同一个节点上的,要不然所在节点挂了的话就无pod可用了;

  在亲和性与反亲和性配置中:和下面有多个选项的话,满足任何一个条件就可以了;如果有多个选项的话,则必须同时满足这些条件才能正常调度POD。

  operator操作符配置:提供如下几种操作

  In:label的值在列表中;NotIn:label的值不在列表中;Gt:label 的值大于某个值;Lt:label 的值小于某个值;Exists:某个 label 存在;DoesNotExist:某个 label 不存在;

  :指定节点名称,用于将Pod调度到指定的Node上,不经过调度器,

  运行depolyment查看验证

  :

  经过调度器:会被节点上的污点影响,如果node上有污点的话则会根据pod是否有容忍来判断调度;不经过调度器:不会被节点污点影响,指哪打哪;

  在kubernetes中,节点亲和性(nodeAffinity)和Pod亲和性(podAffinity)都是Pod上定义的一种属性,能够使Pod按照我们的要求调度到某个节点上,而则相反,,甚至会对带污点节点上的Pod进行驱逐。当然对应的让能够容忍节点上设置的污点,这样。一般和配合使用;

  在这里插入图片描述

  拒绝常规Pod分配过来!telegram的的官网最新下载的网站是多少

  查看污点:

  我们使用kubeadm搭建的集群默认就给master节点添加了一个污点标记,所以我们可以看到平时都没有pod调度到master上

  我们可以使用上面的命令查看 master 节点的信息,其中有一条关于 Taints

  的信息:node-role.kubernetes.io/master:NoSchedule,就表示master 节点打了一个污点的标记;

  污点的内容组成一般为key、value及一个effect三个元素,表现为:

  注:master为什么默认有污点?

  安全性,因为master节点一般具备整个集群的管理权限,如果不设置污点的话 会有业务pod被分配进来,那样如果被有心的互联网用户盯上的话,通过种种手段进入pod内提权到宿主机,那将会有严重的危害;管理角色;master节点上运行着各个组件的管理pod,随着后期组件越来越多,master的负载也就越来越大,所以尽量只做管理角色,不跑业务pod;

  (1)设置污点

  一般情况下,我们想要某个节点只允许特定的进行调度,这时就得对节点进行设置污点,可以按格式进行设置,其中的可取值如下:

  :尽量不要调度;:一定不能被调度;:不仅不会调度,还会驱逐Node上已有的Pod(正在运行的pod没有容忍配置);

  设置污点方法如下:

  (2)删除污点

  上面给Node添加了污点阻止Pod进行调度,如果想要删除节点上的污点的话可以使用如下命令:

  删除污点的命令和创建污点类似,不过需要注意的是删除污点需要知道key和最后面设置一个""即可将污点删除,示例如下:

  查看污点,可以看到上面设置的三个值:

  然后删除污点

  再次查看污点,可以看到以上污点都被删除了

  为了使某些Pod禁止调度到某些特定的节点上,就可以对节点设置污点taints;当然如果希望有些能够上的继续能够调度到该节点,就可以对设置,让Pod能够上的;

  例如:

  对一个节点设置污点:

  然后下面对Pod设置容忍:

  Node和Pod对于污点与容忍的基本概念

  一个node可以有多个污点;

  一个pod可以有多个容忍;

  kubernetes执行多个污点和容忍方法类似于过滤器;

  如果一个node上有多个污点,且pod上也有多个容忍,只要`pod中容忍能包含node上设置的全部污点,则可以将pod调度到该node上;

  如果pod上设置的容忍不能够包含node上设置的全部污点,且node上剩下不能被包含的污点 effect 为PreferNoSchedule,那么也可能被调度到该节点;

  反之如果pod上设置的容忍不能够包含node上设置的全部污点,且node上剩下不能被包含的污点 effect 为NoSchedule或NoExecute,则不会被调度!!;

  (1)Deployment中设置容忍

  (2)设置容忍时间

  在正常的情况下,如果一个污点带有被添加到了这个。那么不能容忍这个污点的所有Pod都会被剔除;而带有容忍标签的Pod就不剔掉。然而,一个带有的容忍可以指定一个来指定当这个污点被添加的时候在多长时间内 Pod不会被剔掉;

  如果这个Pod已经在这个带污点且 effect 为 NoExecute的node上,这个Pod就可以一直再被剔除;如果这个时候Node的污点被移除了,这个Pod就不会被剔掉;

  Operator的值默认是Equal,可以设置为和两种;

  (1)当Operator为Exists时

  例如一个空的key,将匹配node上所有的key、value、effect,即容忍所有的污点;

  例如一个空的effect,但是key不为空,那么将匹配所有与key相同的effect;

  例如一个空的key和空的value,将只匹配effect值相同的污点

  (2)当Operator为Equal时

  Node和Pod的key值、value值与effect值相同则能调度:

  Node上污点的key值、value值、effect值和pod容忍都相同则能被调度

  Node的污点和Pod的大部分都相同,不同的是Node污点effect的值为PreferNoSchedule的,可能会调度

  Node的污点和Pod的大部分相同,不同的是Node污点的effect的值是NoExecute和NoSchedule的话,则不会被调度

  对比理解Exits和Equal之间的区别:

  在使用kubernetes时,会遇到某个node节点明明已经宕机了,查看node状态从Ready状态变为了NotReady状态,但是节点所在的Pod却已经处于running状态,过了很长一段时间才会转为Terminating状态,原因如下:

  污点是对于node节点来讲的,如果node节点设置为NoExecute,它会影响节点上已经运行的Pod,如下所示

  此外,当某些条件为true时,节点控制器会自动污染节点。k8s内置以下污点:

  https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/taint-and-toleration/#taint-based-evictions

  关于“节点压力驱逐”的官方解释

  key注释node.kubernetes.io/not-ready节点未准备好。这相当于节点状况 Ready 的值为 “False”。node.kubernetes.io/unreachable节点控制器访问不到节点. 这相当于节点状况 Ready 的值为 “Unknown”。node.kubernetes.io/memory-pressure节点存在内存压力。node.kubernetes.io/disk-pressure节点存在磁盘压力。node.kubernetes.io/pid-pressure节点存在 PID 压力。node.kubernetes.io/network-unavailable节点网络不可用。node.kubernetes.io/unschedulable节点不可调度。node.cloudprovider.kubernetes.io/uninitialized如果 kubelet 启动时指定了一个“外部”云平台驱动, 它将给当前节点添加一个污点将其标志为不可用。在 cloud-controller-manager 的一个控制器初始化这个节点后,kubelet 将删除这个污点。

  通过上面节点状态的铺垫,当一个节点宕机时,kubernetes集群会给节点打上标签,如下:

  一个Ready状态的节点:

  一个NotReady状态的节点:

  处于NotReady状态的节点被打上了下面两个污点:

  接下来测试kubernetes集群会给Pod分配上面样的容忍。

  通过上面我们就可以看出了,当node节点处于NotReady状态或者unreachable状态时,Pod会容忍它5分钟,然后被驱逐。而这5分钟内就算Pod处于running状态,也是无法正常提供服务的。因此,可以在yaml清单中手动指明0容忍,清单文件内容如下:

  生成pod如下

  接下来强制关闭k8s-node1节点,查看Pod是否转移

  在node节点转换为NotReady状态后,Pod立刻进行了转移。这是通过在yaml清单文件中明确指定了;还可以直接修改apiserver配置来进行修改默认容忍时间。

  https://kubernetes.io/zh-cn/docs/reference/access-authn-authz/admission-controllers/#defaulttolerationseconds

  kubeadm方式:

  修改保存后, pod会自动重载最新配置。

  二进制方式:

seo