详情页标题前

阿里云容器服务ACK实现ECI Pod可用区打散以及亲和调度-云淘科技

详情页1

高可用以及高性能是分布式任务执行过程中的重要要求。在ACK Serverless集群Pro版中,您可以通过Kubernetes原生调度语义实现分布式任务的跨可用区打散,以达到高可用区部署的要求,或者通过Kubernetes原生调度语义实现分布式任务在指定可用区中的亲和性部署,以达到高性能部署的要求。本文介绍如何实现ECI Pod可用区打散以及亲和调度

重要

本文功能目前处于白名单测试阶段,请提交工单后使用。

索引

  • 前提条件

  • 注意事项

  • 相关概念

  • 实现ECI Pod可用区打散以及亲和调度

    • 示例一:通过拓扑分布约束(Topology Spread Constraints)实现跨可用区打散

    • 示例二:通过nodeAffinity和podAffinity实现可用区亲和

  • ECI严格拓扑打散功能介绍

前提条件

  • 已安装ACK Serverless集群Pro版,且集群版本为1.22及以上。详细信息,请参见创建ASK集群。

  • 已安装kube-scheduler组件。详细信息,请参见kube-scheduler。

  • 调度ECI Pod时,已确保您当前期望调度的目标可用区vSwitch已在ECI Profile中完成配置。

  • 仅当Pod中带有Node亲和nodeAffinity、Pod亲和podAffinity和拓扑打散topologySpreadConstraints字段或存在匹配的ResourcePolicy时才会启用该功能。

注意事项

  • 调度ECI Pod时,目前仅支持设置topologyKeytopology.kubernetes.io/zone的用法。

  • 调度ECI Pod时,不支持通过Annotation的方式设定ECI Pod的vSwitch顺序。当Pod申明了vSwitch顺序时,该功能将被自动禁用。

  • 调度ECI Pod不支持与FastFailed模式同时使用。当Pod申明了FastFailed模式时,该功能将被自动禁用。

相关概念

  • 关于打散部署以及亲和部署的详细说明,请参见官方文档拓扑分布约束和将Pod指派给节点。

  • NodeAffinity

  • PodAffinity

  • maxSkew

实现ECI Pod可用区打散以及亲和调度

下文将在1.22版本的ACK Serverless集群Pro版中演示ECI Pod可用区打散以及亲和调度功能。

示例一:通过拓扑分布约束(Topology Spread Constraints)实现跨可用区打散

  1. 在工作负载申明中增加拓扑分布约束。

    Pod的Spec字段中或Deployment、Job等工作负载的PodTemplate的Spec字段中,可以通过以下方式申明一个拓扑分布约束。

      topologySpreadConstraints:
        - maxSkew: 
          minDomains:  # 可选,从v1.25开始成为Beta。
          topologyKey: 
          whenUnsatisfiable: 
          labelSelector: 
          matchLabelKeys:  # 可选,从v1.27开始成为Beta。
          nodeAffinityPolicy: [Honor|Ignore] # 可选,从v1.26开始成为Beta。
          nodeTaintsPolicy: [Honor|Ignore] # 可选,从v1.26开始成为Beta。
    

    本示例将创建一个在多个可用区上均匀分布的Deployment。关于参数的详细信息,请参见topologySpreadConstraints字段。以下为该Deployment的YAML文件。

    展开查看YAML文件

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: with-pod-topology-spread
      labels:
        app: with-pod-topology-spread
    spec:
      replicas: 10
      selector:
        matchLabels:
          app: with-pod-topology-spread
      template:
        metadata:
          labels:
            app: with-pod-topology-spread
        spec:
          topologySpreadConstraints:
            - maxSkew: 1
              topologyKey: topology.kubernetes.io/zone
              whenUnsatisfiable: DoNotSchedule
              labelSelector:
                matchLabels:
                  app: with-pod-topology-spread
          containers:
          - name: with-pod-topology-spread
            image: registry.k8s.io/pause:2.0
            resources:
              requests:
                cpu: "1"
                memory: "256Mi"
  2. 创建工作负载。

    将上面的代码保存为deployment.yaml,并执行以下命令将Deployment提交到集群中。

    kubectl apply -f deployment.yaml
  3. 验证工作负载调度结果。

    • 通过以下命令查看生产出的Pod所在的节点。

      kubectl get po -lapp=with-pod-topology-spread -ocustom-columns=NAME:.metadata.name,NODE:.spec.nodeName --no-headers | grep -v ""
    • 通过以下命令查看生产出的Pod在各个可用区中的数量。

      kubectl get po -lapp=with-pod-topology-spread -ocustom-columns=NODE:.spec.nodeName --no-headers | grep -v "" | xargs -I {} kubectl get no {} -ojson | jq '.metadata.labels["topology.kubernetes.io/zone"]' | sort | uniq -c
  4. 示例二:通过nodeAffinity和podAffinity实现可用区亲和

    1. 在工作负载申明中增加亲和性约束。

      本示例将创建在单个可用区上聚集分布的Deployment。关于参数的详细信息,请参见节点亲和性。以下为该Deployment的YAML文件。

      展开查看YAML文件

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: with-affinity
        labels:
          app: with-affinity
      spec:
        replicas: 3
        selector:
          matchLabels:
            app: with-affinity
        template:
          metadata:
            labels:
              app: with-affinity
          spec:
            affinity:
              podAffinity:
                requiredDuringSchedulingIgnoredDuringExecution:
                - labelSelector:
                    matchExpressions:
                    - key: app
                      operator: In
                      values:
                      - with-affinity
                  topologyKey: topology.kubernetes.io/zone
            containers:
            - name: with-affinity
              image: registry.k8s.io/pause:2.0

      若您希望指定可用区进行部署,可以将示例中的podAffinity删去,在nodeAffinity添加如下约束。下方约束表明Pod必须在可用区cn-beijing-a上进行部署。

      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: topology.kubernetes.io/zone
            operator: In
            values:
            - cn-beijing-a

      以下为nodeAffinity的完整示例,表明Pod必须在可用区cn-beijing-a上进行部署。

      展开查看YAML详情

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: with-affinity
        labels:
          app: with-affinity
      spec:
        replicas: 3
        selector:
          matchLabels:
            app: with-affinity
        template:
          metadata:
            labels:
              app: with-affinity
          spec:
            affinity:
              nodeAffinity:
                requiredDuringSchedulingIgnoredDuringExecution:
                  nodeSelectorTerms:
                  - matchExpressions:
                    - key: topology.kubernetes.io/zone
                      operator: In
                      values:
                      - cn-beijing-a
            containers:
            - name: with-affinity
              image: registry.k8s.io/pause:2.0
    2. 创建工作负载。

      将上面的代码保存为deployment.yaml,并执行以下命令将Deployment提交到集群中。

      kubectl apply -f deployment.yaml
    3. 验证工作负载调度结果。

      • 通过以下命令查看生产出的Pod所在的节点。

        kubectl get po -lapp=with-affinity -ocustom-columns=NAME:.metadata.name,NODE:.spec.nodeName --no-headers | grep -v ""
      • 通过以下命令查看生产出的Pod在各个可用区中的数量。

        kubectl get po -lapp=with-affinity -ocustom-columns=NODE:.spec.nodeName --no-headers | grep -v "" | xargs -I {} kubectl get no {} -ojson | jq '.metadata.labels["topology.kubernetes.io/zone"]' | sort | uniq -c

    ECI严格拓扑打散功能介绍

    在保持默认状态不变的情况下,当配置了强制打散约束时,Scheduler会将所有Pod均匀放置到所有可用区上,但并不考虑ECI Pod的生产结果。如下图所示,假设将打散功能的maxSkew设置为1。关于maxSkew,请参见maxSkew。阿里云容器服务ACK实现ECI Pod可用区打散以及亲和调度-云淘科技

    此时若可用区B和C中生产ECI Pod失败,则可用区A上会放置2个ECI Pod,其他两个可用区没有ECI Pod,从而破坏打散功能的maxSkew约束。

    当严格拓扑打散功能开启后,在ACK Serverless集群Pro版中,调度器将严格保证Pod的强制打散需求得到满足。Scheduler会在可用区A、B、C上各放置1个Pod,剩下的Pod将处于Pending状态,等待现有Pod生产,如下图所示。阿里云容器服务ACK实现ECI Pod可用区打散以及亲和调度-云淘科技

    当PodA1生产成功后,Pending状态的Pod将继续Pending,这是由于可用区B以及可用区C上的ECI Pod仍然可能生产失败,Pod放置于任意可用区仍然可能导致生产结束后破坏maxSkew约束。当PodB1生产成功后,Scheduler将会放置一个Pod在可用区C。如下图所示,其中橙色背景的Pod为生产完成的Pod。阿里云容器服务ACK实现ECI Pod可用区打散以及亲和调度-云淘科技

    若您不需要严格拓扑打散功能,请将拓扑打散约束中的调度条件whenUnsatisfiable设置为ScheduleAnyway。详细信息,请参见分布约束定义。

    相关文档

    开启ACK Serverless集群虚拟节点调度策略

    内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家

    阿里云企业补贴进行中: 马上申请

    腾讯云限时活动1折起,即将结束: 马上收藏

    同尘科技为腾讯云授权服务中心。

    购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠

    转转请注明出处:https://www.yunxiaoer.com/170840.html

    (0)
    上一篇 2023年12月10日 下午1:40
    下一篇 2023年12月10日
    详情页2

    相关推荐

    • 阿里云负载均衡NLB实例概述-云淘科技

      网络型负载均衡NLB(Network Load Balancer)实例接收来自客户端的请求,并按照监听规则将请求分发至后端服务器。使用NLB服务,您需要创建一个NLB实例,在实例中添加监听和后端服务器。 实例状态 实例状态 状态含义 锁定类型 是否允许删除 是否允许变配 运行中 实例正常 不涉及 取决于删除保护功能是否开启。 开启删除保护:否 关闭删除保护:…

      2023年12月10日
    • 阿里云ECS云服务器ModifyReservedInstances-云淘科技

      调用ModifyReservedInstances拆分、合并或修改预留实例券。 接口描述 调用该接口前,请阅读以下注意事项: 预留实例券的使用限制,请参见预留实例券概述中使用限制章节。 如果您需要拆分预留实例券,请先了解拆分预留实例券功能存在的限制,详情请参见拆分预留实例券。 如果您需要合并预留实例券,请先了解合并预留实例券功能存在的限制,详情请参见合并预留…

      阿里云服务器 2023年12月9日
    • 阿里云ECS云服务器地域和可用区-云淘科技

      本文介绍在运用网络时需要了解的地域、可用区等位置信息。 地域 地域指数据中心所在的地理区域,通常按照数据中心所在的城市划分。例如,华北1(青岛)地域表示数据中心所在的城市是青岛。 可用区 在同一地域内,不同可用区拥有不同的电力和网络。可用区与可用区之间内网互通。同一可用区内实例之间的网络延时更小,其用户访问速度更快。例如,华北1(青岛)地域支持2个可用区,包…

      2023年12月9日
    • 信息流广告,信息流部分建议宽度830px,只针对默认列表样式,顺序随机
    • 阿里云负载均衡StartShiftLoadBalancerZones – 把可用区的EIP/VIP从域名解析中摘除-云淘科技

      调用StartShiftLoadBalancerZones接口将可用区对应的EIP/VIP从域名解析中摘除。 接口说明 仅支持固定IP模式的ALB实例。当前ALB实例active状态的可用区数量为1时,不支持移除实例可用区。 调试 您可以在OpenAPI Explorer中直接运行该接口,免去您计算签名的困扰。运行成功后,OpenAPI Explorer可以…

      阿里云负载均衡 2023年12月10日
    • 阿里云负载均衡DescribeZones – 查询可用区-云淘科技

      查询网络型负载均衡中一个地域下的可用区列表。 调试 您可以在OpenAPI Explorer中直接运行该接口,免去您计算签名的困扰。运行成功后,OpenAPI Explorer可以自动生成SDK代码示例。 调试调试授权信息当前API暂无授权信息透出。请求参数名称类型必填描述示例值ServiceCodestring否云产品的ServiceCode,仅取值:nl…

      阿里云负载均衡 2023年12月10日

    联系我们

    400-800-8888

    在线咨询: QQ交谈

    邮件:admin@example.com

    工作时间:周一至周五,9:30-18:30,节假日休息

    关注微信
    本站为广大会员提供阿里云、腾讯云、华为云、百度云等一线大厂的购买,续费优惠,保证底价,买贵退差。