k8s调度策略

调度策略

binpack(装箱策略)

Binpacking策略(又称装箱问题)是一种优化算法,用于将物品有效地放入容器(或"箱子")中,使得所使用的容器数量最少,Kubernetes等集群管理系统中,Binpacking确保容器尽可能地被分配到少数几个节点上,从而最大限度地利用节点的资源,避免资源浪费。

Spread(分散策略)

Spread策略用于确保Pod在集群中的分布更加均匀,避免Pod过于集中在少数节点上。通过在多个节点之间分配Pod,Spread策略能够增强应用的高可用性,防止单一节点故障导致应用不可用。Kubernetes提供了一些具体的分散策略:

  • Pod Affinity/Anti-Affinity:用于定义Pod之间的亲和性或反亲和性规则,以控制Pod的分布。例如,可以要求某些Pod尽量分布在不同的节点上,或要求它们尽量集中在一起。
  • Topology Spread Constraints:这种约束允许用户定义如何在不同的拓扑域(如可用区、主机等)中分配Pod,目的是避免资源集中在少数区域内。

Affinity 和 Anti-Affinity(亲和性与反亲和性)

  • Node Affinity:让Pod倾向于或排斥调度到某些节点上。它通过节点标签来控制Pod的调度,例如,指定Pod只能调度到具有特定标签的节点上,或者要求Pod不能调度到特定标签的节点上。
  • Pod Affinity:Pod亲和性允许将Pod调度到与其他特定Pod在同一节点上,通常用于需要高效通信的Pod,减少跨节点的网络延迟。
  • Pod Anti-Affinity:Pod反亲和性用于确保Pod不会与特定的Pod调度到同一节点上,适用于需要隔离或避免资源冲突的场景。

配置示例

强制均匀调度

将所有 nginx 的 Pod 严格均匀打散调度到不同节点上,不同节点上 nginx 的副本数量最多只能相差 1 个,如果有节点因其它因素无法调度更多的 Pod (比如资源不足),那么就让剩余的 nginx 副本 Pending。

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: kubernetes.io/hostname
        whenUnsatisfiable: DoNotSchedule
        labelSelector:
        - matchLabels:
            app: nginx
      containers:
      - name: nginx
        image: nginx

尽量均匀调度

将 Pod 尽量均匀的打散调度到各个节点上,不强制(把 DoNotSchedule 改成 ScheduleAnyway)。

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: kubernetes.io/hostname
        whenUnsatisfiable: ScheduleAnyway
        labelSelector:
        - matchLabels:
            app: nginx
      containers:
      - name: nginx
        image: nginx
相关推荐
lichenyang4534 天前
Docker 学习笔记(四):Dockerfile,把项目打成自己的镜像
docker·容器
lichenyang4534 天前
Docker 学习笔记(三):Docker 网络、bridge、子网和容器互通
docker·容器
lichenyang4534 天前
Docker 学习笔记(二):docker run 的参数到底在控制什么?
docker·容器
运维开发故事7 天前
基于 Arthas 的多集群在线诊断系统设计与实现
kubernetes
Patrick_Wilson9 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
探索云原生9 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
云恒要逆袭9 天前
运行你的第一个Docker容器
后端·docker·容器
Java之美10 天前
一次k8s升级引发的DevicePlugin注册失败
云原生·kubernetes
程序员老赵11 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程