- 后端
- 云原生
- 容器编排
【免费下载链接】python
Official Python client library for kubernetes
本文以官方 Kubernetes Python 客户端(kubernetes 与 kubernetes.aio 双版本)中VolumeAttributesClass模型为切入点,系统讲解该模型的数据结构、字段约束、序列化行为,以及它与StorageV1Api操作方法和PersistentVolumeClaim修改流程之间的配合关系。读完本文,你将掌握如何用同步或 asyncio 客户端创建、查询、更新和删除VolumeAttributesClass资源,并理解 CSI 驱动卷属性热修改背后的 API 模型设计。
1. 关联文档与模型实现:automodule 驱动的文档体系
doc/source/kubernetes.aio.client.models.v1beta1_volume_attributes_class.rst是 Sphinx API 文档的模块页,全文使用automodule指令:
.. automodule:: kubernetes.aio.client.models.v1beta1_volume_attributes_class :members: :show-inheritance: :undoc-members:也就是说,页面正文全部由 Sphinx 在构建时从 Python 模块的类定义与 docstring 自动提取生成,:members:会展开该模块导出的全部类与成员。因此该文档的实际"正文",就是仓库中生成的模型类本身。
从当前仓库源码结构看(OpenAPI 版本为 release-1.37,见各模型文件头部的The version of the OpenAPI document: release-1.37),VolumeAttributesClass资源已经稳定到v1,对应的生成模块为:
- 同步客户端:kubernetes/client/models/v1_volume_attributes_class.py
- asyncio 客户端:kubernetes/aio/client/models/v1_volume_attributes_class.py
两个目录下的同名模块内容一致,kubernetes.aio为异步变体。v1beta1命名的文档页面是早期 API 版本(storage.k8s.io/v1beta1)时期的文档生成产物,在当前 release-1.37 的 scripts/swagger.json 中,该资源定义的 group/version/kind 为storage.k8s.io/v1、VolumeAttributesClass。
2. V1VolumeAttributesClass 模型字段详解
V1VolumeAttributesClass定义在 kubernetes/aio/client/models/v1_volume_attributes_class.py,类文档指出:VolumeAttributesClass 表示由 CSI 驱动定义的一组可变卷属性(mutable volume attributes)规格。它可以在 PersistentVolumeClaim 动态供给(dynamic provisioning)时被指定,也可以在供给完成后通过修改 PVC spec 来更换。
其字段、类型与约束如下:
| 字段(Python) | 线上 JSON 字段 | 类型 | 必填/默认 | 约束说明 |
|---|---|---|---|---|
api_version | apiVersion | Optional[StrictStr] | 默认None | 对象的版本化 schema 标识;服务端会将可识别的 schema 转换到最新内部值,可能拒绝未识别值 |
driver_name | driverName | StrictStr | 必填 | CSI 驱动的名称,不可变(immutable) |
kind | kind | Optional[StrictStr] | 默认None | REST 资源的 Kind 字符串,通常为VolumeAttributesClass,不可更新 |
metadata | metadata | Optional[V1ObjectMeta] | 默认None | 标准对象元数据,复用 V1ObjectMeta 模型 |
parameters | parameters | Optional[Dict[str, StrictStr]] | 默认None | 由 CSI 驱动定义的卷属性键值对,对 Kubernetes 不透明,直接透传给 CSI 驱动 |
对照 scripts/swagger.json 中的v1.VolumeAttributesClass定义,required数组中仅包含driverName,与模型类中driver_name: StrictStr(无默认值)的必填约束完全一致。
2.1 parameters 字段的特殊语义
parameters是理解该模型的关键字段,其 docstring 与 OpenAPI 描述给出了三条重要规则:
- 对 Kubernetes 透明:参数值对 Kubernetes 不透明,被直接传递给 CSI 驱动;底层存储提供方支持在已有卷上修改这些属性。
- parameters 本身不可变:要触发卷更新,应使用新参数创建新的
VolumeAttributesClass,再更新 PVC 使其引用新类,而不是原地修改 parameters。 - 硬性限制:该字段必须有内容(至少一个键值对),键不能为空,参数总数上限 512 个,累计大小上限 256K。若 CSI 驱动拒绝无效参数,目标 PVC 会在
modifyVolumeStatus字段中被置为Infeasible状态。
2.2 字段别名与模型配置(源码级)
模型类继承自pydantic.BaseModel,并通过AliasChoices同时接受 snake_case 与 camelCase 两种写法:
api_version: Optional[StrictStr] = Field( default=None, validation_alias=AliasChoices("apiVersion", "api_version"), serialization_alias="apiVersion", ... )同时model_config开启了:
model_config = ConfigDict( validate_by_name=True, validate_by_alias=True, validate_assignment=True, extra="forbid", protected_namespaces=(), )这意味着:反序列化时既能用driver_name也能用driverName构造对象;赋值时触发校验;出现未知字段会直接报错(extra="forbid")。openapi_types与attribute_map两个类属性记录了字段类型映射与 JSON key 映射,供序列化基础设施使用。
3. 序列化与反序列化能力
模型类提供了完整的对象转换方法,直接可复制使用:
| 方法 | 作用 |
|---|---|
to_str()/__repr__ | 返回可读的字符串表示(pprint 格式化) |
to_json() | 使用线上别名(camelCase)输出 JSON 字符串 |
from_json(json_str) | 从 JSON 字符串构造实例 |
to_dict(serialize=False) | 返回全部声明字段的字典;serialize=True时使用线上 wire 名称 |
from_dict(obj) | 从字典构造实例,metadata字段会递归调用V1ObjectMeta.from_dict() |
在 kubernetes/aio/client/models/v1_volume_attributes_class.py 中,to_dict被挂载了 OpenAPI Generator 的现代投影(__openapi_generator_modern_projection):exclude_none=True使未设置的None字段不会进入输出,而metadata会递归调用其自身的to_dict()。这保证了嵌套模型序列化后仍保持合法的 Kubernetes 对象形态。
3.1 配套的列表模型 V1VolumeAttributesClassList
同目录下还有 v1_volume_attributes_class_list.py 定义的V1VolumeAttributesClassList,字段为:
api_version/kind/metadata(类型为V1ListMeta)items: List[V1VolumeAttributesClass](必填,元素为V1VolumeAttributesClass)
两者都在 kubernetes/aio/client/models/init.py 中被导出,可通过from kubernetes.aio.client.models import V1VolumeAttributesClass, V1VolumeAttributesClassList直接导入。
4. StorageV1Api 中的资源操作
VolumeAttributesClass是storage.k8s.io/v1组的集群级(cluster-scoped)资源,相关操作全部位于StorageV1Api:
- 同步版本:kubernetes/client/api/storage_v1_api.py(
create_volume_attributes_class、read_volume_attributes_class、list_volume_attributes_class、patch_volume_attributes_class、replace_volume_attributes_class、delete_volume_attributes_class等) - asyncio 版本:kubernetes/aio/client/api/storage_v1_api.py,同名方法均为
async def,并额外提供_with_http_info(返回含状态码/响应头的ApiResponse)与_without_preload_content变体
以 asyncio 客户端的create_volume_attributes_class为例(见 storage_v1_api.py),其签名包含:
body: V1VolumeAttributesClass(必填请求体)pretty:是否美化输出dry_run:All表示执行全部 dry-run 阶段,不持久化修改field_manager:变更操作者标识,长度小于 128 字符field_validation:Ignore/Warn/Strict三档,控制对未知/重复字段的处理(v1.23 起默认Warn)
方法内部先调用序列化助手_create_volume_attributes_class_serialize组装请求参数,再通过api_client.call_api发送请求,最后按_response_types_map(200/201/202 均反序列化为V1VolumeAttributesClass,401 返回None)反序列化响应。同步客户端版本通过_call_with_legacy_options完成同样的流程。
5. 与 PVC 卷属性修改机制的联动
VolumeAttributesClass存在的意义,是让 PVC 在创建后能通过 CSI 驱动修改卷属性。这一点在 PVC 模型中有直接体现:
- kubernetes/aio/client/models/v1_persistent_volume_claim_spec.py 中的
volume_attributes_class_name(线上名volumeAttributesClassName):指定该 PVC 使用的VolumeAttributesClass。与storageClassName用途不同,它可以在 PVC 创建后被修改;空字符串或 nil 表示不应用任何类。若引用的类不存在,PVC 的modifyVolumeStatus会进入Pending状态。 - kubernetes/aio/client/models/v1_modify_volume_status.py 中的
V1ModifyVolumeStatus:记录卷修改状态,status取值为:Pending:PVC 因未满足条件(如指定的 VolumeAttributesClass 不存在)而无法修改;InProgress:卷正在被修改;Infeasible:请求被 CSI 驱动判定为无效,需要指定合法的 VolumeAttributesClass 来解决。
同时 swagger.json 显示,PersistentVolumeSpec.volumeAttributesClassName也是可变字段——当卷被成功更新到新类后,CSI 驱动会更新该字段;未绑定的 PersistentVolume 在绑定过程中也会用该字段匹配未绑定的 PVC。
6. 实战示例
6.1 同步客户端:创建 VolumeAttributesClass
from kubernetes import client, config config.load_kube_config() v1 = client.StorageV1Api() body = client.V1VolumeAttributesClass( api_version="storage.k8s.io/v1", kind="VolumeAttributesClass", metadata=client.V1ObjectMeta(name="fast-tier"), driver_name="hostpath.csi.k8s.io", parameters={"provisioningMode": "Immediate"}, ) try: created = v1.create_volume_attributes_class(body=body) print(created.metadata.name, created.driver_name) except client.ApiException as e: print(f"Exception: {e.status} {e.reason}")注意driver_name为必填,构造时缺失会触发 pydantic 校验错误。
6.2 asyncio 客户端:列表与删除
asyncio 用法遵循仓库 README 中的统一模式(见 README.md):使用config.load_kube_config()加载配置,通过ApiClient上下文管理器自动关闭 HTTP 会话:
import asyncio from kubernetes.aio import client, config from kubernetes.aio.client.api_client import ApiClient async def main(): await config.load_kube_config() async with ApiClient() as api: v1 = client.StorageV1Api(api) # 列出全部 VolumeAttributesClass ret = await v1.list_volume_attributes_class() for item in ret.items: print(item.metadata.name, item.driver_name, item.parameters) # 删除指定名称的资源 await v1.delete_volume_attributes_class(name="fast-tier") if __name__ == "__main__": asyncio.run(main())6.3 触发卷属性更新
按照 parameters 不可变的语义,正确的更新路径是"新建类 + 改 PVC 引用":
# 1. 创建带新参数的 VolumeAttributesClass new_class = client.V1VolumeAttributesClass( api_version="storage.k8s.io/v1", kind="VolumeAttributesClass", metadata=client.V1ObjectMeta(name="fast-tier-v2"), driver_name="hostpath.csi.k8s.io", parameters={"provisioningMode": "Immediate", "iops": "3000"}, ) v1.create_volume_attributes_class(body=new_class) # 2. 将 PVC 切换到新类 pvc = v1.read_namespaced_persistent_volume_claim(name="my-pvc", namespace="default") pvc.spec.volume_attributes_class_name = "fast-tier-v2" v1.replace_namespaced_persistent_volume_claim( name="my-pvc", namespace="default", body=pvc )随后可通过pvc.status.modify_volume_status.status观察Pending → InProgress → 终态的演进;若进入Infeasible,需要按文档建议将volume_attributes_class_name重置为之前的值(包括 nil)以取消修改。
7. 使用注意事项
- 命名差异:当前仓库的模型与 OpenAPI 定义为
v1稳定版本(V1VolumeAttributesClass);doc/source中保留的v1beta1页面为早期文档生成产物,当前仓库并无v1beta1_volume_attributes_class模块,引用模型时应使用kubernetes.aio.client.models.v1_volume_attributes_class。 - parameters 限制:最多 512 个键值对、累计 256K,键不可为空;违反限制会被 CSI 驱动拒绝并使 PVC 进入
Infeasible。 - 不可变语义:
driverName与parameters都不可原地修改,变更必须以新建对象 + 更新 PVC 引用的方式进行。 - 模型校验严格:
extra="forbid"意味着任何拼写错误的多余字段都会直接抛校验异常,构造对象时务必对照 scripts/swagger.json 中的字段定义。
参考路径索引
- 文档页:doc/source/kubernetes.aio.client.models.v1beta1_volume_attributes_class.rst
- 模型实现(aio):kubernetes/aio/client/models/v1_volume_attributes_class.py、列表模型 v1_volume_attributes_class_list.py
- 模型实现(同步):kubernetes/client/models/v1_volume_attributes_class.py
- API 操作(aio):kubernetes/aio/client/api/storage_v1_api.py
- API 操作(同步):kubernetes/client/api/storage_v1_api.py
- OpenAPI 定义: scripts/swagger.json
- 关联模型:v1_persistent_volume_claim_spec.py(
volumeAttributesClassName)、v1_modify_volume_status.py(modifyVolumeStatus)
- 后端
- 云原生
- 容器编排
【免费下载链接】python
Official Python client library for kubernetes
相关推荐
Kubernetes Python 客户端 V1VolumeAttributesClass 模型详解:用 CSI 卷属性类实现 PVC 动态卷修改
Kubernetes Python 客户端 V1VolumeAttributesClass 模型详解:用 CSI 卷属性类实现 PVC 动态卷修改 本篇技术指南
后端云原生容器编排深入解析 Kubernetes Python 客户端中的 V1PodSecurityContext 模型
深入解析 Kubernetes Python 客户端中的 V1PodSecurityContext 模型 导读 本文围绕 Kubernetes 官方 Pytho
后端云原生容器编排深入解析 Kubernetes Python 异步客户端模型 AdmissionregistrationV1ServiceReference
深入解析 Kubernetes Python 异步客户端模型 AdmissionregistrationV1ServiceReference 导读 Admiss
后端云原生容器编排
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考