云原生|kubernetes |一文带你搞懂pod调度策略,驱逐策略,污点、容忍调度(三)

简介: 云原生|kubernetes |一文带你搞懂pod调度策略,驱逐策略,污点、容忍调度

(2)亲和性pod调度


pod和node节点标签之间的定向调度

上面的定向调度还是比较粗糙的方式,因为如果我们设置了定向调度,但标签忘记打了,或者标签写错了,nodeSelector又设置了,那么部署将会变成pending。无疑,我们还是希望每次的部署都是成功的,因此,我们需要一种或者几种更为精细的pod调度。

a)NodeAffinity(节点亲和性)

pod.spec.affinity.nodeAffinity
  requiredDuringSchedulingIgnoredDuringExecution  Node节点必须满足指定的所有规则才可以,相当于硬限制(找不到会调度失败)
    nodeSelectorTerms  节点选择列表
      matchFields   按节点字段列出的节点选择器要求列表
      matchExpressions   按节点标签列出的节点选择器要求列表(推荐)
        key    键
        values 值
        operator 关系符 支持Exists(存在), DoesNotExist(不存在), In(范围), NotIn(范围取反), Gt(大于), Lt(小于)
  preferredDuringSchedulingIgnoredDuringExecution 优先调度到满足指定的规则的Node,相当于软限制 (倾向,找不到不会调度失败)
    preference   一个节点选择器项,与相应的权重相关联
      matchFields   按节点字段列出的节点选择器要求列表
      matchExpressions   按节点标签列出的节点选择器要求列表(推荐)
        key    键
        values 值
        operator 关系符 支持In, NotIn, Exists, DoesNotExist, Gt, Lt
  weight 倾向权重,在范围1-100。

关系符operator的使用说明:

- matchExpressions:
  - key: nodeenv              # 匹配存在标签的key为nodeenv的节点,只匹配key就行
    operator: Exists
  - key: nodeenv              # 匹配标签的key为nodeenv,且value是"xxx"或"yyy"的节点,key和value都要匹配
    operator: In
    values: ["xxx","yyy"]
  - key: nodeenv              # 匹配标签的key为nodeenv,且value大于"xxx"的节点
    operator: Gt
    values: "xxx"

例子1:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  namespace: default
spec:
  containers:
  - name: nginx
    image: nginx:1.18
  tolerations:
  - operator: Exists
    effect: NoExecute
  nodeName: k8s-node2
  affinity:  #亲和性设置
    nodeAffinity: #申明是node亲和策略
      requiredDuringSchedulingIgnoredDuringExecution: # 硬限制
        nodeSelectorTerms:
        - matchExpressions: # 匹配env的值在["web","dev"]中的标签,实际没有设置此标签,所以会匹配失败
          - key: node
            operator: In
            values: ["web","dev"]

这个亲和策略表示只要node标签里有web或者dev就可以成功部署此pod,否则,必定不能部署,现在先运行一哈,查看pod的状态,可以看到状态是NodeAffinity ,部署不成功:

[root@master coredns]# k get po -A -owide
NAMESPACE     NAME                       READY   STATUS         RESTARTS   AGE    IP               NODE         NOMINATED NODE   READINESS GATES
default       nginx                      0/1     NodeAffinity   0          18s    <none>           k8s-node2    <none>           <none>
kube-system   coredns-76648cbfc9-87fc7   1/1     Running        1          12h    10.244.0.17      k8s-master   <none>           <none>
kube-system   kube-flannel-ds-2jqg2      1/1     Running        0          111m   192.168.217.17   k8s-node1    <none>           <none>
kube-system   kube-flannel-ds-jd6p7      1/1     Running        0          111m   192.168.217.16   k8s-master   <none>           <none>
kube-system   kube-flannel-ds-k4qx9      1/1     Running        0          105m   192.168.217.18   k8s-node2    <none>           <none>

那么,现在就给node1设置标签值为web吧:

kubectl label nodes k8s-node1 node=dev

再次部署就会成功了。

例子2:

[root@master coredns]# cat nginx.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-nodeaffinity-preferred
  namespace: default
spec:
  containers:
  - name: nginx
    image: nginx:1.18
  affinity:  #亲和性设置
    nodeAffinity: #设置node亲和性
      preferredDuringSchedulingIgnoredDuringExecution: # 软限制
      - weight: 1
        preference:
          matchExpressions: # 匹配env的值在["xxx","yyy"]中的标签(当前环境没有)
          - key: nodeenv
            operator: In
            values: ["3432","ewrew"]

这里设置的values是我随便乱写的,自然是随便调度到了某个节点,如果确实有,那自然会调度成功。

(3)PodAffinity(Pod亲和性)


pod亲和性是相对pod来说的,比如,A pod已经在某个节点或者作用域运行了,现在B pod需要和A pod在同一个节点或者作用域运行,反亲和就是A pod不和B pod在同一个node或者作用域。

PodAffinity的可配置项:

pod.spec.affinity.podAffinity
  requiredDuringSchedulingIgnoredDuringExecution  硬限制
    namespaces       指定参照pod的namespace
    topologyKey      指定调度作用域
    labelSelector    标签选择器
      matchExpressions  按节点标签列出的节点选择器要求列表(推荐)
        key    键
        values 值
        operator 关系符 支持In, NotIn, Exists, DoesNotExist.
      matchLabels    指多个matchExpressions映射的内容
  preferredDuringSchedulingIgnoredDuringExecution 软限制
    podAffinityTerm  选项
      namespaces      
      topologyKey
      labelSelector
        matchExpressions  
          key    键
          values 值
          operator
        matchLabels 
    weight 倾向权重,在范围1-100
topologyKey用于指定调度时作用域,例如:
    如果指定为kubernetes.io/hostname,那就是以Node节点为区分范围
    如果指定为beta.kubernetes.io/os,则以Node节点的操作系统类型来区分
这些都是node节点的标签在管理,例如有的集群有beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64
也可能有arrch架构的操作系统
这里weight权重的作用是,一个pod节点可以有多个软策略,每个软策略可以有不同的权重,然后根据权重由高到选择不同软策略,直到选中符合条件的节点。如果设置了多个软策略,权重价值就体现出来了。比如张三节点权重为4,先看看三节点符不符合选中条件,不符合,再看权重为3的李四节点符不符合选中条件...直到找到符合选中条件的节点。也就是说,权重按值高低来确定,越高越优先

例子1:

有一个A pod,此pod有如下pod标签并设置了nodename:

1. 
2.   labels:
3.     podenv: pro #设置标签

硬策略B pod:

apiVersion: v1
kind: Pod
metadata:
  name: pod-podaffinity-required
  namespace: default
spec:
  containers:
  - name: nginx
    image: nginx:1.18
  affinity:  #亲和性设置
    podAffinity: #设置pod亲和性
      requiredDuringSchedulingIgnoredDuringExecution: # 硬限制
      - labelSelector:  #标签选择器
          matchExpressions: # 匹配env的值在["xxx","yyy"]中的标签
          - key: podenv
            operator: In
            values: ["fdsfdsf","pro"]
        topologyKey: kubernetes.io/hostname   #调度作用域,即如果匹配到,就调度到目标pod同一节点上

上面配置表达的意思是:新Pod必须要与拥有标签podenv=fdsfdsf或者podenv=pro的pod在同一Node上

关于PodAffinity的 preferredDuringSchedulingIgnoredDuringExecution(软策略),这里不再演示,和硬策略基本一样。

(4)PodAntiAffinity(Pod反亲和性)


PodAntiAffinity主要实现以运行的Pod为参照,让新创建的Pod跟参照pod不在一个区域中的功能。

它的配置方式和选项跟PodAffinty是基本一样的,只修改一个地方即可,其余的都一样

 affinity:  #亲和性设置
    podAntiAffinity: #设置pod亲和性

那么,符合条件的Apod将不会和Bpod部署到一起。

资源限制策略


资源限制策略指的是某些场景如节点 NotReady,或者某一个节点的硬件资源达到预设阈值后,节点内的pod就进入驱逐状态

硬件资源限制主要是有kube-controller-manager和kubelet这两个核心服务来进行的,也就是它们的配置文件来设定阈值的,一般kube-controller-manager是不做设定,主要是由kubelet设定。

以二进制安装的集群为例,在config文件内配置:

kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: 0.0.0.0
port: 10250
readOnlyPort: 10255
cgroupDriver: cgroupfs
clusterDNS:
  - 10.0.0.2
clusterDomain: cluster.local
failSwapOn: false
authentication:
  anonymous:
    enabled: false
  webhook:
    cacheTTL: 2m0s
    enabled: true
  x509:
    clientCAFile: /opt/kubernetes/ssl/ca.pem
authorization:
  mode: Webhook
  webhook:
    cacheAuthorizedTTL: 5m0s
    cacheUnauthorizedTTL: 30s
evictionHard:
  imagefs.available: 15%
  memory.available: 100Mi
  nodefs.available: 10%
  nodefs.inodesFree: 5%
maxOpenFiles: 1000000
maxPods: 110

关于硬驱逐的阈值, nodefs.available: 10%表示节点服务器剩余磁盘空间小于百分之10就触发,那么,现在在node1节点上有两个pod在运行:

[root@master cfg]# k get po -A -owide
NAMESPACE     NAME                         READY   STATUS    RESTARTS   AGE     IP               NODE         NOMINATED NODE   READINESS GATES
default       pod-nodeaffinity-preferred   1/1     Running   0          133m    10.244.1.16      k8s-node1    <none>           <none>
kube-system   coredns-76648cbfc9-z8kh5     1/1     Running   1          8h      10.244.1.9       k8s-node1    <none>           <none>
kube-system   kube-flannel-ds-99lsb        1/1     Running   1          6h42m   192.168.217.16   k8s-master   <none>           <none>
kube-system   kube-flannel-ds-w2kjl        1/1     Running   6          6h42m   192.168.217.17   k8s-node1    <none>           <none>
kube-system   kube-flannel-ds-xdm6r        1/1     Running   0          6h22m   192.168.217.18   k8s-node2    <none>           <none>

将nodefs.available: 10%修改为nodefs.available: 90%,然后在重启node1节点上的kubelet会发生什么呢?

答案是该节点的所有pod会转成Terminating状态,因为这个节点有一个coredns服务。

未完待续@@@@@@!!!!!!!!!!!!

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
目录
相关文章
|
3天前
|
Kubernetes API 调度
Kubernetes详解(十五)——Pod对象创建过程
Kubernetes详解(十五)——Pod对象创建过程
14 4
|
3天前
|
Kubernetes API 调度
Kubernetes详解(十四)——Pod对象生命周期
Kubernetes详解(十四)——Pod对象生命周期
11 3
|
3天前
|
Kubernetes Linux 调度
Kubernetes详解(十三)——Pod详解
Kubernetes详解(十三)——Pod详解
16 3
|
23小时前
|
存储 弹性计算 Kubernetes
【阿里云云原生专栏】深入解析阿里云Kubernetes服务ACK:企业级容器编排实战
【5月更文挑战第20天】阿里云ACK是高性能的Kubernetes服务,基于开源Kubernetes并融合VPC、SLB等云资源。它提供强大的集群管理、无缝兼容Kubernetes API、弹性伸缩、安全隔离及监控日志功能。用户可通过控制台或kubectl轻松创建和部署应用,如Nginx。此外,ACK支持自动扩缩容、服务发现、负载均衡和持久化存储。多重安全保障和集成监控使其成为企业云原生环境的理想选择。
110 3
|
1天前
|
Kubernetes API 调度
Kubernetes详解(十五)——Pod对象创建过程
Kubernetes详解(十五)——Pod对象创建过程
18 5
|
1天前
|
Kubernetes API 调度
Kubernetes详解(十四)——Pod对象生命周期
Kubernetes详解(十四)——Pod对象生命周期
8 2
|
1天前
|
Kubernetes Linux 调度
Kubernetes详解(十三)——Pod详解
Kubernetes详解(十三)——Pod详解
15 2
|
2天前
|
存储 运维 监控
Kubernetes 集群的监控与性能优化策略
【5月更文挑战第19天】 在微服务架构日益普及的背景下,容器编排工具如Kubernetes已成为部署、管理和扩展服务的关键平台。然而,随着集群规模的增长和服务的复杂化,有效的监控和性能优化成为确保系统稳定性和高效性的重要挑战。本文将探讨针对Kubernetes集群监控的最佳实践,并提出一系列性能优化策略,旨在帮助运维人员识别潜在的瓶颈,保障服务的持续可靠性及响应速度。
|
4天前
|
Kubernetes 应用服务中间件 调度
k8s-高级调度-污点容忍、亲和性调度
k8s-高级调度-污点容忍、亲和性调度
|
4天前
|
Kubernetes Linux 调度
k8s-高级调度-CronJob 计划任务
k8s-高级调度-CronJob 计划任务

推荐镜像

更多