K8S pod 均匀调度分配 —— 筑梦之路

这篇具有很好参考价值的文章主要介绍了K8S pod 均匀调度分配 —— 筑梦之路。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

pod调度简介

  在 k8s 中 通过 kube-scheduler 组件来实现 pod 的调度,所谓调度,即把需要创建的 pod 放到 合适的 node 上,大概流程为,通过对应的 调度算法 和 调度策略,为待调度的 pod 列表中的 pod 选择一个最合适的 Node,然后目标节点上的 kubelet 通过 watch 接口监听到 kube-schedule 产生的 Pod 绑定事件,通过 APIService 获取对应的 Pod 清单,下载 image 并且启动容器。

这里具体的 调度算法 大体上分两步,筛选出候选节点,确定最优节点确定最优节点涉及节点打分等。

常见的 Pod 的 调度策略 有 选择器、指定节点、主机亲和性方式,同时需要考虑节点的 coedondrain标记,今天和小伙伴分享的是 调度策略的一种, 即通过 Pod拓扑分布约束 ,用来实现 跨集群节点均匀调度分布Pod

为什么需要跨集群节点 均匀调度分布 Pod ? 

   我们知道在 k8s 中 ,如果只是希望每个节点均匀调度分布一个 pod,那么可以利用 DaemonSet 来实现。如果多个,就需要 pod 的拓扑分布约束均匀调度 Pod ,实现在集群中均匀分布 Pod,可以尽可能的利用 节点的超售,Pod 的超用,以实现高可用性和高效的集群资源利用。

  k8s 中通过 Pod 拓扑分布约束   (PodTopologySpread)   来实现均匀调度 pod。这一特性从 v1.19 以后达到稳定状态。在 v1.25,v1.1.26 的版本中添加的部分属性。

需要说明的是,这里的 均匀调度 pod 不是说 只有对当前需要调度的 pod 在 工作节点发生均匀调度,不考虑当前节点上之前存在的 pod , 而是基于 工作节点的 均匀调度。即所谓均匀调度分布是基于工作节点的。虽然 pod 的拓扑分布约束是定义在 pod 上的。

如何实现跨节点均匀分布 Pod

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  # 配置一个拓扑分布约束
  topologySpreadConstraints:
    - maxSkew: <integer>
      minDomains: <integer> # 可选;自从 v1.25 开始成为 Beta
      topologyKey: <string>
      whenUnsatisfiable: <string>
      labelSelector: <object>
      matchLabelKeys: <list> # 可选;自从 v1.25 开始成为 Alpha
      nodeAffinityPolicy: [Honor|Ignore] # 可选;自从 v1.26 开始成为 Beta
      nodeTaintsPolicy: [Honor|Ignore] # 可选;自从 v1.26 开始成为 Beta
  ### 其他 Pod 字段置于此处

实例1:

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  # 配置一个拓扑分布约束
  topologySpreadConstraints:
    - maxSkew: 1 # 以绝对均匀的方式分配 POD 即 pod 在节点分布的差值不能超过的值。
      topologyKey: kubernetes.io/hostname #使用主机名这个标签作为拓扑域
      whenUnsatisfiable: ScheduleAnyway #始终调度 pod,即使它不能满足 pod 的均匀分布
      labelSelector: <object> #作用于匹配这个选择器的 Pod
  ### 其他 Pod 字段置于此处
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test
spec:
  replicas: 10
  template:
    spec:
      topologySpreadConstraints:
        - maxSkew: 1
          topologyKey: kubernetes.io/hostname  
          whenUnsatisfiable: ScheduleAnyway
          labelSelector:
            matchLabels:
              app: test
      containers:
      - name: pause
        image: registry.aliyuncs.com/google_containers/pause:3.5

 需要注意的是,缩减 Deployment 并不能保证均匀分布,并可能导致 Pod 分布不平衡。

maxSkew :描述这些 Pod 可能被均匀分布的程度。你必须指定此字段且该数值必须大于零。 其语义将随着 whenUnsatisfiable 的值发生变化:简单来讲,就是如果为均匀分布,那么两个节点之前的 pod 差值最大可以为多大。

  • 如果你选择 whenUnsatisfiable: DoNotSchedule,则 maxSkew 定义目标拓扑中匹配 Pod 的数量与 全局最小值之间的最大允许差值。例如,如果你有 3 个可用区,分别有 2、2 和 1 个匹配的 Pod,则 MaxSkew 设为 1, 且全局最小值为 1。

  • 如果你选择 whenUnsatisfiable: ScheduleAnyway,则该调度器会更为偏向能够降低偏差值的拓扑域。

topologyKey :是节点标签的键。如果节点使用此键标记并且具有相同的标签值, 则将这些节点视为处于同一拓扑域中。我们将拓扑域中(即键值对)的每个实例称为一个域。 调度器将尝试在每个拓扑域中放置数量均衡的 Pod。 另外,我们将符合条件的域定义为其节点满足 nodeAffinityPolicy 和 nodeTaintsPolicy 要求的域。当 topologyKey 的值为 none 的时候。

whenUnsatisfiable: 指示如果 Pod 不满足分布约束时如何处理:

  • DoNotSchedule(默认)告诉调度器不要调度。

  • ScheduleAnyway 告诉调度器仍然继续调度,只是根据如何能将偏差最小化来对节点进行排序。

labelSelector: 用于查找匹配的 Pod。匹配此标签的 Pod 将被统计,以确定相应拓扑域中 Pod 的数量

当 Pod 定义了不止一个 topologySpreadConstraint,这些约束之间是逻辑与的关系。 kube-scheduler 会为新的 Pod 寻找一个能够满足所有约束的节点。

多个拓扑分布约束

在这之前需要做一些准备工作,在每个工作节点上在打一个标签 disktype=node-group1

添加一个新的 Pod ,添加了两个拓扑分布约束,要求这个 pod 即在 topologyKey: kubernetes.io/hostname 的拓扑域,同时在 topologyKey: disktype 的拓扑域

kind: Pod
apiVersion: v1
metadata:
  name: mypod
  labels:
    app: test
spec:
  topologySpreadConstraints:
  - maxSkew: 1
    topologyKey: kubernetes.io/hostname
    whenUnsatisfiable: DoNotSchedule
    labelSelector:
      matchLabels:
        app: test
  - maxSkew: 1
    topologyKey: disktype
    whenUnsatisfiable: DoNotSchedule
    labelSelector:
      matchLabels:
        app: test
  containers:
  - name: pause
    image: registry.aliyuncs.com/google_containers/pause:3.5

有冲突的拓扑分布约束

如果所有节点都不满足 pod 的 拓扑分布约束,当前 pod 就会调度失败。下面为创建了一个新的补丁文件,修改副本数为 5,使用 kubernetes.io/hostname 作为拓扑域

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: test
  name: test
  namespace: test-topo-namespace
spec:
  replicas: 5
  selector:
    matchLabels:
      app: test
  template:
    metadata:
      labels:
        app: test
    spec:
      containers:
      - image: registry.aliyuncs.com/google_containers/pause:3.5
        name: pause
      topologySpreadConstraints:
      - labelSelector:
          matchLabels:
            app: test
        maxSkew: 1
        topologyKey: kubernetes.io/hostname
        whenUnsatisfiable: DoNotSchedule

 当前 whenUnsatisfiable: DoNotSchedule,即不满足约束时,不发生调度, master 有污点,默认不发生调度,所以当 副本数为 5 的时候,工作节点各调度一个,剩下的一个 pod 调度到哪里都会违反 maxSkew: 1 ,所以发生 pending 。

这里主要学习记录下如何尽可能实现pod在节点上的均匀调度分配。

参考资料

https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/pod-priority-preemption/

https://medium.com/geekculture/kubernetes-distributing-pods-evenly-across-cluster-c6bdc9b49699文章来源地址https://www.toymoban.com/news/detail-590610.html

到了这里,关于K8S pod 均匀调度分配 —— 筑梦之路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • K8S集群etcd 某个节点数据不一致如何修复 —— 筑梦之路

      二进制方式安装的k8s集群,etcd集群有3个节点,某天有一台机器hang住了,无法远程ssh登陆,于是被管理员直接重启了,重启后发现k8s集群删除一个deployment应用,多次刷新一会有,一会没有,于是在3个节点上执行etcd命令去查询该数据,发现被重启的节点上仍存在删除的该应

    2024年02月05日
    浏览(11)
  • K8S 集群应用配置coredns实现访问内网域名 —— 筑梦之路

    问题: 在内网环境中,服务器不能连接互联网,某些服务直接使用ip访问又不方便,于是直接在hosts中配置域名解析,而K8S集群中的应用需要访问这些服务,pod容器内却不能解析,此时该怎么解决呢? 解决方法: 第一种方法:内网自建DNS服务,每台主机DNS都指向该dnsf服务器

    2024年02月15日
    浏览(14)
  • K8S学习指南(10)-k8s中为pod分配CPU和内存资源

    Kubernetes(简称K8s)是一种开源的容器编排平台,广泛用于构建、部署和管理容器化应用。在Kubernetes中,Pod是最小的可部署单元,而资源分配是确保Pod正常运行的关键因素之一。本文将深入探讨如何在Kubernetes中为Pod分配CPU和内存资源,并提供详细的示例。 在容器化环境中,多

    2024年02月04日
    浏览(16)
  • kubernetes(k8s)为容器和 Pod 分配内存资源

    kubernetes(k8s)为容器和 Pod 分配内存资源

    展示如何将内存请求(request)和内存限制(limit)分配给一个容器。 我们保障容器拥有它请求数量的内存,但不允许使用超过限制数量的内存。 创建新的命名空间 编辑yaml文件 配置文件的 args 部分提供了容器启动时的参数。 “–vm-bytes”, “150M” 参数告知容器尝试分配 15

    2024年02月15日
    浏览(48)
  • 【k8s】pod调度——亲和,反亲和,污点,容忍

    【k8s】pod调度——亲和,反亲和,污点,容忍

    官方网址:https://kubernetes.io/zh/docs/concepts/scheduling-eviction/assign-pod-node/ pod.spec.nodeAffinity ●preferredDuringSchedulingIgnoredDuringExecution:软策略  p开头 ●requiredDuringSchedulingIgnoredDuringExecution:硬策略  r开头 pod.spec.affinity.podAffinity/podAntiAffinity ●preferredDuringSchedulingIgnoredDuringExecution:软策

    2024年02月05日
    浏览(17)
  • 【K8s】什么是Pod?Pod的调度与控制器

    【K8s】什么是Pod?Pod的调度与控制器

    每个Pod中都可以包含一个或者多个容器 ,这些容器可以分为两类: 1) 用户容器 :用户程序所在的容器,数量可多可少 2) 根容器 :Pause容器,由Kubernetes创建,这是每个Pod都会有的一个根容器,它的作用有两个: 可以以它为依据,评估整个Pod的健康状态 可以在根容器上设

    2024年02月06日
    浏览(18)
  • K8s进阶之路-Pod的生命周期

    K8s进阶之路-Pod的生命周期

    Pod创建过程: 首先创建一个pod,然后创建一个API Server 和 Etcd【把创建出来的信息存储在etcd中】 然后创建 Scheduler,监控API Server是否有新的Pod,如果有的话,会通过调度算法,把pod调度某个node上 在node节点,会通过 kubelet -- apiserver 读取etcd 拿到分配在当前node节点上的pod,然后

    2024年02月20日
    浏览(11)
  • 学习笔记十四:K8S最小调度单元POD概述

    学习笔记十四:K8S最小调度单元POD概述

    K8s官方文档:https://kubernetes.io/ K8s中文官方文档: https://kubernetes.io/zh/ K8s Github地址:https://github.com/kubernetes/kubernetes Pod资源对应的官方文档:https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/ Pod是Kubernetes中的最小调度单元,k8s是通过定义一个Pod的资源,然后在Pod里面运行容器,容器

    2024年02月12日
    浏览(17)
  • 22-k8s中pod的调度-亲和性affinity

    22-k8s中pod的调度-亲和性affinity

            在k8s当中,“亲和性”分为三种,节点亲和性、pod亲和性、pod反亲和性; 亲和性分类 名称 解释说明 nodeAffinity 节点亲和性 通过【节点】标签匹配,用于控制pod调度到哪些node节点上,以及不能调度到哪些node节点上;(主角node节点) podAffinity pod亲和性 通过【节点+

    2024年02月20日
    浏览(17)
  • K8S之运用污点、容忍度设置Pod的调度约束

    K8S之运用污点、容忍度设置Pod的调度约束

    taints 是键值数据, 用在节点上 ,定义污点; tolerations 是键值数据, 用在pod上 ,定义容忍度,能容忍哪些污点。 污点 是定义在k8s集群的节点上的键值属性数据,可以决定拒绝那些pod。 给了Node选则的主动权,给Node打个污点, 不容忍 的Pod就调度不上来。 现象:刚部署好的

    2024年02月19日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包