节点池部署集最佳实践

更新时间:
复制 MD 格式

部署集是控制ECS实例分布的策略,该策略将ECS实例分散部署在不同的物理服务器上,提升业务的高可用性和底层容灾能力。通过为节点池指定部署集,能够保证节点池弹出的ECS实例不会分布于同一物理机上,并通过亲和性配置,使您的应用对底层的节点拓扑进行感知,使其均匀地分布在不同节点上,保证应用的容灾能力和高可用性。

前提条件

已创建部署集。具体操作,请参见创建部署集

背景信息

在同一个可用区下,为了保证高可用性,您通常会选择跨主机部署服务。但当一台物理机出现问题时,会影响到应用的所有副本。为了解决这个问题,ECS提供了部署集功能。部署集内的所有ECS实例会在指定地域内严格分散在不同的物理服务器上,满足服务相互隔离的应用架构,大幅降低服务不可用的几率。关于部署集的更多信息,请参见部署集

使用限制

集群中功能使用须知

  • 部署集仅支持ACK托管集群ACK专有集群

  • 部署集仅在新建节点池时支持指定,不支持为已有节点池开启。每个节点池仅支持绑定一个部署集。

  • 部署集不支持手动添加或移除节点。您可以通过扩缩容节点池的操作,调整部署集中的节点数。具体操作,请参见创建和管理节点池

  • 开启部署集功能后,不支持创建抢占式实例。

部署集配额与规格限制

  • 部署集配额限制

    • 节点池部署集默认基于高可用策略实现。高可用策略下,在部署集内创建ECS实例时,一个可用区内最多能创建20ECS实例,一个阿里云地域下能创建的ECS实例数量为20*可用区数量。请确保部署集内ECS实例配额充足,且所需机型库存充足。更多信息,请参见部署集

      一个部署集内能容纳的实例数量不支持提升。但如果您需要提高当前账户可拥有的部署集最大数量,请前往配额平台申请。关于部署集使用限制及配额的更多信息,请参见部署集使用限制

    • 在部署集内创建ECS实例失败,或重启按量付费ECS实例(节省停机模式)失败,可能是因为地域内实例资源库存不足,您可以等待一段时间后重试创建实例或重启实例。

  • 实例规格族限制:大部分6代及以上实例支持高可用、部署集组高可用及网络低时延策略部署集。

    不同部署策略仅支持创建特定的实例规格族:

    具体支持的规格族,以DescribeDeploymentSetSupportedInstanceTypeFamily接口返回结果为准。

    部署策略

    支持的实例规格族

    高可用策略和部署集组高可用策略

    • g9a、g9ae、g9i、g8a、g8i、g8ine、g8ise、g8y、g7、g7a、g7h、g7ne、g7nex、g7se、g7t、g6、g6a、g6e、g6h、g5、g5ne

    • c9a、c9ae、c9i、c8a、c8i、c8ine、c8y、c7、c7a、c7nex、c7se、c7t、c6、c6a、c6e、c5

    • r9a、r9ae、r9i、r8a、r8i、r8y、r7、r7a、r7se、r7t、r6、r6a、r6e、r5

    • hfc9i、hfg9i、hfr9i、hfc8i、hfg8i、hfr8i、hfc7、hfg7、hfr7、hfc6、hfg6、hfr6、hfc5、hfg5

    • ebmc9i、ebmg9a、ebmg9i、ebmr9i、ebmc8a、ebmc8i、ebmc8y、ebmg8a、ebmg8i、ebmg8y、ebmr8a、ebmr8y、ebmc7、ebmc7a、ebmg7、ebmg7a、ebmg7se、ebmhfc7、ebmhfg7、ebmhfr7、ebmr7、ebmr7a、ebmg5

    • i5、i5g、i5ge、ic5、i4、i4g、i4r、i3、i3g、i2、i2g、i2gne、i2ne

    • gn6i

    • d3c、d3s、d2c、d2s、d1ne

    • re6、re6p、s6、t6、e4、mn4、n4、re4、xn4、sn2ne、u2a、u2i、se1、se1ne、sn1ne、u1、e

    网络低时延策略

    • g9a、g9ae、g9i、g8a、g8ae、g8i、g8ise、g8y、g7、g5ne

    • c9a、c9ae、c9i、c8a、c8ae、c8i、c8ine、c8y、c7、c7nex

    • r9a、r9ae、r9i、r8a、r8ae、r8i、r8y、r7

    • hfc9i、hfg9i、hfr9i、hfc8i、hfg8i、hfr8i

    • ebmc9i、ebmg9a、ebmg9i、ebmr9i、ebmc8a、ebmc8i、ebmc8y、ebmg8a、ebmg8i、ebmg8y、ebmgn8v、ebmr8a、ebmr8y、ebmc7、ebmc7a、ebmg7、ebmg7a、ebmg7se、ebmgn7ex、ebmhfc7、ebmhfg7、ebmhfr7、ebmr7、ebmr7a

    • i5、i5g、i5ge、i4

    • gn8v

    • hpc8ae、hpc8i、hpc7ip、hpc6id、u2a、u2i

通过控制台为节点池指定部署集

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点池

  3. 节点池页面,单击创建节点池,然后在创建节点池对话框,配置参数,选择部署集,然后单击确认配置

    有关节点池配置项的详细说明,请参见创建和管理节点池。选择部署集后,节点池内最大节点数会受限,请谨慎选择。部署集默认支持节点上限为 20 × 可用区数量,请确保部署集内配额充足,避免节点弹出失败。

使用案例

在同一个节点池中,同一个工作负载的Pod之间反亲和,一个节点只能调度一个Pod

本示例介绍如何将Deployment中的三个Pod副本调度到三个不同节点上,操作步骤如下。

  1. 创建节点池包含三个节点,并为节点池指定部署集ID。具体操作,请参见通过控制台为节点池指定部署集

    创建节点池完成后,在节点池页面,单击目标节点池,然后在节点管理页签,可以查看到成功创建的三个节点。创建完成后,在集群节点管理页签可确认三个节点均处于就绪状态,且分布在不同可用区(可用区I、可用区J),符合部署集的分散策略。

    登录ECS控制台,在左侧导航栏选择部署与弹性 > 部署集,在部署集页面,可以查看到节点池中的三个节点均属于所选的部署集。在部署集详情页的实例列表中,可以看到三个实例分布在可用区 I 和可用区 J,状态均为运行中

  2. 使用以下示例内容,配置应用YAML。

    通过反亲和性配置三个应用Pod,将不同的Pod调度到节点池不同节点上。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx
          labels:
            app: nginx
        spec:
          affinity:
            podAntiAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:  # 设置调度策略。
              - labelSelector:
                  matchExpressions:
                  - key: app
                    operator: In
                    values:
                    - nginx
                topologyKey: kubernetes.io/hostname
          nodeSelector:
              alibabacloud.com/nodepool-id: <nodepool-id>  # 指定节点池ID。
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            resources:
              limits:
                cpu: 1
              requests:
                cpu: 1

    执行结果

    无状态页面,单击目标Deployment,在容器组页签,可以看到三个不同的Pod调度到节点池不同节点上。三个 nginx Pod 均已成功创建并处于 Running 状态,分别被调度到不同节点(cn-hangzhou.10.16.0.6cn-hangzhou.10.240.56.81cn-hangzhou.10.240.56.82),验证了反亲和性调度策略生效。

在同一个节点池中,同一个工作负载的Pod之间按照可用区和节点均匀调度打散

  1. 创建节点池包含四个节点,为节点池指定部署集ID,并选择多可用区的VSwitch。具体操作,请参见通过控制台为节点池指定部署集

    创建完成后,在节点池页面,单击目标节点池,然后在节点管理页签可以查看到四个节点,并选择了四个可用区。根据ESS的均匀分布策略,弹出的ECS实例将分布在不同的四个可用区,且均加入了部署集。在节点管理页签下,可查看节点分别分布在可用区K、H、I、J,状态均为就绪,规格为 ecs.g5ne.xlarge(4 vCPU 16 GiB,按量付费)。

    登录ECS控制台,在左侧导航栏选择部署与弹性 > 部署集,在部署集页面,可以查看到节点池中的四个节点均属于所选的部署集。

  2. 使用以下示例内容,配置应用YAML。

    通过Pod拓扑分布约束,将同一个应用的Pod之间按照可用区和节点均匀调度打散。更多信息,请参见Pod 拓扑分布约束

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      replicas: 4
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx
          labels:
            app: nginx
        spec:
          topologySpreadConstraints:
            - maxSkew: 1
              topologyKey: kubernetes.io/hostname
              whenUnsatisfiable: DoNotSchedule
              labelSelector:
                matchLabels:
                  app: nginx
            - maxSkew: 1
              topologyKey: topology.kubernetes.io/zone
              whenUnsatisfiable: DoNotSchedule
              labelSelector:
                matchLabels:
                  app: nginx
          nodeSelector:
            alibabacloud.com/nodepool-id: <nodepool-id>  #指定节点池ID。
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            resources:
              limits:
                cpu: 1
              requests:
                cpu: 1

    执行结果

    无状态页面,单击目标Deployment,在容器组页签,可以看到同一个应用的Pod之间按照可用区和节点已均匀调度打散。部署完成后,在容器组页签下,4nginx Pod均处于Running状态,重启次数为0,分布在不同节点上,说明Pod拓扑分布约束配置已生效。

相关文档