You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将kubectl get pods -o json输出导入Pandas DataFrame(含容器资源)

将Kubectl Pod数据导入Pandas DataFrame(含多容器资源信息)

下面是完整的实现代码,解决多容器拆分及资源请求/限制提取的问题:

import json
import pandas as pd
import subprocess

# 执行kubectl命令并加载JSON数据,subprocess比os.popen更安全可控
result = subprocess.run(['kubectl', 'get', 'pods', '-o', 'json'], capture_output=True, text=True)
pods_json = json.loads(result.stdout)['items']

# 初始化存储数据的列表
pod_container_records = []

# 遍历每个Pod对象
for pod in pods_json:
    # 提取Pod核心元数据与状态
    pod_basic = {
        'pod_name': pod['metadata']['name'],
        'namespace': pod['metadata']['namespace'],
        'pod_phase': pod['status']['phase'],
        'node_name': pod['status'].get('nodeName', '')  # 处理节点未调度的情况
    }
    
    # 遍历Pod内的每个容器,拆分多容器数据
    for container in pod['spec']['containers']:
        # 提取容器基础信息
        container_basic = {
            'container_name': container['name'],
            'image': container['image']
        }
        
        # 提取资源请求(CPU、内存),缺失时用Pandas缺失值标记
        resources = container.get('resources', {})
        requests = resources.get('requests', {})
        container_basic['request_cpu'] = requests.get('cpu', pd.NA)
        container_basic['request_memory'] = requests.get('memory', pd.NA)
        
        # 提取资源限制(CPU、内存),缺失时用Pandas缺失值标记
        limits = resources.get('limits', {})
        container_basic['limit_cpu'] = limits.get('cpu', pd.NA)
        container_basic['limit_memory'] = limits.get('memory', pd.NA)
        
        # 合并Pod与容器信息,添加到记录列表
        pod_container_records.append({**pod_basic, **container_basic})

# 转换为Pandas DataFrame
pod_df = pd.DataFrame(pod_container_records)

# 查看结果示例
print(pod_df[['pod_name', 'container_name', 'request_cpu', 'limit_memory']].head())

关键细节说明

  • 替换os.popen:使用subprocess.run可以更安全地执行系统命令,还能捕获错误输出(比如kubectl权限不足的情况),避免潜在的安全问题。
  • 多容器拆分:通过嵌套循环,每个容器单独生成一条DataFrame记录,确保每个容器的资源信息不会被合并或丢失。
  • 缺失值处理:用.get()方法逐层提取字段,不存在的资源配置用pd.NA标记,符合Pandas的缺失值处理逻辑,方便后续分析。
  • 信息合并:利用字典解包语法{**dict1, **dict2}快速合并Pod级和容器级的信息,代码更简洁。

可选扩展:添加容器状态信息

如果需要获取容器的就绪状态等信息,可以从Pod的status.containerStatuses中匹配对应容器的状态,添加到container_basic中:

# 匹配当前容器的状态信息
container_status = next(
    (cs for cs in pod['status'].get('containerStatuses', []) if cs['name'] == container['name']),
    {}
)
container_basic['container_ready'] = container_status.get('ready', False)
container_basic['restart_count'] = container_status.get('restartCount', 0)

内容的提问来源于stack exchange,提问作者Jeromba6

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 12:40:53