如何用Pulumi为EKS集群添加Addons?报错求助
问题描述
我使用Pulumi Crosswalk创建EKS集群的代码可正常执行:
// vpc creation skipped cluster, err := eks.NewCluster(ctx, ClusterName, &eks.ClusterArgs{ Name: pulumi.String(ClusterName), VpcId: vpc.VpcId, PublicSubnetIds: vpc.PublicSubnetIds, PrivateSubnetIds: vpc.PrivateSubnetIds, NodeAssociatePublicIpAddress: pulumi.BoolRef(false), CreateOidcProvider: pulumi.BoolPtr(true), }) if err != nil { return err }
但添加EKS Addons的代码无法运行:
_, err = peks.NewAddon(ctx, "csiEbsAddon", &peks.AddonArgs{ ClusterName: cluster.Core.ApplyT( func(core eks.CoreData) pulumi.StringOutput { return core.Cluster.Name }, ).(pulumi.StringOutput), AddonName: pulumi.String("aws-ebs-csi-driver"), })
报错信息:
Diagnostics: pulumi:pulumi:Stack (infrastructure-dev): error: an unhandled error occurred: program failed: waiting for RPCs: marshaling properties: awaiting input property "clusterName": expected a eks.Cluster, got a resource of type eks.Cluster
问题分析与解决
这个报错的核心是你混淆了peks.AddonArgs中ClusterName参数的类型要求。看似矛盾的报错信息,实际是因为Pulumi Crosswalk的eks.Cluster与原生AWS EKS的Addon资源参数匹配逻辑问题:
- 原生AWS EKS的
Addon资源(即peks.NewAddon)的ClusterName参数,可直接接收Crosswalk集群对象的Name属性,无需通过Core.ApplyT嵌套获取,更不需要类型断言。 - Crosswalk的
eks.Cluster本身已暴露Name的StringOutput属性,直接引用即可。
修正后的代码:
_, err = peks.NewAddon(ctx, "csiEbsAddon", &peks.AddonArgs{ ClusterName: cluster.Name, // 直接使用Crosswalk集群的Name属性 AddonName: pulumi.String("aws-ebs-csi-driver"), })
如果需要指定Addon版本或冲突处理策略,可补充参数:
_, err = peks.NewAddon(ctx, "csiEbsAddon", &peks.AddonArgs{ ClusterName: cluster.Name, AddonName: pulumi.String("aws-ebs-csi-driver"), AddonVersion: pulumi.String("v1.23.0-eksbuild.1"), // 可选:指定Addon版本 ResolveConflicts: pulumi.String("OVERWRITE"), // 可选:冲突时覆盖现有配置 })
另外建议调整包导入的别名,避免Crosswalk的eks包与原生AWS的eks包混淆:
import ( "github.com/pulumi/pulumi-aws/sdk/v6/go/aws/eks" // 原生AWS EKS包 xeks "github.com/pulumi/pulumi-eks/sdk/go/eks" // Crosswalk EKS包,用别名区分 ) // 创建集群时使用Crosswalk的xeks cluster, err := xeks.NewCluster(ctx, ClusterName, &xeks.ClusterArgs{...}) // 创建Addon时使用原生AWS的eks _, err = eks.NewAddon(ctx, "csiEbsAddon", &eks.AddonArgs{ ClusterName: cluster.Name, AddonName: pulumi.String("aws-ebs-csi-driver"), })
这样就能解决类型匹配问题,代码可正常运行。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

