AWS CDK初始化含隔离子网的VPC用于Fargate集群时报错
问题:使用@aws-cdk/1.174.0部署EKS Fargate集群时VPC子网类型报错
在使用@aws-cdk/1.174.0版本创建包含PUBLIC和PRIVATE_ISOLATED子网的VPC后,部署EKS Fargate集群时触发错误,提示VPC中不存在'Private'子网组,可用子网类型为Isolated、Deprecated_Isolated、Public。
用户代码如下:
this.vpc = new ec2.Vpc(this, `horizonCloudVpc`, { cidr: '10.0.0.0/16', vpcName: `horizonCloudVpc-${envName}`, enableDnsHostnames: true, enableDnsSupport: true, maxAzs: 2, subnetConfiguration: [ { name: 'public-subnet', subnetType: ec2.SubnetType.PUBLIC, cidrMask: 24, }, { name: 'isolated-subnet', subnetType: ec2.SubnetType.PRIVATE_ISOLATED, cidrMask: 24, }, ] }); const clusterAdmin = new Role(this, 'eksClusterMasterRole', { roleName: `clusterMasterRole-${envName}`, assumedBy: new AccountRootPrincipal(), }); const cluster = new eks.FargateCluster(this, 'horizonCloudEks', { version: eks.KubernetesVersion.V1_21, vpc: vpc, clusterName: `horizonCloudEks-${envName}`, endpointAccess: eks.EndpointAccess.PUBLIC, mastersRole: clusterAdmin, });
报错信息:
/home/runner/work/horizon/horizon/cdk/node_modules/@aws-cdk/aws-ec2/lib/vpc.ts:606 throw new Error(`There are no '${subnetType}' subnet groups in this VPC. Available types: ${availableTypes}`); ^ Error: There are no 'Private' subnet groups in this VPC. Available types: Isolated,Deprecated_Isolated,Public
解决方案
你的推测完全正确,EKS Fargate集群默认依赖PRIVATE_WITH_NAT类型的子网(对应报错里的'Private'子网组)。原因是Fargate Pod需要访问公网拉取镜像、连接AWS服务等,而PRIVATE_ISOLATED子网没有NAT网关,无法出站访问公网,满足不了Fargate的网络需求。
方法一:添加PRIVATE_WITH_NAT子网(推荐)
修改VPC的子网配置,新增PRIVATE_WITH_NAT类型的子网:
this.vpc = new ec2.Vpc(this, `horizonCloudVpc`, { cidr: '10.0.0.0/16', vpcName: `horizonCloudVpc-${envName}`, enableDnsHostnames: true, enableDnsSupport: true, maxAzs: 2, subnetConfiguration: [ { name: 'public-subnet', subnetType: ec2.SubnetType.PUBLIC, cidrMask: 24, }, { name: 'private-nat-subnet', // 新增带NAT的私有子网 subnetType: ec2.SubnetType.PRIVATE_WITH_NAT, cidrMask: 24, }, { name: 'isolated-subnet', subnetType: ec2.SubnetType.PRIVATE_ISOLATED, cidrMask: 24, }, ] });
如果不需要PRIVATE_ISOLATED子网,也可以直接将其替换为PRIVATE_WITH_NAT类型。
方法二:显式指定使用Public子网(不推荐生产环境)
如果临时测试需要,也可以在FargateCluster配置中强制指定使用Public子网,但这会让Pod直接暴露在公网,存在安全风险:
const cluster = new eks.FargateCluster(this, 'horizonCloudEks', { version: eks.KubernetesVersion.V1_21, vpc: vpc, clusterName: `horizonCloudEks-${envName}`, endpointAccess: eks.EndpointAccess.PUBLIC, mastersRole: clusterAdmin, vpcSubnets: [{ subnetType: ec2.SubnetType.PUBLIC }] // 强制指定Public子网 });
内容的提问来源于stack exchange,提问作者Ido Bleicher
相关产品推荐
相关产品推荐

