部署集是控制ECS实例分布的策略,该策略将ECS实例分散部署在不同的物理服务器上,提升业务的高可用性和底层容灾能力。通过为节点池指定部署集,能够保证节点池弹出的ECS实例不会分布于同一物理机上,并通过亲和性配置,使您的应用对底层的节点拓扑进行感知,使其均匀地分布在不同节点上,保证应用的容灾能力和高可用性。本文介绍如何通过ACK控制台为节点池指定部署集,并介绍两种典型的使用案例。
前提条件
背景信息
在同可用区下,为了保证高可用,您通常会选择跨主机部署服务,但是当一台物理机出问题时,会影响到应用的所有副本。为了解决这个问题,ECS提供了部署集功能。部署集内所有ECS实例会在指定地域内严格分散在不同的物理服务器上,满足服务相互隔离的应用架构,大幅降低服务不可用的几率。关于部署集的更多信息,请参见部署集概述。
使用限制
- 每个节点池仅支持绑定一个部署集,且不支持更换部署集。
- 目前部署集不支持手动添加或移除节点,您可以通过扩缩容节点池的操作,调整部署集中的节点数。具体操作,请参见创建节点池。
- 选择开启部署集功能后,不支持创建抢占式实例和专有宿主机。
- 选择开启部署集功能后,一个可用区内最多能创建20台ECS实例(该数值根据您使用云服务器ECS的情况而变化),一个阿里云地域下能创建的ECS实例数量为20×可用区数量(可用区数量由节点池选择的交换机决定)。目前部署集暂不支持配额申请,如有需求,请前往配额平台申请。
- 部署集支持的实例规格族信息如下:
- g8m、c7、g7、g7ne、r7、c6、g6、r6、c5、g5、r5、c6e、g6e、r6e、c7se、g7se、r7se、r6se、c7t、g7t、r7t、c7a、g7a、r7a、c6a、g6a、r6a、g5ne、re6、re6p、re4、ic5
- hfc7、hfg7、hfr7、hfc6、hfg6、hfr6、hfc5、hfg5
- d2s、d2c、d1、d1ne、d1-c14d3、d1-c8d3
- i3、i3g、i2、i2g、i2ne、i2gne、i1
- se1ne、sn1ne、sn2ne、se1
- ebmg5、sccgn6、scch5、scch5s、sccg5、sccg5s
- s6、t6、xn4、mn4、n4、
- gn6i
- 在部署集内创建ECS实例,或重启按量付费ECS实例(节省停机模式)时,供货紧缺依然会导致请求失败。请前往配额平台申请,确保配额充足,节点池节点能够正确弹出。
更多有关部署集的使用限制及配额,请参见使用限制。
通过控制台为节点池指定部署集
使用案例
- 场景一:服务在同一个节点池中,同一个应用的Pod之间反亲和,一个节点只能调度一个Pod
本示例介绍如何将Deployment中的三个Pod副本调度到三个不同节点上,操作步骤如下。
- 创建节点池包含三个节点,并为节点池指定部署集ID。具体操作,请参见通过控制台为节点池指定部署集。创建节点池完成后,在节点池页面,单击目标节点,在节点管理页签,可以查看到成功创建的三个节点。
- 使用以下示例内容,配置应用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: nginx resources: limits: cpu: 1 requests: cpu: 1
在无状态页面,单击目标Deployment,在容器组页签,可以看到三个不同的Pod调度到节点池不同节点上。
- 创建节点池包含三个节点,并为节点池指定部署集ID。具体操作,请参见通过控制台为节点池指定部署集。
- 场景二:服务在同一个节点池中,同一个应用的Pod之间按照可用区和节点均匀调度打散
- 创建节点池包含四个节点,为节点池指定部署集ID,并选择多可用区的VSwitch。具体操作,请参见通过控制台为节点池指定部署集。创建完成后,在节点页面,可以查看到四个节点,并选择了四个可用区。根据ESS的均匀分布策略,弹出的ECS实例将分布在不同的四个可用区,且均加入了部署集。
- 使用以下示例内容,配置应用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: nginx resources: limits: cpu: 1 requests: cpu: 1
在无状态页面,单击目标Deployment,在容器组页签,可以看到同一个应用的Pod之间按照可用区和节点已均匀调度打散。
- 创建节点池包含四个节点,为节点池指定部署集ID,并选择多可用区的VSwitch。具体操作,请参见通过控制台为节点池指定部署集。