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}')
关键说明
objects()方法返回的是基于Kubernetes Python Client的模型对象,可直接通过属性访问metadata(元数据)和status(状态)下的所有字段- 资源年龄需自行计算,通过
creationTimestamp(UTC时间)与当前UTC时间做差即可,客户端未提供直接快捷方法 - 不同类型资源的状态字段结构不同,可参考Kubernetes官方API文档对应资源的
status字段定义提取信息
内容的提问来源于stack exchange,提问作者mayo09876
相关产品推荐
相关产品推荐

