如何通过Boto3获取AWS EKS集群的命名空间?
解决AWS EKS集群命名空间查询问题(仅用Boto3辅助实现)
Boto3的EKS客户端describe_cluster()接口只能返回集群的基础设施元数据(比如集群端点、CA证书数据、ARN等),无法直接获取Kubernetes内部的命名空间资源——因为命名空间属于K8s API管理范畴,不在AWS EKS的API覆盖范围内。
要实现Python自动查询EKS命名空间,可通过以下步骤(核心依赖Boto3处理AWS认证,结合系统kubectl命令执行):
步骤1:用Boto3获取EKS集群的认证关键信息
先通过Boto3获取集群的端点和CA证书,同时获取访问集群的临时token:
import boto3 import subprocess import json # 切换AWS账号:两种方式任选 # 方式1:使用本地AWS配置文件中的指定profile session = boto3.Session(profile_name="your-target-aws-profile") # 方式2:跨账号STS Assume Role # sts_client = boto3.client('sts') # assume_response = sts_client.assume_role( # RoleArn="arn:aws:iam::TARGET_ACCOUNT_ID:role/your-cross-account-role", # RoleSessionName="eks-namespace-query-session" # ) # session = boto3.Session( # aws_access_key_id=assume_response['Credentials']['AccessKeyId'], # aws_secret_access_key=assume_response['Credentials']['SecretAccessKey'], # aws_session_token=assume_response['Credentials']['SessionToken'] # ) eks_client = session.client('eks') cluster_name = "your-eks-cluster-name" # 获取集群基础认证信息 cluster_detail = eks_client.describe_cluster(name=cluster_name) cluster_endpoint = cluster_detail['cluster']['endpoint'] cluster_ca_data = cluster_detail['cluster']['certificateAuthority']['data'] # 获取EKS访问临时token(等价于aws eks get-token命令) token_cmd = [ "aws", "eks", "get-token", "--cluster-name", cluster_name, "--profile", session.profile_name # 用STS方式时可省略,自动继承会话凭证 ] token_result = subprocess.run(token_cmd, capture_output=True, text=True) kube_token = json.loads(token_result.stdout)['status']['token']
步骤2:构造kubectl命令并执行命名空间查询
利用上面获取的认证信息,直接构造kubectl命令完成查询:
# 组装kubectl查询命令 kubectl_query_cmd = [ "kubectl", "get", "namespaces", "--server", cluster_endpoint, "--certificate-authority-data", cluster_ca_data, "--token", kube_token ] # 执行命令并输出结果 query_result = subprocess.run(kubectl_query_cmd, capture_output=True, text=True) if query_result.returncode == 0: print("EKS集群命名空间列表:") print(query_result.stdout) else: print("查询失败:") print(query_result.stderr)
关键注意事项
- 确保系统已安装
kubectl,且版本与目标EKS集群版本兼容(可通过Boto3的describe_cluster获取集群版本后匹配) - 多账号管理时,通过Boto3的
Session切换profile或STS Assume Role即可实现跨账号集群访问 - 若嫌手动构造参数麻烦,也可以用Boto3生成临时kubeconfig文件,再通过
--kubeconfig参数指定给kubectl
内容的提问来源于stack exchange,提问作者Gilad Tayeb
相关产品推荐
相关产品推荐

