AWS CDK部署单个tenant栈时为何会静默部署全部租户的K8s资源?
问题原因分析
- 资源归属逻辑错误:当你直接将EKS栈中创建的
Cluster实例对象传递给租户栈时,self.cluster.add_manifest()方法的本质是将Kubernetes资源定义挂载到Cluster实例所属的栈(也就是你的核心eks-stack)的CloudFormation模板中,而不是挂载到当前执行调用的TenantStack下。
你在循环中为tenant-a、tenant-b分别调用add_manifest后,两个租户的K8s资源最终都会被写入eks-stack的模板内,和租户栈本身没有归属关系。- 当你执行
cdk deploy tenant-a时,CDK会先自动部署其依赖的eks-stack,此时eks-stack的模板已经包含所有租户的K8s资源,会一次性全量部署到集群中 - CDK输出仅显示tenant-a部署成功,是因为eks-stack作为隐式依赖栈,默认不会输出全量部署日志,给你造成了仅部署tenant-a的错觉
- 当你执行
为什么导入集群的方式可正常工作
当你使用Cluster.from_cluster_attributes导入集群时,得到的是一个只读的集群引用对象,不属于任何已有栈的资源。此时调用add_manifest,CDK会自动为当前租户栈创建独立的Kubernetes资源提供者,将租户的K8s资源定义写入当前租户栈的模板中,各租户栈的资源完全隔离:
- 部署单个租户栈时,仅会将该栈内定义的K8s资源同步到集群
- 不会修改核心eks-stack的模板,自然也不会触发其他租户资源的变更
补充说明
官方推荐的跨栈引用是指跨栈传递参数、输出值来自动建立依赖关系,并不代表所有场景都适合直接传递资源实例。如果需要保持租户资源与核心EKS栈解耦,又不想用导入集群的方式,也可以显式声明Kubernetes Provider绑定到EKS集群,再用Provider来部署租户的K8s资源,同样可以实现资源归属到租户栈的效果。
内容的提问来源于stack exchange,提问作者Vad1mo
相关产品推荐
相关产品推荐

