尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Terraform实战11:完整三层架构——VPC + EKS + RDS

Terraform实战11:完整三层架构——VPC + EKS + RDS Terraform实战11完整三层架构——VPC EKS RDS本篇目标将前面所有知识串联用一套Terraform代码构建完整的生产级三层架构。这是面试时最有说服力的Terraform项目。学完本篇你将掌握完整三层架构的设计思路网络层 计算层 数据层多个模块的组合编排层与层之间的安全隔离安全组链65个资源的依赖管理生产级基础设施的全貌前置条件已完成第8-10篇EKS、ALB、RDS单独练习架构设计┌─────────────────────────────────────────────────────────────────┐ │ VPC (10.0.0.0/16) │ │ │ │ ┌─────────────────┐ ┌─────────────────┐ ┌───────────────┐ │ │ │ 公有子网 (2 AZ) │ │ 私有子网 (2 AZ) │ │ DB子网 (2 AZ) │ │ │ │ 10.0.1-2.0/24 │ │ 10.0.10-11.0/24│ │ 10.0.20-21/24│ │ │ │ │ │ │ │ │ │ │ │ ┌───────────┐ │ │ ┌───────────┐ │ │ ┌───────────┐│ │ │ │ │NAT Gateway│ │ │ │EKS Nodes │ │ │ │RDS MySQL ││ │ │ │ └───────────┘ │ │ │(t3.micro) │ │ │ │(db.t3.micro)│ │ │ │ │ │ └─────┬─────┘ │ │ └─────┬─────┘│ │ │ └─────────────────┘ └───────┼─────────┘ └───────┼───────┘ │ │ │ │ │ │ │ 安全组只允许 │ │ │ │ EKS节点 → 3306 │ │ │ └─────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────────────┐ │ │ │ EKS Control Plane (AWS托管) │ │ │ │ API: https://xxx.eks.amazonaws.com │ │ │ └──────────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────────┘ ┌─────────────────────┐ │ Secrets Manager │ ← 存储RDS密码 └─────────────────────┘三层职责层子网资源职责网络层公有子网NAT Gateway、未来的ALB对外通信出入口计算层私有子网EKS节点运行业务容器数据层数据库子网RDS MySQL持久化数据安全隔离设计外网 → 公有子网NAT/ALB ↓ 只允许特定端口 EKS节点私有子网 ↓ 安全组限制只允许EKS节点安全组访问3306 RDS数据库子网目录结构11-full-architecture/ ├── main.tf # 三层架构所有资源 ├── variables.tf # 变量 └── outputs.tf # 三层输出完整代码main.tfterraform { required_providers { aws { source hashicorp/aws version ~ 5.0 } random { source hashicorp/random version ~ 3.0 } } required_version 1.0 } provider aws { region var.region } locals { name_prefix ${var.project_name}-${var.environment} cluster_name ${local.name_prefix}-eks common_tags { Project var.project_name Environment var.environment ManagedBy terraform } } # # 第一层网络 # 6个子网2公有 2私有 2数据库 # module vpc { source terraform-aws-modules/vpc/aws version 5.16.0 name ${local.name_prefix}-vpc cidr 10.0.0.0/16 azs [${var.region}a, ${var.region}b] public_subnets [10.0.1.0/24, 10.0.2.0/24] private_subnets [10.0.10.0/24, 10.0.11.0/24] database_subnets [10.0.20.0/24, 10.0.21.0/24] enable_nat_gateway true single_nat_gateway true enable_dns_hostnames true enable_dns_support true create_database_subnet_group true database_subnet_group_name ${local.name_prefix}-db-subnet-group # EKS所需子网标签 public_subnet_tags { kubernetes.io/role/elb 1 kubernetes.io/cluster/${local.cluster_name} shared } private_subnet_tags { kubernetes.io/role/internal-elb 1 kubernetes.io/cluster/${local.cluster_name} shared } tags local.common_tags } # # 第二层计算EKS # module eks { source terraform-aws-modules/eks/aws version 20.31.6 cluster_name local.cluster_name cluster_version 1.31 vpc_id module.vpc.vpc_id subnet_ids module.vpc.private_subnets cluster_endpoint_public_access true eks_managed_node_groups { default { name default-node-group instance_types [t3.micro] min_size 1 max_size 2 desired_size 1 labels { Environment var.environment } tags local.common_tags } } tags local.common_tags } # # 第三层数据RDS Secrets Manager # resource random_password db_password { length 16 special true override_special !#$%*()-_[]{}:? } resource aws_secretsmanager_secret db_credentials { name ${local.name_prefix}-db-credentials recovery_window_in_days 0 tags local.common_tags } resource aws_secretsmanager_secret_version db_credentials { secret_id aws_secretsmanager_secret.db_credentials.id secret_string jsonencode({ username var.db_username password random_password.db_password.result dbname var.db_name host aws_db_instance.mysql.endpoint port 3306 engine mysql }) } # 【关键】RDS安全组只允许EKS节点安全组访问 resource aws_security_group rds { name ${local.name_prefix}-rds-sg vpc_id module.vpc.vpc_id ingress { description MySQL from EKS nodes from_port 3306 to_port 3306 protocol tcp security_groups [module.eks.node_security_group_id] } egress { from_port 0 to_port 0 protocol -1 cidr_blocks [0.0.0.0/0] } tags merge(local.common_tags, { Name ${local.name_prefix}-rds-sg }) } resource aws_db_instance mysql { identifier ${local.name_prefix}-mysql engine mysql engine_version 8.0 instance_class db.t3.micro allocated_storage 20 max_allocated_storage 50 storage_type gp3 storage_encrypted true db_name var.db_name username var.db_username password random_password.db_password.result db_subnet_group_name module.vpc.database_subnet_group_name vpc_security_group_ids [aws_security_group.rds.id] publicly_accessible false backup_retention_period 1 skip_final_snapshot true multi_az false deletion_protection false tags merge(local.common_tags, { Name ${local.name_prefix}-mysql }) }层与层之间的安全隔离这是本篇最重要的设计点——每层只能访问它该访问的资源来源目标允许方式外网EKS节点❌ 不允许直接访问外网RDS❌ 不允许publicly_accessiblefalseEKS节点RDS:3306✅ 安全组引用节点SGEKS节点外网✅ 通过NAT Gateway# RDS安全组的ingress只允许EKS节点安全组 security_groups [module.eks.node_security_group_id]这比用cidr_blocks [10.0.0.0/16]更精确——只有EKS节点能访问数据库同VPC内其他资源不能。操作步骤与实际输出Planterraform plan# Plan: 65 to add, 0 to change, 0 to destroy.65个资源 网络层(约20) EKS(约35) RDSSecrets(约10)Apply约15-20分钟terraform apply -auto-approve关键耗时NAT Gateway: 2m0s RDS MySQL: 6m39s EKS Control Plane: 10m24s ← 最慢 EKS Node Group: 1m51s Apply complete! Resources: 65 added输出 网络层 VPC: vpc-0f5d11f137a3423a9 公有子网: 2个 私有子网: 2个 数据库子网: 2个 计算层 EKS集群: tf-practice-dev-eks K8s版本: 1.31 API端点: https://xxx.eks.amazonaws.com 数据层 RDS端点: tf-practice-dev-mysql.xxx.rds.amazonaws.com:3306 Secret名: tf-practice-dev-db-credentials控制台验证EKS集群RDS实例VPC 6个子网RDS安全组只允许EKS节点Destroyterraform destroy -auto-approve# Destroy complete! Resources: 65 destroyed.延伸思考面试怎么讲这个项目面试开场“我用Terraform搭建过完整的三层架构网络层用VPC社区模块创建6个子网公有私有数据库计算层用EKS跑业务容器数据层用RDS MySQL配合Secrets Manager管理密码。安全设计上RDS的安全组只允许EKS节点安全组访问不允许公网直连。整个架构65个资源一套代码管理。”面试追问和回答追问回答为什么分三种子网公有放NAT/ALB私有放计算节点数据库子网放RDS职责隔离RDS怎么保证安全不可公网访问 安全组只允许EKS节点 存储加密 密码不在代码中EKS节点怎么访问RDS同VPC内通过私网连接安全组放行节点SG到3306密码怎么管理random_password生成 Secrets Manager存储Pod通过API获取这套架构有什么不足单NAT单AZ是单点生产应multi-AZ NAT RDS multi_az费用说明资源费用EKS控制面$0.10/小时NAT Gateway$0.045/小时EC2节点 t3.micro$0.0104/小时RDS db.t3.micro$0.017/小时其他VPC/SG/Secret等免费或极低总计~$0.17/小时本次练习约35分钟约$0.10小结本篇核心收获三层架构是生产环境的标准设计网络/计算/数据分离65个资源通过模块组合一套代码管理安全组链实现层与层之间的精确访问控制6个子网各有职责公有/私有/数据库这就是你简历上的Terraform项目——面试时能完整讲出来下一篇预告Terraform实战12CI/CD集成——GitLab CI Terraform自动化下一篇进入进阶阶段把Terraform集成到GitLab CI pipeline自动planMR时预览变更手动approve后apply状态锁和并发控制参考链接本系列配套代码GitHubterraform-aws-modules/vpc/awsterraform-aws-modules/eks/awsAWS三层架构参考EKS安全最佳实践
返回列表