- 后端
- 云原生
- 容器编排
【免费下载链接】python
Official Python client library for kubernetes
导读
本文以 Kubernetes 官方 Python 客户端仓库(kubernetes/client/models/v1_persistent_volume_claim_status.py)中由 OpenAPI Generator 生成的V1PersistentVolumeClaimStatus模型为核心,系统讲解 PersistentVolumeClaim(PVC)状态对象在 Python 客户端中的完整字段定义、类型映射、序列化行为以及底层实现原理。读完本文后,你将能够熟练使用该模型读取 PVC 的容量、访问模式、扩容状态、健康状态与卷属性修改状态,并在异步(kubernetes.aio)与同步(kubernetes.client)两套客户端之间自如切换使用。
一、模型定位:PVC 的"运行态快照"
在 Kubernetes 存储体系中,PVC 是用户对持久化存储的"申请单",而status字段则是该申请单在控制面与节点侧被处理后形成的运行态快照。官方 API 定义中PersistentVolumeClaim.status即由V1PersistentVolumeClaimStatus模型承载,这一点在客户端源码中可直接印证:v1_persistent_volume_claim.py 声明了status: Optional[V1PersistentVolumeClaimStatus] = None。
该模型对应 OpenAPI 文档版本为release-1.37(见源码文件头注释),由 OpenAPI Generator 自动生成,用户不应手工修改生成文件。
二、字段全景:9 个属性的类型与语义
V1PersistentVolumeClaimStatus继承自pydantic.BaseModel(源码 v1_persistent_volume_claim_status.py),共声明 9 个字段,全部可空。以下依据源码中Field的 description 逐一说明:
| 属性(Python 名) | JSON 键(别名) | 类型 | 语义 |
|---|---|---|---|
access_modes | accessModes | Optional[List[StrictStr]] | 卷实际具备的访问模式,如ReadWriteOnce、ReadOnlyMany、ReadWriteMany、ReadWriteOncePod |
allocated_resource_statuses | allocatedResourceStatuses | Optional[Dict[str, StrictStr]] | 正在扩容的资源状态,键遵循 Kubernetes 标签语法,值为ControllerResizeInProgress等状态 |
allocated_resources | allocatedResources | Optional[Dict[str, StrictStr]] | 已分配给 PVC 的资源(含容量)跟踪,扩容请求进行时该值可能大于实际容量 |
capacity | capacity | Optional[Dict[str, StrictStr]] | 底层卷的实际资源,典型键为storage |
conditions | conditions | Optional[List[V1PersistentVolumeClaimCondition]] | 当前条件列表,扩容中时会出现Resizing条件 |
current_volume_attributes_class_name | currentVolumeAttributesClassName | Optional[StrictStr] | PVC 当前正在使用的 VolumeAttributesClass 名称;未设置表示未应用该类 |
health_status | healthStatus | Optional[V1VolumeHealthStatus] | CSI 控制器插件上报的卷健康信息 |
modify_volume_status | modifyVolumeStatus | Optional[V1ModifyVolumeStatus] | 卷属性修改(modify volume)操作的控制器状态 |
phase | phase | Optional[StrictStr] | PVC 当前阶段,如Pending、Bound、Lost |
其中access_modes、allocated_resource_statuses等字段通过AliasChoices("accessModes", "access_modes")同时接受驼峰(wire 格式)与下划线(Python 风格)两种输入键;capacity、conditions、phase三个字段则不存在别名,直接使用同名键。
关键字段语义细节
allocatedResourceStatuses 的合法状态值(源码 description 完整列出):
ControllerResizeInProgress:扩容控制器在控制面开始调整卷容量ControllerResizeFailed:扩容在控制器侧以终止性错误失败NodeResizePending:控制器已完成调整,但节点上仍需进一步扩容NodeResizeInProgress:kubelet 开始在节点上扩容NodeResizeFailed:kubelet 侧扩容以终止性错误失败(瞬时错误不会触发该状态)
典型示例(源码文档字符串中给出):pvc.status.allocatedResourceStatus['storage'] = "ControllerResizeInProgress"。当该字段未设置时,表示当前 PVC 没有进行中的扩容操作。控制器遇到未知的资源名或状态时应当忽略该更新——这是为了让只负责容量扩容的控制器不会误处理其他资源相关的变更。
allocatedResources 的配额计算规则:上报的容量在存在卷扩容请求时可能大于实际容量;存储配额计算时取allocatedResources与spec.resources中的较大值;若allocatedResources未设置则仅以spec.resources计算。扩容容量请求被调低时,仅当没有进行中的扩容操作且实际卷容量不大于请求容量时才会下调allocatedResources。
phase 的取值:Pending(未绑定)、Bound(已绑定 PV)、Lost(底层卷丢失)。注意 phase 是历史遗留字段,官方更推荐通过conditions判断实际状态。
三、嵌套子模型:conditions、healthStatus 与 modifyVolumeStatus
1. V1PersistentVolumeClaimCondition
由 v1_persistent_volume_claim_condition.py 定义,6 个字段:
type(必填):条件类型,扩容时可能为ResizeStarted等status(必填):True/False/Unknownlast_probe_time/last_transition_time(datetime):最近探测/状态转换时间message:人类可读的最近转换详情reason:短小、机器可读的转换原因,如Resizing表示底层卷正在扩容
2. V1VolumeHealthStatus
由 v1_volume_health_status.py 定义,包含healthConditions(List[V1VolumeHealthCondition],最多上报 16 条)与lastTransitionTime。每条V1VolumeHealthCondition(v1_volume_health_condition.py)的status字段取值包括:
Inaccessible:卷无法访问DataLoss:卷检测到数据丢失Degraded:卷以降低的能力运行
3. V1ModifyVolumeStatus
由 v1_modify_volume_status.py 定义,两个字段:
status(必填):Pending(因 VolumeAttributesClass 不存在等不满足条件而无法修改)、InProgress(卷正在被修改)、Infeasible(请求被 CSI 驱动判定无效拒绝)targetVolumeAttributesClassName:正在对账的目标 VolumeAttributesClass 名称
源码注释特别提醒:未来可能新增状态值,消费方应检查未知状态并适当失败处理。
四、源码实现:从构造到序列化
4.1 构造与输入预处理
__preprocess_input_names在from_dict中被调用,将下划线风格键(如access_modes)规范化为驼峰键,统一进入model_validate。该模型基于 pydantic v2 的ConfigDict配置(源码 L172-L178):
validate_by_name=True、validate_by_alias=True:按字段名或别名均可校验validate_assignment=True:属性赋值时即时校验extra="forbid":拒绝未知字段,防止拼写错误被静默吞掉
4.2 序列化出口:to_dict / to_json / from_dict
to_dict(serialize=False)返回 Python 命名键(下划线);serialize=True时输出 wire 键(驼峰)to_json()使用json.dumps(to_jsonable_python(...))输出别名字段的 JSON 字符串from_dict将 dict 递归转换,conditions列表逐项调用V1PersistentVolumeClaimCondition.from_dict,healthStatus、modifyVolumeStatus同理to_str()/__repr__使用pprint.pformat输出格式化字符串,便于调试
同步与异步两套实现(kubernetes/client/models/与kubernetes/aio/client/models/)除导入路径前缀不同外逻辑完全一致,异步包还提供from_json等对称方法。
4.3 幂等与相等性
__eq__通过to_dict()比较两个实例是否相等(源码 L189-L194),即值语义比较而非对象引用比较,方便在缓存、去重场景中使用。
五、实战:如何用 Python 客户端读取 PVC 状态
以下代码演示读取 PVC 的 status 并解析关键字段(适用于同步客户端):
from kubernetes import client, config config.load_kube_config() v1 = client.CoreV1Api() pvc = v1.read_namespaced_persistent_volume_claim( name="my-data-pvc", namespace="default" ) status = pvc.status if status is None: print("PVC 尚无状态信息(可能刚创建)") else: print("phase:", status.phase) # Pending / Bound / Lost print("capacity:", status.capacity) # 如 {'storage': '10Gi'} print("accessModes:", status.access_modes) # 如 ['ReadWriteOnce'] if status.conditions: for c in status.conditions: print(f"condition: type={c.type} status={c.status} reason={c.reason} message={c.message}") if status.allocated_resource_statuses: for resource, resize_state in status.allocated_resource_statuses.items(): print(f"resize[{resource}] = {resize_state}") # 如 storage = ControllerResizeInProgress if status.modify_volume_status: print("modifyVolumeStatus:", status.modify_volume_status.status) if status.health_status and status.health_status.health_conditions: for hc in status.health_status.health_conditions: print(f"health: {hc.status} ({hc.reason}) {hc.message}")异步客户端对应写法
异步包(kubernetes.aio)使用完全相同的数据模型,配合asyncio使用:
import asyncio from kubernetes import client, config from kubernetes.aio import client as aio_client async def main(): config.load_kube_config() async with aio_client.ApiClient() as api_client: v1 = aio_client.CoreV1Api(api_client) pvc = await v1.read_namespaced_persistent_volume_claim( name="my-data-pvc", namespace="default" ) status = pvc.status if status and status.capacity: print("async capacity:", status.capacity) if status and status.allocated_resource_statuses: print("async resize status:", status.allocated_resource_statuses) asyncio.run(main())注意:V1PersistentVolumeClaimStatus所有字段均为可选,实际集群返回的 status 内容取决于 PVC 的生命周期阶段——新建未绑定 PVC 通常只有phase=Pending,绑定后才逐渐出现capacity、accessModes等字段,扩容进行中才会出现allocatedResourceStatuses与Resizing条件。
六、字段别名与 wire 格式的完整对照
attribute_map(源码 L130-L140)定义了 Python 属性名到 JSON 键的映射:
{ "access_modes": "accessModes", "allocated_resource_statuses": "allocatedResourceStatuses", "allocated_resources": "allocatedResources", "capacity": "capacity", "conditions": "conditions", "current_volume_attributes_class_name": "currentVolumeAttributesClassName", "health_status": "healthStatus", "modify_volume_status": "modifyVolumeStatus", "phase": "phase", }在 API 交互层面,PVC status 的完整 JSON 形态示例:
{ "accessModes": ["ReadWriteOnce"], "capacity": {"storage": "10Gi"}, "phase": "Bound", "conditions": [ {"type": "Resizing", "status": "True", "reason": "Resizing", "lastTransitionTime": "2026-10-01T08:00:00Z"} ], "allocatedResourceStatuses": {"storage": "ControllerResizeInProgress"}, "allocatedResources": {"storage": "20Gi"}, "currentVolumeAttributesClassName": "gold", "modifyVolumeStatus": {"status": "InProgress", "targetVolumeAttributesClassName": "gold"}, "healthStatus": {"healthConditions": [{"status": "Degraded", "reason": "SlowDisk", "message": "latency high"}], "lastTransitionTime": "2026-10-01T08:00:00Z"} }七、使用建议与注意事项
- 不要依赖 phase 判断状态:
phase是遗留字段,在扩缩容、回收等场景下不总是可靠,应优先解析conditions(如Resizing、FileSystemResizePending)。 - 扩容监控三板斧:同时观察
allocatedResourceStatuses(阶段状态机)、allocatedResources(目标容量)与conditions(人类可读原因),三者结合可准确还原扩容进度与失败点。 - 处理未知枚举值:
modifyVolumeStatus.status与健康条件status未来可能新增取值,消费时应对未知值做兜底而非假定枚举闭合。 - 严格模式下的容错:
extra="forbid"意味着面对未来新版本 API 新增的 status 字段,旧版客户端反序列化会直接报错;升级集群前应同步升级本仓库客户端版本(当前生成版本对应release-1.37)。 - 序列化选择:调用
to_dict()得到 Python 命名键便于本地处理,调用to_json()或to_dict(serialize=True)得到 wire 格式便于构造 Kubernetes API 请求体。
八、相关源码与文档索引
- 模型定义:kubernetes/client/models/v1_persistent_volume_claim_status.py 与异步版 kubernetes/aio/client/models/v1_persistent_volume_claim_status.py
- 上层 PVC 对象:kubernetes/client/models/v1_persistent_volume_claim.py
- 状态条件子模型:kubernetes/aio/client/models/v1_persistent_volume_claim_condition.py
- 卷健康状态子模型:kubernetes/aio/client/models/v1_volume_health_status.py、v1_volume_health_condition.py
- 卷属性修改状态子模型:kubernetes/aio/client/models/v1_modify_volume_status.py
- Spec 对照:kubernetes/aio/client/models/v1_persistent_volume_claim_spec.py
- 实战示例:examples/pod_config_list.py、examples/out_of_cluster_config.py 展示了
load_kube_config与客户端初始化的常见用法
- 后端
- 云原生
- 容器编排
【免费下载链接】python
Official Python client library for kubernetes
相关推荐
Kubernetes Python 客户端详解:V1DaemonSetStatus 模型字段、序列化与 DaemonSet 状态读取实战
Kubernetes Python 客户端详解:V1DaemonSetStatus 模型字段、序列化与 DaemonSet 状态读取实战 导读 V1Daemon
后端云原生容器编排Kubernetes Python 客户端 V1ReplicationControllerCondition 模型详解:ReplicationController 状态条件的字段、序列化与实战解析
Kubernetes Python 客户端 V1ReplicationControllerCondition 模型详解:ReplicationControlle
后端云原生容器编排Kubernetes Python 客户端中的 V1ServiceStatus 模型:Service 状态字段、双客户端体系与序列化机制详解
Kubernetes Python 客户端中的 V1ServiceStatus 模型:Service 状态字段、双客户端体系与序列化机制详解 本文围绕 kube
后端云原生容器编排
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考