如何用CDK为已导入的现有EKS集群新增Fargate Profile并解决相关报错?
问题根因
Cluster.from_cluster_attributes()方法返回的是实现ICluster接口的只读导入资源,并非完整的Cluster类实例add_fargate_profile是Cluster类专属的实例方法,ICluster接口仅定义了add_manifest、add_chart这类操作K8s资源的方法,所以你调用前两个方法正常,调用add_fargate_profile会报属性不存在- 直接实例化
FargateProfile时你传入的self.cluster实际类型是ICluster,和参数要求的Cluster类型不匹配,所以会触发类型转换报错
解决方法
方法1:适配ICluster类型(适用于CDK v2.20.0及以上版本)
首先修正集群的类型标注,再直接传入FargateProfile构造函数即可,新版本CDK的FargateProfile已经兼容ICluster类型参数:
from aws_cdk import aws_eks as eks # 导入时将类型标注改为ICluster self.cluster: eks.ICluster = eks.Cluster.from_cluster_attributes( self, 'cluster', cluster_name=cluster, open_id_connect_provider=eks_open_id_connect_provider, kubectl_role_arn=kubectl_role ) # 直接创建FargateProfile eks.FargateProfile( self, f"tenant-{self.tenant}", cluster=self.cluster, selectors=[eks.Selector(namespace=self.tenant)] )
方法2:使用底层Cfn资源构造(兼容所有CDK版本)
如果方法1仍然报类型错误,可以直接调用CloudFormation原生的FargateProfile资源构造,不需要依赖Cluster类型:
from aws_cdk import aws_eks as eks from aws_cdk import aws_iam as iam # 先创建Fargate Pod执行角色(如果已有可直接传入ARN) fargate_pod_role = iam.Role( self, "FargatePodExecutionRole", assumed_by=iam.ServicePrincipal("eks-fargate-pods.amazonaws.com"), managed_policies=[ iam.ManagedPolicy.from_aws_managed_policy_name("AmazonEKSFargatePodExecutionRolePolicy") ] ) # 构造CfnFargateProfile eks.CfnFargateProfile( self, f"tenant-{self.tenant}", cluster_name=self.cluster.cluster_name, pod_execution_role_arn=fargate_pod_role.role_arn, selectors=[eks.CfnFargateProfile.SelectorProperty( namespace=self.tenant )] )
内容的提问来源于stack exchange,提问作者Vad1mo
相关产品推荐
相关产品推荐

