A deployment set contains Elastic Compute Service (ECS) instances that are distributed across different physical servers. You can use deployment sets to improve the availability of your applications and implement disaster recovery. A node pool that is associated with a deployment set contains ECS nodes that are distributed across multiple physical servers. You can configure pod affinity to deploy your application pods to different ECS nodes. This way, disaster recovery is implemented and the availability of your applications is improved.
Prerequisites
A deployment set is created. For more information, see Create a deployment set.
The ECS quota of the deployment set is sufficient and sufficient ECS instances of the specified instance types are available. By default, each deployment set can contain up to 20 ECS instances in each zone. For more information, see View and increase resource quotas.
Background Information
To ensure the high availability of your application in a zone, you must deploy your application across multiple hosts. However, when a physical server is down, all application pods are affected. To resolve this issue, you can use deployment sets that are provided by ECS. The ECS instances that are contained in a deployment set are distributed across multiple physical servers and are isolated from each other. This helps prevent service disruptions that are caused by single points of failure. For more information about deployment sets, see Deployment set.
Limits
Cluster feature usage guidelines
Deployment sets are supported by ACK dedicated clusters and ACK managed clusters.
You can associate a deployment set with a node pool only when you create the node pool. Existing node pools cannot have deployment sets enabled. You can associate only one deployment set with each node pool and you cannot change the deployment sets that are associated with node pools.
You cannot manually add ECS instances to or remove ECS instances from deployment sets. If you want to change the number of ECS instances in a deployment set, you can scale the node pool with which the deployment set is associated. For more information, see Create a node pool.
After you associate a deployment set with a node pool, the node pool does not support preemptible instances.
Deployment set quotas and specifications limits
By default, node pool deployment sets are implemented based on a high-availability strategy. In a deployment set that adopts the high availability strategy, you can create up to 20 ECS instances per zone. You can use the following formula to calculate the maximum number of ECS instances that you can create in a deployment set within an Alibaba Cloud region:
20 × Number of zones within the region
. For more information, see Deployment set.You cannot increase the number of ECS instances in a deployment set. However, if you want to increase the maximum number of deployment sets that your Alibaba Cloud account can have, request a quota increase in the Quota Center console. For more information about the limits and quotas of deployment sets, see Deployment set limits.
Instance families that support different deployment strategies:
Specific instance families support only specific deployment strategies. The following table describes the instance families that support different deployment strategies.
NoteYou can also call the DescribeDeploymentSetSupportedInstanceTypeFamily operation to query instance families that support a specific deployment strategy.
Deployment strategy
Instance families that support the deployment strategy
High availability strategy or high availability group strategy
g8a, g8i, g8y, g7se, g7a, g7, g7h, g7t, g7ne, g7nex, g6, g6e, g6a, g5, g5ne, sn2ne, sn2, and sn1
c8a, c8i, c8y, c7se, c7, c7t, c7nex, c7a, c6, c6a, c6e, c5, ic5, and sn1ne
r8a, r8i, r8y, r7, r7se, r7t, r7a, r6, r6e, r6a, re6, re6p, r5, re4, se1ne, and se1
hfc8i, hfg8i, hfr8i, hfc7, hfg7, hfr7, hfc6, hfg6, hfr6, hfc5, and hfg5
d3c, d2s, d2c, d1, d1ne, d1-c14d3, and d1-c8d3
i3g, i3, i2, i2g, i2ne, i2gne, and i1
ebmg5, ebmc7, ebmg7, ebmr7, sccgn6, scch5, scch5s, sccg5, and sccg5s
e, t6, xn4, mn4, n4, e4, n2, and n1
gn6i
Low latency strategy
g8a, g8i, g8ae, and g8y
c8a, c8i, c8ae, and c8y
r8a, r8i, r8ae, and r8y
ebmc7, ebmg7, and ebmr7
Insufficient instance resources within the region may result in a failure to create ECS instances or start pay-as-you-go instances that were stopped in economical mode in a deployment set. Wait for a while and then try to create or start the instances again.
Associate a deployment set with a node pool in the ACK console
Log on to the ACK console. In the left-side navigation pane, click Clusters.
On the Clusters page, find the cluster that you want to manage and click its name. In the left-side navigation pane, choose .
In the upper-right corner of the Node Pools page, click Create Node Pool. In the Create Node Pool dialog box, configure the parameters, select a deployment set, and then click Confirm Order.
For more information about the parameters, see Procedure.
Use cases
Your applications are deployed in the same node pool and pod anti-affinity is configured for pods that belong to the same application. Each node can host only one pod.
This use case shows how to schedule three replicated pods in a Deployment to three different nodes.
Create a node pool that contains three nodes and specify the ID of the deployment set that you want to associate with the node pool. For more information, see Associate a deployment set with a node pool in the ACK console.
After you create the node pool, click the name of the node pool on the Node Pools page. The Nodes tab shows the nodes that are contained in the node pool.
Log on to the ECS console. In the left-side navigation pane, choose . The Deployment Sets page shows that the three nodes belong to the specified deployment set.
Create a YAML file based on the following content.
Deploy three pods and configure anti-affinity to schedule the pods to three different nodes.
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: # Configure the scheduling policy. - labelSelector: matchExpressions: - key: app operator: In values: - nginx topologyKey: kubernetes.io/hostname nodeSelector: alibabacloud.com/nodepool-id: <nodepool-id> # Specify the ID of the node pool. containers: - name: nginx image: nginx resources: limits: cpu: 1 requests: cpu: 1
Results
On the Deployments page, click the Deployment that you want to manage. The Pods tab shows that the pods are scheduled to three different nodes.
Your applications are deployed in the same node pool. Pods that belong to the same application can be scheduled to different nodes across multiple zones.
Create a node pool that contains four nodes, specify the ID of the deployment set that you want to associate with the node pool, and select vSwitches that are deployed in multiple zones. For more information, see Associate a deployment set with a node pool in the ACK console.
Create a YAML file based on the following content.
You can use pod topology spread constraints to schedule pods that belong to the same application to different nodes across multiple zones. For more information, see Pod topology spread constraints.
Results
After you create the node pool, four nodes and four zones are displayed on the Nodes page. ECS instances are deployed in four different zones and are added to the same deployment set based on the balanced distribution policy of Auto Scaling.
Log on to the ECS console. In the left-side navigation pane, choose . The Deployment Sets page shows that the four nodes in the node pool belong to the specified deployment set.
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> #Specify the ID of the node pool.
containers:
- name: nginx
image: nginx
resources:
limits:
cpu: 1
requests:
cpu: 1
On the Deployments page, click the Deployment that you want to manage. The Pods tab shows that pods belonging to the same application are scheduled to different nodes across multiple zones.
References
You can also Use Terraform to associate a deployment set with a node pool.
For more information about recommended configurations on high availability clusters architecture, see Suggested configurations for creating HA clusters.