云原生容器编排DevOps【免费下载链接】eksctlThe official CLI for Amazon EKS项目地址https://gitcode.com/gh_mirrors/ek/eksctl点击查看免费下载导读eksctlv0.166.0发布说明为utils命令族新增了migrate-to-pod-identity子命令PR #7343用于把集群中所有基于 IRSAv1即 iamserviceaccounts IAM OIDC Provider的配置自动转换为等价的 Pod Identity Associations 配置。本文将围绕该命令展开先梳理 IRSA 与 EKS Pod Identity 的差异与迁移动机再给出命令用法、关键参数与安全前提然后深入pkg/actions/podidentityassociation源码逐层拆解迁移器生成的每个任务最后结合测试用例给出验证与回退建议帮助你在真实集群上安全、可控地完成这一迁移。为什么需要迁移IRSA 与 EKS Pod Identity 的本质差异EKS Pod Identity Associations 是 AWS 推出的增强机制用于让集群管理员为 Kubernetes 应用配置访问 AWS 服务的 IAM 权限。它与 IRSAIAM Roles for Service Accounts共享同一套用 ServiceAccount 绑定 IAM 角色的思路但关键区别在于配置入口从 IAM API 转移到了 EKS API见 userdocs/src/usage/pod-identity-associations.mdIRSAIRSAv1IAM 角色的信任策略必须引用集群的 OIDC ProviderFederatedPrincipal oidc.eks.region.amazonaws.com/id/id:sub条件角色与单个集群强绑定ServiceAccount 上需要eks.amazonaws.com/role-arn注解常量定义见 pkg/apis/eksctl.io/v1alpha5/iam.go。Pod Identity角色信任pods.eks.amazonaws.com这一 EKS 服务主体见 pkg/apis/eksctl.io/v1alpha5/iam.go不再依赖 OIDC Provider因此同一个 IAM 角色可以跨多个 EKS 集群复用免去角色重复创建和每建一个新集群都要改写信任策略的负担也简化了 IRSA 的自动化流程。迁移的收益即来源于此把绑定单集群的 OIDC 信任关系替换为跨集群通用的 EKS 服务主体信任同时把 ServiceAccount 的注解式授权改为 EKS API 原生管理的 Pod Identity Association。前置条件在运行迁移命令前需要确认Pod Identity Agent 已就绪Pod Identity 在 worker 节点上以 DaemonSet 形式运行 agent对应的官方 addon 是eks-pod-identity-agent。若集群已启用 EKS Auto Mode该 agent 会随集群预装无需额外操作否则可先用以下命令安装usage 文档eksctl create addon --cluster my-cluster --name eks-pod-identity-agent预先存在的 IAM 角色需要信任 EKS 服务主体如果 Pod Identity Association 使用的是已有的 IAM 角色该角色的信任策略必须允许pods.eks.amazonaws.com执行sts:AssumeRole与sts:TagSession。示例信任策略来自 usage 文档{ Version: 2012-10-17, Statement: [ { Effect: Allow, Principal: { Service: pods.eks.amazonaws.com }, Action: [ sts:AssumeRole, sts:TagSession ] } ] }如果不在配置中提供既有角色的 ARNeksctl会在创建 Pod Identity Association 时自动创建角色并配置上述信任策略。好消息是migrate-to-pod-identity命令会自动完成信任策略改写详见下文迁移任务拆解无需手工处理。命令用法与参数命令通过utils子命令注册注册点见 pkg/ctl/utils/utils.goeksctl utils migrate-to-pod-identity --cluster cluster-name [--region region] [--approve] [--remove-oidc-provider-trust-relationship] [--timeout duration]命令描述源码见 pkg/ctl/utils/migrate_to_pod_identity.goMigrates all IRSA related config for a cluster to an equivalent pod identity associations config参数说明参数默认值作用--cluster必填集群名称缺失时命令会报ErrMustBeSet错误见 migrate_to_pod_identity.go--region默认区域集群所在区域--approvefalse是否真正执行变更。默认false时以Plan 模式运行仅打印将要执行的任务清单PlanMode: !options.Approve见 migrator.go--remove-oidc-provider-trust-relationshipfalse是否同时移除现有 IRSA 角色信任策略中的 OIDC Provider 实体并删除 ServiceAccount 上的eks.amazonaws.com/role-arn注解不指定则保留原信任关系双轨并存风险更小--timeout由 cmdutils 提供默认值安装 addon 等任务的等待超时时间命令的完整调用链migrate_to_pod_identity.go依次执行校验集群名称创建 AWS Provider 并验证集群可操作ctl.CanOperate通过NewOpenIDConnectManager检查集群是否关联了 IAM OIDC Provider——如果集群没有 OIDC Provider说明没有 iamserviceaccount 需要迁移命令直接告警并退出logger.Warning(no IAM OIDC provider associated with cluster...)建立 Kubernetes 客户端NewStdClientSet读取 ServiceAccount初始化 addon 管理器addon.New与 CloudFormation Stack 管理器NewStackManager组装podidentityassociation.NewMigrator(...)并调用MigrateToPodIdentity(ctx, options)。迁移任务拆解源码视角的完整流程Migrator.MigrateToPodIdentitypkg/actions/podidentityassociation/migrator.go把所有操作组织成一颗串行任务树Parallel: false每个迁移对象内部再并行执行子任务。整体分四个阶段阶段一确保 Pod Identity Agent 已安装IsPodIdentityAgentInstalledmigrator.go先检查集群是否处于 Auto ModeIsAutoModeEnabled通过DescribeCluster读取ComputeConfig.Enabled若不是 Auto Mode则调用DescribeAddon查询eks-pod-identity-agent常量见 pkg/apis/eksctl.io/v1alpha5/addon.go。若 addon 不存在任务树会追加一个任务install eks-pod-identity-agent addon通过addonCreator.Create完成安装。阶段二扫描 IRSA 配置iamserviceaccount ServiceAccountIRSAv1StackNameResolver.Populatemigrator.go通过stackUpdater.GetIAMServiceAccounts(ctx, , )拉取所有由 eksctl CloudFormation 管理的 iamserviceaccount 及其 RoleARN、StackName、Tags、Capabilities构建RoleARN → IRSAv1StackSummary映射遍历 Kubernetes 集群中的全部 ServiceAccount找出带eks.amazonaws.com/role-arn注解的对象migrator.go通过CreateAddonServiceAccountRoleMapperaddon_role_mapper.go分页列出全部 EKS addon将 addon 的ServiceAccountRoleArn映射到 addon 本身若某 ServiceAccount 的角色 ARN 已被某个 addon 使用则该角色不按普通 iamserviceaccount 处理改由 AddonMigrator 专门迁移其余角色被收集进toBeCreated待创建的PodIdentityAssociation列表并从 ARN 推断角色名api.RoleNameFromARN按角色是否由 eksctl Stack 管理resolver.GetStack(roleARN)分别生成owned role或unowned role的信任策略更新任务。阶段三迁移 EKS 托管 AddonAddonMigratorAddonMigrator.Migrateaddon_migrator.go对每个使用 IRSAv1 角色的 addon 执行migrateAddon若 addon 已配置PodIdentityAssociations直接跳过调用DescribeAddonConfiguration检查该 addon 版本是否支持 Pod Identitylen(addonConfig.PodIdentityConfiguration) 0则跳过解析角色的信任策略getRoleServiceAccountaddon_migrator.go从StringEquals条件中提取形如system:serviceaccount:ns:name的 ServiceAccount 主体若提取失败且 addon 只支持一个 ServiceAccount则使用 addon 配置中声明的默认 ServiceAccount生成两个串行子任务更新该角色的信任策略owned 角色走 CloudFormation Stack 更新unowned 角色走UpdateAssumeRolePolicy此处固定传入removeOIDCProviderTrustRelationshiptrueupdateAddonToUsePodIdentityaddon_migrator.go调用UpdateAddon在PodIdentityAssociations字段中填入原ServiceAccountRoleArn与解析出的 ServiceAccount。阶段四迁移 iamserviceaccount并行任务组每个待迁移的 ServiceAccount 生成一个独立子任务组Parallel: true见 migrator.go按序执行更新信任策略trustPolicyUpdater.UpdateTrustPolicyForOwnedRoleTask/UpdateTrustPolicyForUnownedRoleTasktasks.go——先GetRole读取现有 AssumeRolePolicyDocumentupdateTrustStatementstasks.go做两件事若指定了--remove-oidc-provider-trust-relationship则删除 Principal 为Federated且指向oidc-provider的语句随后追加api.EKSServicePrincipalTrustStatementService: pods.eks.amazonaws.comsts:AssumeRole/sts:TagSession。owned 角色更新 CloudFormation 模板中AWS::IAM::Role的 AssumeRolePolicyDocument同时更新 Stack Tags——移除eksctl-iamserviceaccount-name标签若指定移除信任关系并打上alpha.eksctl.io/podidentityassociation-name标签标签常量见 pkg/apis/eksctl.io/v1alpha5/types.go保留原 Capabilities如CAPABILITY_IAM后通过MustUpdateStack应用变更unowned 角色直接调用 IAMUpdateAssumeRolePolicy写入新的信任策略文档。移除注解仅当--remove-oidc-provider-trust-relationship为 true删除 ServiceAccount 上的eks.amazonaws.com/role-arn注解并Update回 Kubernetes。创建 Pod Identity AssociationNewCreator(...).CreateTasks(ctx, toBeCreated, true)内部调用 EKSCreatePodIdentityAssociation传入Namespace、RoleARN、ServiceAccount、Tags 以及可选的DisableSessionTags、Policy、TargetRoleArn跨账户角色链见 tasks.go若ignorePodIdentityExistsErr且目标已存在ResourceInUseException则跳过并提示。全部任务执行前命令会通过cmdutils.LogIntendedAction打印摘要migrate N iamserviceaccount(s) and M addon(s) to pod identity by executing the following tasks若没有任何 iamserviceaccount 或 addon 可迁移则打印no iamserviceaccounts or addons found to migrate to pod identity并直接返回migrator.go。关键参数详解与推荐迁移策略关于--remove-oidc-provider-trust-relationship该参数控制迁移的彻底程度不指定推荐首轮执行只做加法——为角色追加pods.eks.amazonaws.com信任语句、创建 Pod Identity Association、安装 agent。OIDC 信任关系与 ServiceAccount 注解原样保留IRSAv1 与 Pod Identity 双轨并存。此时 Pod 若通过注解注入凭证仍可工作适合灰度验证。指定该参数在上一基础上执行减法——删除角色信任策略中的 OIDC Provider Federated 语句、删除 ServiceAccount 注解并更新 Stack 标签以反映 IRSAv2 化。迁移完成后集群将不再依赖 IAM OIDC Provider 提供 pod 凭证。建议流程先用默认Plan 模式查看任务清单 → 不加该参数--approve执行验证应用正常 → 确认无误后再加--remove-oidc-provider-trust-relationship --approve完成收尾清理。关于--approve迁移器把任务树置于PlanModePlanMode: !options.Approve未指定--approve时任务只做规划与打印不触发任何实际变更cmdutils.LogPlanModeWarning会输出 Plan 模式提示。这与 eksctl 一贯的--dry-run心智一致务必先预览再批准。迁移后的验证迁移完成后可用以下命令确认 Pod Identity Association 已生效命令及输出格式见 usage 文档# 查看全部关联 eksctl get podidentityassociation --cluster my-cluster # 按命名空间过滤 eksctl get podidentityassociation --cluster my-cluster --namespace dev同时可检查对应 ServiceAccount 上是否已无eks.amazonaws.com/role-arn注解以及 IAM 角色信任策略是否已包含pods.eks.amazonaws.com主体。测试与可靠性保障该功能的测试覆盖在 pkg/actions/podidentityassociation/migrator_test.go 中使用 Ginkgo 表格驱动 mockprovider fake Clientset 验证了多个关键分支API 错误路径DescribeAddon失败、GetIAMServiceAccounts失败均返回明确错误migrator_test.goagent 安装任务addon 未安装时任务树包含install eks-pod-identity-agent addonAuto Mode 下ComputeConfig.Enabledtrue或ComputeConfig为 nil 时行为正确migrator_test.go注解移除任务指定RemoveOIDCProviderTrustRelationship时输出remove iamserviceaccount EKS role annotation for default/service-account-1migrator_test.goowned / unowned 角色分支owned 角色生成update trust policy for owned roleunowned 角色生成update trust policy for unowned role两者均生成create pod identity association任务migrator_test.go端到端成功验证最终信任策略只包含Service: pods.eks.amazonaws.com主体、Stack 标签仅保留alpha.eksctl.io/podidentityassociation-name、模板不再包含oidcmigrator_test.go。此外 0.166.0 还修复了build-integration-test for pod_identity_associationsPR #7336与STS interfacePR #7345保证迁移链路依赖的接口定义正确。补充以配置文件方式管理 Pod Identitymigrate-to-pod-identity是一次性的存量迁移工具日常的声明式管理仍通过集群配置文件中的iam.podIdentityAssociations字段完成字段定义见 pkg/apis/eksctl.io/v1alpha5/iam.go完整示例见 examples/39-pod-identity-association.yamliam: podIdentityAssociations: - namespace: default serviceAccountName: s3-reader createServiceAccount: true # 可选默认 false roleARN: arn:aws:iam::111122223333:role/role-1 # 提供 roleARN 时仅创建关联 - namespace: dev serviceAccountName: app-cache-access roleName: pod-identity-role-app-cache # 不提供 roleARN 时由 eksctl 创建角色 permissionPolicyARNs: [arn:aws:iam::111122223333:policy/permission-policy-1] wellKnownPolicies: autoScaler: true permissionsBoundaryARN: arn:aws:iam::111122223333:policy/permission-boundary配套命令# 创建集群创建时在 config.yaml 声明后直接生效或对已有集群 eksctl create podidentityassociation --cluster my-cluster -f config.yaml # 更新 / 删除 eksctl update podidentityassociation --cluster my-cluster -f config.yaml eksctl delete podidentityassociation --cluster my-cluster -f config.yaml注意eksctl create cluster -f config.yaml使用iam.podIdentityAssociations时校验逻辑要求集群同时安装eks-pod-identity-agentaddon见 pkg/apis/eksctl.io/v1alpha5/validation.go 与 validation.go。总结eksctl utils migrate-to-pod-identity把IRSA 迁移到 Pod Identity这一原本需要手工修改角色信任策略、逐个创建 EKS API 关联、清理注解的复杂过程收敛为一条可预览、可灰度、可回滚默认保留 OIDC 信任关系的命令。其底层由一颗结构化的任务树驱动覆盖 agent 安装、iamserviceaccount 扫描、addon 专用迁移、owned/unowned 角色信任策略差异化处理与 Pod Identity Association 创建并通过 migrator_test.go 对关键分支做了充分验证。对正在批量使用 iamserviceaccount 的集群而言这是向 EKS 官方推荐的 Pod Identity 机制平滑演进的最佳起点。赞分享云原生容器编排DevOps【免费下载链接】eksctlThe official CLI for Amazon EKS项目地址https://gitcode.com/gh_mirrors/ek/eksctl点击查看免费下载相关推荐eksctl 0.165.0 核心特性EKS Pod Identity Associations 配置与迁移实战指南eksctl 0.165.0 核心特性EKS Pod Identity Associations 配置与迁移实战指南 本指南以 eksctl v0.165.0云原生容器编排DevOpsAmazon EKS Pod Identity Webhook 使用教程Amazon EKS Pod Identity Webhook 使用教程 1. 项目介绍 Amazon EKS Pod Identity Webhook 是一个Amazon EKS Pod Identity Webhook简化IAM角色与Pod的集成Amazon EKS Pod Identity Webhook简化IAM角色与Pod的集成 项目介绍 Amazon EKS Pod Identity Webh上一篇Squire富文本编辑器与ProtonMail、Tutanota等顶级邮件服务的集成完整指南 下一篇osquery预测分析基于历史数据的智能预测完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考