爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

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

      首页 知识中心 其他 文章详情页

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

      2023-02-16 09:34:27 阅读次数:141

      云原生,kubernetes

      前言:

      kubernetes集群不是简单的安装部署就完事了,还需要根据业务的性质设定一些策略,比如,某些pod不希望被调度到硬件条件比较差的节点,某些pod又希望调度到含有比如有特定的硬件GPU的节点上。又或者某个节点由于硬件资源比如CPU,内存并没有彻底耗尽,但如果在继续调度pod到此节点有造成集群崩溃的风险,如何阻止并驱逐此节点在运行的pod,以及集群需要检修或者重建某个节点,此时的节点上运行的pod应该如何处置等等各种各样的问题以及解决方案就形成了pod调度策略,驱逐策略,污点、容忍调度策略。

      说人话,这些也可以说是kubernetes集群的优化策略。下面将就以上提出的情况和一些没有提到过的情况做一个总结吧!!!

      主要的pod调度策略:


      • 自由调度:pod运行在哪个节点完全由scheduler经过一系列算法计算得出(如果没有定向调度,亲和性,容忍策略,此策略就是默认的啦)

      • 定向调度:采用nodeName、nodeSelector来实现pod定向调度(pod面向节点)

      • 亲和性调度:NodeAffinityinity、PodAffinity、PodAntiAffinity

      • 污点、容忍调度:Taints、Toleration(前面讲过了)

      一,

      节点维护状态(cordon,uncordon,drain):

      节点情况举例:

      例如有三个节点,k8s-node1,k8s-node2,k8s-master

      [root@master ~]# k get no
      NAME         STATUS   ROLES    AGE   VERSION
      k8s-master   Ready    <none>   25d   v1.18.3
      k8s-node1    Ready    <none>   25d   v1.18.3
      k8s-node2    Ready    <none>   25d   v1.18.3

      现有两个pod在节点2运行&#xff0c;其中pod  kube-flannel-ds-mlb7l是daemonsets方式部署&#xff0c;是核心组件&#xff1a;

      NAMESPACE     NAME                       READY   STATUS    RESTARTS   AGE     IP               NODE         NOMINATED NODE   READINESS GATES
      default       busybox-7bf6d6f9b5-jg922   1/1     Running   2          24d     10.244.0.11      k8s-master   <none>           <none>
      default       nginx-7c96855774-28b5w     1/1     Running   2          24d     10.244.0.12      k8s-master   <none>           <none>
      default       nginx-7c96855774-d592j     1/1     Running   0          4h44m   10.244.0.13      k8s-master   <none>           <none>
      default       nginx1                     1/1     Running   2          24d     10.244.2.11      k8s-node2    <none>           <none>
      kube-system   coredns-76648cbfc9-lb75g   1/1     Running   2          24d     10.244.2.10      k8s-node2    <none>           <none>
      kube-system   kube-flannel-ds-mhkdq      1/1     Running   7          24d     192.168.217.17   k8s-node1    <none>           <none>
      kube-system   kube-flannel-ds-mlb7l      1/1     Running   6          24d     192.168.217.18   k8s-node2    <none>           <none>
      kube-system   kube-flannel-ds-sl4qv      1/1     Running   2          24d     192.168.217.16   k8s-master   <none>           <none>

      假如现在需要维护node2节点&#xff0c;那么&#xff0c;先需要驱逐node2节点上的所有pod&#xff0c;pod方式部署的直接驱逐&#xff0c;daemonsets的忽略&#xff1a;

      [root@master ~]# k drain k8s-node2 --force --ignore-daemonsets
      node/k8s-node2 already cordoned
      WARNING: deleting Pods not managed by ReplicationController, ReplicaSet, Job, DaemonSet or StatefulSet: default/nginx1; ignoring DaemonSet-managed Pods: kube-system/kube-flannel-ds-mlb7l
      evicting pod default/nginx1
      evicting pod kube-system/coredns-76648cbfc9-lb75g
      pod/coredns-76648cbfc9-lb75g evicted
      pod/nginx1 evicted
      node/k8s-node2 evicted

      结果是这样的&#xff1a;

      可以看到&#xff0c;coredns这个pod漂移到了node1&#xff0c;pod方式部署的nginx直接销毁了&#xff0c;kube-flannel-ds-mlb7l没有变动

      [root@master ~]# k get po -A -owide
      NAMESPACE     NAME                       READY   STATUS    RESTARTS   AGE     IP               NODE         NOMINATED NODE   READINESS GATES
      default       busybox-7bf6d6f9b5-jg922   1/1     Running   2          24d     10.244.0.11      k8s-master   <none>           <none>
      default       nginx-7c96855774-28b5w     1/1     Running   2          24d     10.244.0.12      k8s-master   <none>           <none>
      default       nginx-7c96855774-d592j     1/1     Running   0          4h52m   10.244.0.13      k8s-master   <none>           <none>
      kube-system   coredns-76648cbfc9-z8kh5   1/1     Running   0          2m2s    10.244.1.8       k8s-node1    <none>           <none>
      kube-system   kube-flannel-ds-mhkdq      1/1     Running   7          24d     192.168.217.17   k8s-node1    <none>           <none>
      kube-system   kube-flannel-ds-mlb7l      1/1     Running   6          24d     192.168.217.18   k8s-node2    <none>           <none>
      kube-system   kube-flannel-ds-sl4qv      1/1     Running   2          24d     192.168.217.16   k8s-master   <none>           <none>

      这个时候的节点是部分禁用的&#xff08;这里的意思是scheduler服务不会调度新的pod到此节点&#xff0c;但&#xff0c;如果强制nodeselector&#xff0c;仍然会运行新pod&#xff09;

      此时的scheduler不会调度新pod到node2节点

      [root@master ~]# k get no
      NAME         STATUS                     ROLES    AGE   VERSION
      k8s-master   Ready                      <none>   25d   v1.18.3
      k8s-node1    Ready                      <none>   25d   v1.18.3
      k8s-node2    Ready,SchedulingDisabled   <none>   25d   v1.18.3

      节点维护状态和解除节点维护状态&#xff1a;

      [root@master coredns]# k cordon k8s-node2
      node/k8s-node2 cordoned
      [root@master coredns]# k uncordon k8s-node2
      node/k8s-node2 uncordoned

      小结&#xff1a;

      cordon&#xff0c;uncordon&#xff0c;drain这三个命令主要是用在节点维护场景&#xff0c;drain有安全驱逐pod的功能&#xff0c;pod会实现漂移&#xff0c;但此驱逐并非硬性驱逐&#xff0c;管不了pod的指定调度策略。

      适用范围是比较窄的哦&#xff0c;比如&#xff0c;使用了本地存储卷的pod或者有状态pod不适合使用drain&#xff0c;因为drain了相关服务就完蛋了。


      二&#xff0c;

      taints--节点污点

      关于污点的解释&#xff1a;

      [root@master coredns]# k explain node.spec.taints
      KIND:     Node
      VERSION:  v1
      
      RESOURCE: taints <[]Object>
      
      DESCRIPTION:
           If specified, the node's taints.
      
           The node this Taint is attached to has the "effect" on any pod that does
           not tolerate the Taint.
      
      FIELDS:
         effect	<string> -required-
           Required. The effect of the taint on pods that do not tolerate the taint.
           Valid effects are NoSchedule, PreferNoSchedule and NoExecute.
      
         key	<string> -required-
           Required. The taint key to be applied to a node.
      
         timeAdded	<string>
           TimeAdded represents the time at which the taint was added. It is only
           written for NoExecute taints.
      
         value	<string>
           The taint value corresponding to the taint key.

      taint的子选项effect有三个结果定义&#xff1a;

      1&#xff0c;NoSchedule&#xff1a;表示k8s将不会将Pod调度到具有该污点的Node上
      2&#xff0c;PreferNoSchedule&#xff1a;表示k8s将尽量避免将Pod调度到具有该污点的Node上
      3&#xff0c;NoExecute&#xff1a;表示k8s将不会将Pod调度到具有该污点的Node上&#xff0c;同时会将Node上已经存在的Pod驱逐出去

      污点的设置&#xff1a; 

      例如设置node2节点污点为NoExecute&#xff08;这里的key=value 可以随意设置&#xff0c;比如&#xff0c;A=B:noExecute也是OK的&#xff0c;但最好有意义&#xff0c;后面的容忍会用到key和values的值&#xff09;&#xff1a;

      kubectl taint nodes k8s-node2 key=value:NoExecute

      查看节点和pod&#xff08;可以看到&#xff0c;node2不可调度&#xff0c;并且其上的pod都被Terminating&#xff0c;因为busybox这个pod我是设置了nodeSelector   &#xff09;&#xff1a; 

      [root@master coredns]# k get no
      NAME         STATUS                     ROLES    AGE   VERSION
      k8s-master   Ready                      <none>   25d   v1.18.3
      k8s-node1    Ready                      <none>   25d   v1.18.3
      k8s-node2    Ready,SchedulingDisabled   <none>   25d   v1.18.3
      [root@master coredns]# k get po -A -owide
      NAMESPACE     NAME                       READY   STATUS        RESTARTS   AGE    IP               NODE         NOMINATED NODE   READINESS GATES
      default       busybox-68c4f6755d-24f79   0/1     Terminating   0          18s    <none>           k8s-node2    <none>           <none>
      default       busybox-68c4f6755d-26f5j   0/1     Terminating   0          34s    <none>           k8s-node2    <none>           <none>
      default       busybox-68c4f6755d-28m4l   0/1     Terminating   0          42s    <none>           k8s-node2    <none>           <none>
      default       busybox-68c4f6755d-2bb7z   0/1     Terminating   0          39s    <none>           k8s-node2    <none>           <none>
      default       busybox-68c4f6755d-2gkss   0/1     Terminating   0          4s     <none>           k8s-node2    <none>           <none>
      default       busybox-68c4f6755d-2gpq4   0/1     Terminating   0          87s    <none>           k8s-node2    <none>           <none>
      
      kube-system   kube-flannel-ds-mlb7l      1/1     Terminating   6          25d    192.168.217.18   k8s-node2    <none>           <none>

      解除污点&#xff1a;

      kubectl taint nodes k8s-node2 key:NoExecute-
      kubectl uncordon k8s-node2

      污点的查看&#xff1a;

      [root@master ~]# kubectl describe nodes k8s-node2 |grep Taints
      Taints:             key=value:NoSchedule

      OK&#xff0c;现在node2有污点&#xff0c;此节点不调度新pod&#xff0c;那么&#xff0c;我们来部署一个三副本的pod看看能否成功&#xff1a;

      [root@master coredns]# cat test.yaml 
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: busybox
        namespace: default
      spec:
        replicas: 3
        selector:
          matchLabels:
            app: busybox
        template:
          metadata:
            labels:
              app: busybox
          spec:
       #     nodeName: k8s-node2
            containers:
            - name: busybox
              image: busybox:1.28.3
              imagePullPolicy: IfNotPresent
              args:
              - /bin/sh
              - -c
              - sleep 10; touch /tmp/healthy; sleep 30000

      可以看到&#xff0c;pod确实没有在node2上&#xff0c;即使副本数修改为10个&#xff0c;仍然是不会调度到node2这个节点。 

      [root@master coredns]# k get po -o wide
      NAME                       READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
      busybox-7bf6d6f9b5-5qzfn   1/1     Running   0          44s   10.244.1.10   k8s-node1    <none>           <none>
      busybox-7bf6d6f9b5-j72q7   1/1     Running   0          44s   10.244.0.14   k8s-master   <none>           <none>
      busybox-7bf6d6f9b5-mgt8j   1/1     Running   0          44s   10.244.0.15   k8s-master   <none>           <none>

      关于污点的小结&#xff1a;

      污点存在的意义&#xff1a;

      使用 kubectl taint 命令可以给某个 node节点设置污点&#xff0c;Node 被设置上污点之后就和 Pod 之间存在了一种互斥的关系&#xff0c;可以让 Node 拒绝 Pod 的调度执行&#xff0c;甚至将 Node 已经存在的 Pod 驱逐出去&#xff1a;

      key=value:effect

       通过给节点设置不同的污点&#xff0c;可以制定一个总的策略&#xff0c;例如&#xff0c;新节点使用effect NoExecute&#xff0c;那么&#xff0c;想在此节点运行pod就必须是有设置tolerations&#xff08;容忍策略&#xff09;的特定pod了&#xff0c;无疑安全性会大大提高&#xff0c;一般master节点是不建议运行非核心服务的pod的&#xff0c;因此&#xff0c;也可以给master打上NoSchedule污点&#xff0c;以保护master。

      稍作总结&#xff0c;三种污点effect里,NoSchedule和PreferNoSchedule是比较温和的&#xff0c;NoExecute是最为严厉的&#xff0c;即使pod设置了nodeSelector或者nodeSelectorTerm&#xff0c;设置了此effect的节点也是不可使用的&#xff0c;也可以算是真正的节点禁用&#xff0c;因此&#xff0c;NoExecute是慎用的。

      NoSchedule等于是节点维护状态&#xff0c;PreferNoSchedule等于是无所谓&#xff0c;你非要调度到这个节点也行。

      以上都是面向某个节点内的所有pod调度&#xff0c;未免对于pod的调度不够精细&#xff0c;例如&#xff0c;NoExecute直接将节点内的pod全部清空&#xff0c;太暴力了&#xff08;虽然这么做&#xff0c;整个节点的安全性非常高&#xff0c;和iptables防火墙一样的策略嘛&#xff0c;先禁止所有&#xff0c;然后在放开部分&#xff0c;相当于tolerations&#xff0c;其实这也是容忍存在的意义嘛&#xff09;。那么&#xff0c;下面的调度策略将针对的是单个pod。

      污点的effect可以设置多个

      三&#xff0c;

      容忍策略---tolerations

      容忍是相对于污点来说的&#xff0c;容忍是在pod内设置的。光说不练假把式对吧&#xff0c;直接看kube-flannel的部署清单文件内的相关内容吧&#xff1a;

      apiVersion: apps/v1
      kind: DaemonSet
      metadata:
        name: kube-flannel-ds
        namespace: kube-system
        labels:
          tier: node
          app: flannel
      spec:
        selector:
          matchLabels:
            app: flannel
        template:
          metadata:
            labels:
              tier: node
              app: flannel
          spec:
            affinity:
              nodeAffinity:
                requiredDuringSchedulingIgnoredDuringExecution:
                  nodeSelectorTerms:
                  - matchExpressions:
                    - key: kubernetes.io/os
                      operator: In
                      values:
                      - linux
            hostNetwork: true
            priorityClassName: system-node-critical
            tolerations:
            - operator: Exists
              effect: NoSchedule

      此段容忍表示&#xff0c;默认的容忍污点的effec 是NoSchedule的节点&#xff0c;也就是说即使此node节点设置了NoSchedule&#xff0c;该pod仍然可以部署&#xff0c;为什么是这样设置呢&#xff1f;其实此清单文件是可以使用在kubeadmin部署的集群内&#xff0c;默认的kubeadmin部署的集群会对master节点设置NoSchedule的污点。

      查看node2的污点&#xff08;假设我已经提前设置好了污点&#xff09;&#xff1a;

      [root@master coredns]# k describe node k8s-node2 |grep Taints
      Taints:             key=values:NoExecute

      此pod将不会被创建&#xff1a; 

      [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: nodeweb
                  operator: In
                  values: ["dsfsd","web"]
        nodeName: k8s-node2


      修改成如下的pod才可以被创建&#xff08;容忍三行&#xff09;&#xff1a;

      apiVersion: v1
      kind: Pod
      metadata:
        name: nginx
        namespace: default
      spec:
        containers:
        - name: nginx
          image: nginx:1.18
        tolerations:
        - operator: Exists
          effect: NoExecute
        affinity:  #亲和性设置
          nodeAffinity: #设置node亲和性
            preferredDuringSchedulingIgnoredDuringExecution: # 软限制
            - weight: 1
              preference:
                matchExpressions: # 匹配env的值在["xxx","yyy"]中的标签(当前环境没有)
                - key: nodeweb
                  operator: In
                  values: ["dsfsd","web"]
        nodeName: k8s-node2

      容忍定义小结&#xff1a;

      • 污点和容忍是相呼应的关系&#xff0c;也就是说有污点才有容忍&#xff0c;光有容忍是没有意义的。

      • operator的值只有两个Equal和Exists两个&#xff0c;从字面翻译看&#xff0c;Equal表示必须相等&#xff0c;Exists表示默认情况。

      • operator 的值为 Exists 时将会忽略 value 值&#xff0c;也可以直接省略values定义。

      • operator 的值为 Exists 时可以省略key值&#xff0c;此时表示表示容忍所有的污点 key&#xff0c;例如&#xff1a;

      tolerations:
      - operator: “Exists”
      • effect可以省略&#xff0c;省略effect 值时&#xff0c;表示容忍所有的污点作用&#xff0c;例如&#xff1a;

      tolerations:
      - key: “key”
      operator: “Exists”

      下面是一个比较完整的示例&#xff1a;

      tolerations:
      - key: “key1”
      	operator: “Equal”
      	value: “value1”
      	effect: “NoSchedule”
      tolerationSeconds: 3600
      - key: “key1”
      	operator: “Equal”
      	value: “value1”
      	effect: “NoExecute”
      - key: “key2”
      	operator: “Exists”
      	effect: “NoSchedule”

       


      三&#xff0c;

      pod调度策略

      这些策略都是写在资源清单文件内的&#xff0c;针对单独的pod

      默认情况下&#xff0c;一个pod被调度到哪个node节点是由scheduler组件采用相应的算法计算出来的&#xff0c;这个过程是不受人工控制的&#xff0c;但是在实际使用中&#xff0c;这并不能满足所以要求&#xff0c;很多时候我们想控制某些pod到达某些节点&#xff0c;所以kubernetes就为我们提供了4种pod的调度策略来解决该问题。


      &#xff08;1&#xff09;定向调度

      主要是指定pod定向调度到哪个node节点上

      a&#xff09;

      nodeName策略

      注&#xff1a;kubectl集群节点名nodeName称可以通过kubectl get nodes查看&#xff0c;例如本例&#xff1a;

      [root@master coredns]# k get no
      NAME         STATUS   ROLES    AGE   VERSION
      k8s-master   Ready    <none>   25d   v1.18.3
      k8s-node1    Ready    <none>   25d   v1.18.3
      k8s-node2    Ready    <none>   25d   v1.18.3

       

      资源清单文件内使用&#xff1a;

      [root@master coredns]# cat nginx.yaml 
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod-nodename
        namespace: default
      spec:
        containers:
        - name: nginx
          image: nginx:1.18
        nodeName: k8s-node1 # 指定调度到node1节点上&#xff0c;注意此字段是pod属性&#xff0c;所以和containers在同一列

      毫无疑问&#xff0c;此pod必定会在node2节点运行&#xff0c;即使有drain或者train设置了NoScheduler

      b&#xff09;

      NodeSelector策略

      NodeSelector用于将pod调度到添加了指定标签的node节点上。它是通过kubernetes的label-selector机制实现的&#xff0c;也就是说&#xff0c;在pod创建之前&#xff0c;会由scheduler使用MatchNodeSelector调度策略进行label匹配&#xff0c;找出目标node&#xff0c;然后将pod调度到目标节点&#xff0c;该匹配规则是强制约束。简单的说就是给kubectl集群的node节点打上标签&#xff0c;然后调度器将pod调度到指定标签的node上。

      例如给node2节点设置标签&#xff0c;并查询标签&#xff1a;

      kubectl label nodes k8s-node2 node=LAMP
      
      
      [root@master coredns]# k get nodes --show-labels
      NAME         STATUS   ROLES    AGE   VERSION   LABELS
      k8s-master   Ready    <none>   25d   v1.18.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux
      k8s-node1    Ready    <none>   25d   v1.18.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node1,kubernetes.io/os=linux
      k8s-node2    Ready    <none>   25d   v1.18.3   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2,kubernetes.io/os=linux,node=LAMP

      截取资源清单文件相关部分&#xff1a;

        volumes:
          - name: mysql-persistent-storage
            persistentVolumeClaim:
              claimName: mysql-pvc #对应到pvc的名字
        nodeSelector:
          node: LAMP

      这里说明一哈&#xff0c;比如kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2&#xff0c;这个是kubernetes.io/arch架构相关的&#xff0c;因此&#xff0c;这个是没法使用的。而我们新建的标签是kubernetes.io/os级别&#xff0c;操作系统类的&#xff0c;因此可以使用。

      &#xff08;2&#xff09;

      亲和性pod调度

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

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

      a&#xff09;

      NodeAffinity&#xff08;节点亲和性&#xff09;

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

      关系符operator的使用说明&#xff1a;

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

      例子1&#xff1a;

      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"]中的标签&#xff0c;实际没有设置此标签&#xff0c;所以会匹配失败
                - key: node
                  operator: In
                  values: ["web","dev"]


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

      [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>


      那么&#xff0c;现在就给node1设置标签值为web吧&#xff1a;

      kubectl label nodes k8s-node1 node=dev

      再次部署就会成功了。

      例子2&#xff1a;

      [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是我随便乱写的&#xff0c;自然是随便调度到了某个节点&#xff0c;如果确实有&#xff0c;那自然会调度成功。

      &#xff08;3&#xff09;

      PodAffinity&#xff08;Pod亲和性&#xff09;

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

      PodAffinity的可配置项&#xff1a;

      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 倾向权重&#xff0c;在范围1-100


      topologyKey用于指定调度时作用域,例如:
          如果指定为kubernetes.io/hostname&#xff0c;那就是以Node节点为区分范围
          如果指定为beta.kubernetes.io/os,则以Node节点的操作系统类型来区分
      这些都是node节点的标签在管理&#xff0c;例如有的集群有beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64
      也可能有arrch架构的操作系统
      这里weight权重的作用是&#xff0c;一个pod节点可以有多个软策略&#xff0c;每个软策略可以有不同的权重&#xff0c;然后根据权重由高到选择不同软策略&#xff0c;直到选中符合条件的节点。如果设置了多个软策略&#xff0c;权重价值就体现出来了。比如张三节点权重为4&#xff0c;先看看三节点符不符合选中条件&#xff0c;不符合&#xff0c;再看权重为3的李四节点符不符合选中条件...直到找到符合选中条件的节点。也就是说&#xff0c;权重按值高低来确定&#xff0c;越高越优先

      例子1&#xff1a;

      有一个A pod&#xff0c;此pod有如下pod标签并设置了nodename&#xff1a;

        labels:
          podenv: pro #设置标签

      硬策略B pod&#xff1a;

      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   #调度作用域&#xff0c;即如果匹配到&#xff0c;就调度到目标pod同一节点上

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

      关于PodAffinity的 preferredDuringSchedulingIgnoredDuringExecution&#xff08;软策略&#xff09;&#xff0c;这里不再演示&#xff0c;和硬策略基本一样。
      &#xff0c;

      &#xff08;4&#xff09;

      PodAntiAffinity&#xff08;Pod反亲和性&#xff09;

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

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

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

      那么&#xff0c;符合条件的Apod将不会和Bpod部署到一起。




      资源限制策略&#xff1a;

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

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

      以二进制安装的集群为例&#xff0c;在config文件内配置&#xff1a;

      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

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

      [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%&#xff0c;然后在重启node1节点上的kubelet会发生什么呢&#xff1f;

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

      未完待续@@@@@@&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://zskjohn.blog.csdn.net/article/details/126972770,作者:zsk_john,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:Linux time命令和read命令

      下一篇:8.WPF命令

      相关文章

      2025-01-17 09:15:58

      K 个关闭的灯泡。 N 个灯泡排成一行,编号从 1 到 N 。最初,所有灯泡都关闭。每天只打开一个灯泡,直到 N 天后所有灯泡都打开。

      K 个关闭的灯泡。 N 个灯泡排成一行,编号从 1 到 N 。最初,所有灯泡都关闭。每天只打开一个灯泡,直到 N 天后所有灯泡都打开。

      2025-01-17 09:15:58
      docker , golang , java , kubernetes , 数组
      2025-01-17 09:14:02

      课程表 III。 这里有 n 门不同的在线课程,按从 1 到 n 编号。

      课程表 III。 这里有 n 门不同的在线课程,按从 1 到 n 编号。

      2025-01-17 09:14:02
      docker , java , kubernetes , 算法
      2024-11-05 08:40:34

      python flask-caching模块缓存详解

      python flask-caching模块缓存详解

      2024-11-05 08:40:34
      docker , kubernetes , python
      2024-09-25 10:14:21

      云原生|kubernetes|部署MySQL一主多从复制集群(基于GTID的复制)

      云原生|kubernetes|部署MySQL一主多从复制集群(基于GTID的复制)

      2024-09-25 10:14:21
      kubernetes , mysql , 云原生
      2024-09-25 10:13:34

      CKAD 5. Pod Design (20%)练习题

      CKAD 5. Pod Design (20%)练习题

      2024-09-25 10:13:34
      kubernetes
      2024-07-08 09:55:58

      【云原生 • Kubernetes】一文深入理解资源编排 - yaml 文件

      Kubernetes 集群中对资源管理和资源对象的编排部署可以通过声明样式(yaml)文件的方式来解决,把需要对资源对象的操作都编辑到 yaml 格式的文件中,这种文件叫做 资源清单文件。通过 kubectl 命令可以直接使用资源清单文件实现对大量的资源对象进行编排和部署。

      2024-07-08 09:55:58
      yaml , 云原生
      2024-07-01 01:33:31

      Kubernetes 的Ingress的Rewrite annotations

      Kubernetes 的Ingress的Rewrite annotations

      2024-07-01 01:33:31
      kubernetes
      2024-07-01 01:33:31

      云原生|kubernetes|本地存储hostpath-provisioner部署以及无token密码方式登陆dashboard的部署

      kubernetes的存储类大家应该都知道,常用的有nfs-client-provisioner这样插件形式,其实还有一种本地存储类的插件,只是这个估计很冷门,生产上网络存储持久卷还是主流的,本文将介绍一种本地存储类插件。

      2024-07-01 01:33:31
      kubernetes , 云原生
      2024-07-01 01:32:44

      k8s安装yapi,yaml如何写?

      k8s安装yapi,yaml如何写?

      2024-07-01 01:32:44
      k8s , kubernetes , 服务器
      2024-06-28 06:18:39

      kubernetes中的Pod简述与实践

      kubernetes中的Pod简述与实践

      2024-06-28 06:18:39
      kubernetes , Pod
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5250656

      查看更多

      最新文章

      K 个关闭的灯泡。 N 个灯泡排成一行,编号从 1 到 N 。最初,所有灯泡都关闭。每天只打开一个灯泡,直到 N 天后所有灯泡都打开。

      2025-01-17 09:15:58

      CKAD 5. Pod Design (20%)练习题

      2024-09-25 10:13:34

      【云原生 • Kubernetes】一文深入理解资源编排 - yaml 文件

      2024-07-08 09:55:58

      Kubernetes 的Ingress的Rewrite annotations

      2024-07-01 01:33:31

      kubernetes dev client-go管理pvc

      2024-06-28 06:18:21

      k8s安装Jenkins

      2024-06-07 07:40:50

      查看更多

      热门文章

      Kubernetes----Kubernetes中通过指令式命令的方式方式管理对象

      2023-04-25 10:20:32

      k8s安装gitlab,yaml如何写?

      2023-06-07 07:34:28

      K8S 架构实现及工作原理

      2023-03-24 10:31:38

      云原生|kubernetes|kubernetes的etcd集群备份策略

      2023-05-16 09:44:57

      kubernets 【安全】-sysdig

      2023-03-23 06:16:59

      Kubernetes的 pod 重启策略、Pod状态、生命周期

      2023-05-05 10:12:58

      查看更多

      热门标签

      linux java python javascript 数组 前端 docker Linux vue 函数 shell git 节点 容器 示例
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      Kubernetes----Deployment控制器

      kubernetes-k9s一个基于Linux 终端的集群管理工具

      云原生(十八) | Kubernetes篇之Kubernetes(k8s)工作负载

      Kubernetes简介

      k8s HPA示例

      kubeadm升级K8s集群1.19.0到V1.20.0

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号