如何使用AWS API查询EKS集群的pods和nodes并解决AssumeRole访问报错
通过AWS相关接口获取EKS节点与Pod信息的方法
- 前置准备:你持有的ServiceAccount(SA)凭证一般包含
ca.crt、token两个核心文件,首先需要先获取EKS集群的API Server端点,可通过调用AWS EKS服务的DescribeCluster接口获取,也可直接通过AWS CLI执行命令aws eks describe-cluster --name <你的集群名> --query "cluster.endpoint" --output text得到。
注意:你使用的ServiceAccount需要提前绑定对应集群角色(ClusterRole)或命名空间角色(Role),要有nodes、pods资源的get、list权限,否则调用API会返回权限拒绝错误 - 调用Kubernetes原生API获取集群内资源(节点、Pod):EKS本身兼容K8s原生API,资源数据都存储在集群APIServer中,直接用SA凭证调用即可:
- 获取节点列表:请求
GET https://<你的EKS APIServer地址>/api/v1/nodes,请求头添加Authorization: Bearer <SA的token内容>,同时信任SA凭证中的ca.crt文件即可,curl调用示例:curl --cacert ./ca.crt -H "Authorization: Bearer <替换为你的SA token>" https://<eks-apiserver-endpoint>/api/v1/nodes - 获取Pod列表:请求
GET https://<你的EKS APIServer地址>/api/v1/pods,如果需要指定命名空间,路径改为/api/v1/namespaces/<命名空间名>/pods即可,curl调用示例:curl --cacert ./ca.crt -H "Authorization: Bearer <替换为你的SA token>" https://<eks-apiserver-endpoint>/api/v1/pods
- 获取节点列表:请求
- 若需获取AWS资源层面的节点信息(对应EC2实例属性),可调用AWS EC2的
DescribeInstances接口,筛选携带标签eks:cluster-name=<你的集群名>、eks:nodegroup-name=<你的节点组名>的EC2实例即可,不需要用到K8s SA凭证,用你当前的AWS访问密钥调用即可。
kubectl AssumeRole AccessDenied报错解决方案
你执行kubectl get pods的报错信息如下:
调用AssumeRole操作时发生(AccessDenied)错误:用户:arn:aws:iam:xxxx:user/xx 无权对资源arn:aws:iam::xx:user/xx执行sts:AssumeRole操作
该报错是因为当前使用的IAM用户没有权限Assume你kubeconfig中配置的、绑定了EKS访问权限的IAM角色,按以下步骤修复即可:
- 检查kubeconfig配置:执行
cat ~/.kube/config,找到对应EKS集群的user配置,确认args字段里的--role-arn参数是不是你要使用的角色ARN,是否存在账号ID、角色名拼写错误。 - 给当前IAM用户添加AssumeRole权限:在IAM控制台找到报错里的IAM用户
arn:aws:iam:xxxx:user/xx,给它附加包含以下内容的权限策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": "<替换为你要Assume的IAM角色ARN>" } ] }
- 检查目标IAM角色的信任策略:找到你要Assume的IAM角色,确认它的信任策略里允许你的IAM用户调用AssumeRole,参考配置如下:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam:xxxx:user/xx" }, "Action": "sts:AssumeRole" } ] }
- 验证配置:修改完成后等待1~2分钟权限生效,重新执行
kubectl get pods测试即可。
内容的提问来源于stack exchange,提问作者dev
相关产品推荐
相关产品推荐

