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

OpenShift Client Python提取资源详情报错:Selector无ages属性

解决OpenShift Client Python获取资源详细属性(年龄、完成数等)的问题

问题描述

我正在遵循OpenShift Client Python文档,已通过自行编写的脚本成功列出Pod、Job、Deployment等资源。尝试提取资源的年龄、完成数或就绪状态等更多详情时,未在文档中找到相关操作说明。使用oc.selector('jobs').ages()报错,提示Selector没有'ages'属性。

原测试代码:

namespace = ['testNamespace']
for ns in namespace:
    with oc.project(ns):

        print('Jobs in {}: \n{}'.format(oc.get_project_name(), '\n'.join(oc.selector('jobs').names())))

        print('Ages of jobs in {}: \n{}'.format(oc.get_project_name(), '\n'.join(oc.selector('jobs').ages())))

解决方案

oc.selector()提供的names()是简化快捷方法,但并没有内置的ages()方法。要获取资源详细属性,需通过objects()方法获取完整资源对象,再从对象的metadata或status字段中提取所需信息。

示例代码(Job资源为例)

from datetime import datetime, timezone

namespace = ['testNamespace']
for ns in namespace:
    with oc.project(ns):
        print(f'Jobs in {oc.get_project_name()}:')
        # 获取所有Job的完整对象
        job_objects = oc.selector('jobs').objects()
        for job in job_objects:
            # 提取资源名称
            job_name = job.metadata.name
            
            # 计算资源年龄:通过创建时间与当前UTC时间的差值
            creation_ts = datetime.fromisoformat(job.metadata.creationTimestamp.replace('Z', '+00:00'))
            age = datetime.now(timezone.utc) - creation_ts
            # 格式化年龄,去掉微秒部分
            formatted_age = str(age).split('.')[0]
            
            # 提取Job完成数与期望完成数
            succeeded_count = job.status.succeeded if hasattr(job.status, 'succeeded') else 0
            desired_completions = job.spec.completions or 1
            
            # 判断Job状态
            if succeeded_count == desired_completions:
                job_status = 'Completed'
            elif job.status.failed:
                job_status = 'Failed'
            else:
                job_status = 'Running'
            
            print(f'- {job_name}: Age={formatted_age}, Succeeded={succeeded_count}/{desired_completions}, Status={job_status}')

其他资源的属性提取示例

  • Pod就绪状态:
    for pod in oc.selector('pods').objects():
        ready_status = next((c.status for c in pod.status.conditions if c.type == 'Ready'), 'Unknown')
        # 年龄计算逻辑同Job示例
        print(f'- {pod.metadata.name}: Ready={ready_status}, Age={formatted_age}')
    
  • Deployment就绪副本数:
    for deploy in oc.selector('deployments').objects():
        ready_replicas = deploy.status.readyReplicas or 0
        desired_replicas = deploy.spec.replicas or 1
        # 年龄计算逻辑同Job示例
        print(f'- {deploy.metadata.name}: Ready={ready_replicas}/{desired_replicas}, Age={formatted_age}')
    

关键说明

  1. objects()方法返回的是基于Kubernetes Python Client的模型对象,可直接通过属性访问metadata(元数据)和status(状态)下的所有字段
  2. 资源年龄需自行计算,通过creationTimestamp(UTC时间)与当前UTC时间做差即可,客户端未提供直接快捷方法
  3. 不同类型资源的状态字段结构不同,可参考Kubernetes官方API文档对应资源的status字段定义提取信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 11:52:22