如何通过AWS Lambda Python SDK列出指定命名空间的EKS Pods
解决方案:在AWS Lambda中用Python列出EKS特定命名空间的Pod
核心逻辑
Boto3的EKS服务客户端仅负责集群层面的管理操作(比如创建/删除集群、更新配置),不直接支持Kubernetes资源(如Pod)的查询。要实现等效于kubectl get pods -n <namespace>的功能,需要结合Kubernetes官方Python客户端,再通过Boto3获取EKS集群的认证凭证完成授权。
步骤1:准备Lambda依赖
Lambda默认不带kubernetes库,需通过以下方式添加:
- 本地安装依赖:
pip install kubernetes -t ./layer/python - 将打包后的文件创建为Lambda层,关联到目标Lambda函数
步骤2:完整代码实现
以下代码包含EKS认证、K8s客户端初始化和Pod查询逻辑:
import boto3 from kubernetes import client, config from kubernetes.config.kube_config import KubeConfigLoader, Configuration def lambda_handler(event, context): # 替换为你的集群名称和目标命名空间 cluster_name = "your-eks-cluster-name" target_namespace = "your-target-namespace" # 1. 获取EKS集群基础信息 eks_client = boto3.client('eks') cluster_info = eks_client.describe_cluster(name=cluster_name) endpoint = cluster_info['cluster']['endpoint'] ca_data = cluster_info['cluster']['certificateAuthority']['data'] # 2. 构建临时KubeConfig kube_config = { "apiVersion": "v1", "clusters": [{ "cluster": { "server": endpoint, "certificate-authority-data": ca_data }, "name": cluster_name }], "contexts": [{ "context": { "cluster": cluster_name, "user": f"aws-eks-{cluster_name}" }, "name": cluster_name }], "current-context": cluster_name, "kind": "Config", "preferences": {}, "users": [{ "name": f"aws-eks-{cluster_name}", "user": { "exec": { "apiVersion": "client.authentication.k8s.io/v1beta1", "command": "aws", "args": ["eks", "get-token", "--cluster-name", cluster_name] } } }] } # 3. 加载配置并初始化K8s客户端 loader = KubeConfigLoader(kube_config) k8s_config = type.__call__(Configuration) loader.load_and_set(k8s_config) k8s_api = client.CoreV1Api(client.ApiClient(k8s_config)) # 4. 查询目标命名空间的Pod pods = k8s_api.list_namespaced_pod(namespace=target_namespace) # 提取关键信息返回 pod_list = [] for pod in pods.items: pod_list.append({ "name": pod.metadata.name, "status": pod.status.phase, "node": pod.spec.node_name, "created_at": pod.metadata.creation_timestamp.strftime("%Y-%m-%d %H:%M:%S") }) return {"statusCode": 200, "body": pod_list}
步骤3:配置Lambda权限
Lambda执行角色需要添加以下IAM权限:
eks:DescribeCluster:用于获取集群端点和CA证书eks:GetToken:用于生成K8s API的认证令牌- 同时需要在EKS集群的
aws-authConfigMap中配置RBAC,允许该角色访问目标命名空间的Pod资源
关键说明
- Boto3无法直接操作K8s资源的原因:EKS服务是AWS层面的集群管理API,和Kubernetes原生资源API属于两个独立体系
- 认证原理:通过
aws eks get-token命令生成临时令牌,Lambda执行角色的身份会自动被AWS和EKS集群识别,无需手动配置密钥
内容的提问来源于stack exchange,提问作者ctgopinaath
相关产品推荐
相关产品推荐

