如何配置EC2 Fleet实现按需实例跨可用区分布部署
问题结论
EC2 Fleet 原生支持按需实例跨可用区分布式部署,你遇到的所有按需实例集中在单个可用区启动的问题是配置缺失导致的,无需切换到其他服务。
问题根因
你观察到的Spot实例可以正常跨AZ、按需实例集中单AZ的现象,是两类容量的调度逻辑差异导致的:
- 你配置的
instancePoolsToUseCount参数仅对Spot实例生效,会强制Spot实例分散到指定数量的实例池(你配置为AZ数量,因此Spot正常跨AZ),该参数对按需实例完全不生效。 - 按需实例的调度完全遵循专属的分配策略配置,你当前的配置没有显式给跨AZ调度提供规则,触发了默认调度逻辑的坑:
- 对于CfnSpotFleet(旧版混部Fleet):全局配置的
lowestPrice策略对按需实例生效时,会将所有按需实例投递到价格最低的单个AZ,不会做跨AZ分散。 - 对于CfnEC2Fleet(新版EC2 Fleet):你配置了
prioritized按需分配策略,但没有给每个AZ/子网对应的override条目设置优先级,服务端会默认给配置列表里的第一个AZ分配最高优先级,所有按需实例会全部投递到这个最高优先级的AZ。
- 对于CfnSpotFleet(旧版混部Fleet):全局配置的
修正方案
CfnSpotFleet 配置修正
显式指定按需实例的分配策略为优先级模式,同时给所有跨AZ的子网配置完全相同的优先级,触发Fleet在同优先级AZ间均衡分配容量:
const spotFleet = new CfnSpotFleet(stack, 'EC2-Fleet', { spotFleetRequestConfigData: { allocationStrategy: 'lowestPrice', targetCapacity: 8, iamFleetRole: fleetRole.roleArn, spotMaintenanceStrategies: { capacityRebalance: { replacementStrategy: 'launch-before-terminate', terminationDelay: 120, } }, onDemandTargetCapacity: 4, instancePoolsToUseCount: stack.availabilityZones.length, // 新增:显式指定按需实例分配策略 onDemandAllocationStrategy: 'prioritized', launchTemplateConfigs: [{ launchTemplateSpecification: { launchTemplateId: launchTemplate.launchTemplateId, version: launchTemplate.latestVersionNumber, }, overrides: privateSubnets.map(subnet => ({ availabilityZone: subnet.subnetAvailabilityZone, subnetId: subnet.subnetId, // 新增:所有AZ配置相同优先级,触发跨AZ均衡 priority: 1, })), }], } });
CfnEC2Fleet 配置修正
同样给所有跨AZ的override配置相同的优先级即可,原有分配策略不需要调整:
const ec2Fleet = new CfnEC2Fleet(stack, 'EC2-EcFleet', { targetCapacitySpecification: { totalTargetCapacity: 6, onDemandTargetCapacity: 6, defaultTargetCapacityType: 'on-demand', }, replaceUnhealthyInstances: true, onDemandOptions: { allocationStrategy: 'prioritized', }, launchTemplateConfigs: [{ launchTemplateSpecification: { launchTemplateId: launchTemplate.launchTemplateId, version: launchTemplate.latestVersionNumber, }, overrides: privateSubnets.map(subnet => ({ availabilityZone: subnet.subnetAvailabilityZone, subnetId: subnet.subnetId, // 新增:所有AZ配置相同优先级,避免集中投递到列表第一个AZ priority: 1, })), }] });
补充说明
如果你不需要基于优先级的调度逻辑,也可以将CfnEC2Fleet的onDemandOptions.allocationStrategy改为lowestPrice,由于同一区域内跨AZ的同规格按需实例价格完全一致,Fleet也会自动在多AZ间分散实例。但显式配置同优先级的方式兼容性更强,不会因为服务端默认逻辑变动导致调度异常。
内容的提问来源于stack exchange,提问作者Patrik Valkovič
相关产品推荐
相关产品推荐

