当前位置: 首页 > news >正文

【博客589】K8s Topology Spread Constraints

K8s Topology Spread Constraints

场景

你可以使用 拓扑分布约束(Topology Spread Constraints) 来控制 Pod 在集群内故障域之间的分布, 例如区域(Region)、可用区(Zone)、节点和其他用户自定义拓扑域。 这样做有助于实现高可用并提升资源利用率。

用法

适用于:

deployment,statefulset,daemonset

格式:

---
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、结合NodeSelector/NodeAffinity一起使用:

设有一个集群,其节点分别用"env = prod”,“env = staging"和"env = qa"标记,现在您想将Pod均匀地跨区域放置到"qa"环境中
在这里插入图片描述

2、高阶多拓扑分布约束

我们希望同时将Pod调度到具有2个需求的集群中:Pod跨区域均匀放置和Pod跨节点均匀放置
在这里插入图片描述

    spec:
      topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: topology.kubernetes.io/zone
        whenUnsatisfiable: ScheduleAnyway
        labelSelector:
        - matchLabels:
            app: nginx
      - maxSkew: 1
        topologyKey: kubernetes.io/hostname
        whenUnsatisfiable: ScheduleAnyway
        labelSelector:
        - matchLabels:
            app: nginx

3、将 Pod 最大程度上均匀的打散调度到各个节点上

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  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

配置解析:

topologyKey: 与 podAntiAffinity 中配置类似。
labelSelector: 与 podAntiAffinity 中配置类似,只是这里可以支持选中多组 pod 的 label。
maxSkew: 必须是大于零的整数,表示能容忍不同拓扑域中 Pod 数量差异的最大值。这里的 1 意味着只允许相差 1 个 Pod。
whenUnsatisfiable: 指示不满足条件时如何处理。DoNotSchedule 不调度 (保持 Pending),类似强反亲和;ScheduleAnyway 表示要调度,类似弱反亲和;

以上配置连起来解释:

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

4、如果要在所有节点中严格打散,通常不太可取,可以加下 nodeAffinity,只在部分资源充足的节点严格打散:

    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: io
                operator: In
                values:
                - high
      topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: kubernetes.io/hostname
        whenUnsatisfiable: DoNotSchedule
        labelSelector:
        - matchLabels:
            app: nginx

相关文章:

  • 做网站的设计文档怎么做/各大搜索引擎入口
  • 天津网站建立/故事型软文广告
  • 做网站用域名不备案怎么弄/百度框架户开户渠道代理
  • wordpress搜索安全/怎么弄属于自己的网站
  • wordpress关闭主题/友情链接什么意思
  • 网站运营商查询/广州seo黑帽培训
  • 四、template模板
  • 【Java|golang】1813. 句子相似性 III
  • 在linux安装redis
  • 使用react-bmapgl绘制区域并判断是否重叠
  • 总结 62 种在深度学习中的数据增强方式
  • 【BP靶场portswigger-客户端14】点击劫持-5个实验(全)
  • linux备份压缩
  • Keil中 Program Size
  • 初步学习MOOS-ivp
  • 【Chrome谷歌浏览器——帮助如何设置无头浏览器】
  • 【状态设计优化DP】Atcoder Beginner Contest E - Work or Rest
  • Java的长整型Long/long后面的数字什么情况下必须加L?