如何实现单EKS POD连接多RDS的多租户架构?
单Pod多租户适配方案(EKS+RDS场景)
1. 统一流量入口配置
- 用ALB Ingress Controller(适配EKS)配置多域名或通配域名规则,把所有租户的域名(比如walmart.com、target.com)都指向同一个EKS Service,最终路由到你的单Pod集群。
- 必须确保Ingress转发请求时保留Host头——这是你的应用识别租户的核心依据,毕竟应用已经能根据URL/Host判断要连哪个库。
- 简单的Ingress配置示例:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/group.name: multi-tenant-app alb.ingress.kubernetes.io/scheme: internet-facing spec: rules: - host: "*.your-base-domain.com" # 也可以逐个列出租户独立域名 http: paths: - path: /* pathType: Prefix backend: service: name: multi-tenant-app-svc port: number: 80
2. 租户数据库配置的动态管理
- 别把RDS连接信息硬编码进Pod,用K8s的ConfigMap存非敏感配置(租户域名和RDS端点、库名的映射),Secret存敏感信息(数据库密码)。
- ConfigMap示例:
apiVersion: v1 kind: ConfigMap metadata: name: tenant-db-config data: tenant-mapping.json: | { "walmart.com": {"db_endpoint": "walmart-rds.xxxx.us-east-1.rds.amazonaws.com", "db_name": "walmart_db"}, "target.com": {"db_endpoint": "target-rds.xxxx.us-east-1.rds.amazonaws.com", "db_name": "target_db"} }
- Secret示例:
apiVersion: v1 kind: Secret metadata: name: tenant-db-secrets type: Opaque data: walmart-db-password: d2FybWFydF9wYXNzd29yZA== # base64编码后的密码 target-db-password: dGFyZ2V0X3Bhc3N3b3Jk # base64编码后的密码
- 把这两个资源挂载到Pod里,应用启动时加载配置;如果要支持动态新增租户,要么让应用定时刷新配置,要么用配置中心触发更新——更新ConfigMap/Secret后,Pod不需要重启就能读取新配置(取决于应用的配置加载逻辑)。
3. Jenkins+Terraform流水线改造
- 原来的流水线是每个租户部署新Pod+Route53记录,现在改成:
- 新增租户时,用Terraform在Route53添加域名解析,指向ALB的公网域名。
- 用Terraform更新K8s的ConfigMap/Secret,把新租户的RDS连接信息加进去。
- 完全不用再部署新Pod,单Pod集群会自动识别新租户的域名和对应数据库配置。
- 应用版本更新时,只需要重新部署这个单Pod的Deployment(滚动更新),所有租户的版本会同步升级。
4. 单Pod的高可用与扩展性优化
- 别只跑1个Pod,用Deployment管理,设置2-3个副本数,避免单点故障。
- 开启HPA(Horizontal Pod Autoscaler),根据CPU/内存使用率或者请求数这类自定义指标自动扩容Pod,应对不同租户的流量波动。
5. 安全隔离强化
- 给Pod绑定IAM角色,用RDS IAM认证访问数据库,每个租户的数据库用户关联对应的IAM权限,比硬编码密码安全得多。
- 配置K8s网络策略,限制Pod只能访问允许的RDS实例,防止跨租户的数据库访问。
- 启用Pod的安全上下文,限制容器的权限,降低被攻击的风险。
内容的提问来源于stack exchange,提问作者Muhammad Ehtesham
相关产品推荐
相关产品推荐

