- 后端
- 云原生
- 容器编排
【免费下载链接】python
Official Python client library for kubernetes
本文聚焦官方 Python 客户端库(kubernetes)中kubernetes.aio.client.models.v1_csi_driver_spec模块(含其同步版kubernetes.client.models.v1_csi_driver_spec)的V1CSIDriverSpec模型。该模型对应 Kubernetesstorage.k8s.io/v1下CSIDriver对象的spec结构,是声明 CSI 卷驱动程序 attach、挂载、调度、SELinux、ServiceAccount Token 与容量感知等行为的核心配置载体。读完本文,你将掌握V1CSIDriverSpec全部 11 个字段的语义、默认值与不可变性约束,理解其序列化/反序列化机制(to_dict/from_dict/from_json与属性别名映射),并能在StorageV1Api(同步)与StorageV1Api(异步,kubernetes.aio)中完整地创建、读取、更新CSIDriver对象。
模型定位:CSIDriver 的 spec 是什么
在 Kubernetes 存储体系里,CSIDriver是一个集群级(非命名空间)对象,用于描述部署在集群中的某个 CSI(Container Storage Interface)卷驱动。正如 V1CSIDriver 模型 类注释所述:Kubernetes 的 attach/detach 控制器使用该对象判断是否需要执行 attach;kubelet 则使用它判断挂载时是否需要传入 Pod 信息。而V1CSIDriverSpec正是这个对象的spec字段类型。
从 Sphinx 文档入口 doc/source/kubernetes.aio.client.models.v1_csi_driver_spec.rst 看,该 RST 通过automodule指令完整收录V1CSIDriverSpec类的全部成员(:members:、:show-inheritance:、:undoc-members:)。实际模型实现位于 kubernetes/aio/client/models/v1_csi_driver_spec.py(异步包)与 kubernetes/client/models/v1_csi_driver_spec.py(同步包),二者代码逻辑完全一致,仅内部依赖导入路径不同(分别引用kubernetes.aio.client.models.storage_v1_token_request与kubernetes.client.models.storage_v1_token_request)。
V1CSIDriverSpec继承自pydantic.BaseModel,模型头部注释标明其由 OpenAPI Generator 基于 Kubernetesrelease-1.37的 scripts/swagger.json(定义见其中v1.CSIDriverSpec一节)自动生成,因此所有字段的语义描述与 Kubernetes API 服务器端保持严格一致。
十一个字段全景速览
先看模型类中定义的类型映射openapi_types与属性名映射attribute_map(见 v1_csi_driver_spec.py):
| Python 属性(snake_case) | 线上 JSON 字段(camelCase) | 类型 | 默认值 | 是否可变(immutable) |
|---|---|---|---|---|
attach_required | attachRequired | bool | None | 不可变 |
fs_group_policy | fsGroupPolicy | str | None(语义默认ReadWriteOnceWithFSType) | <1.29 不可变,现可变 |
node_allocatable_update_period_seconds | nodeAllocatableUpdatePeriodSeconds | int | None | 可变 |
pod_info_on_mount | podInfoOnMount | bool | None(语义默认false) | <1.29 不可变,现可变 |
prevent_pod_scheduling_if_missing | preventPodSchedulingIfMissing | bool | None(语义默认false) | 可变 |
requires_republish | requiresRepublish | bool | None(语义默认false) | 可变 |
se_linux_mount | seLinuxMount | bool | None(语义默认false) | 可变 |
service_account_token_in_secrets | serviceAccountTokenInSecrets | bool | None | 可变 |
storage_capacity | storageCapacity | bool | None | ≤1.22 不可变,现可变 |
token_requests | tokenRequests | List[StorageV1TokenRequest] | None | 可变 |
volume_lifecycle_modes | volumeLifecycleModes | List[str] | None(语义默认["Persistent"]) | 不可变(beta) |
所有字段均可选(Optional[...]),对应 OpenAPI 定义中每个属性的[optional]标注;openapi_types中token_requests的元素类型为List[StorageV1TokenRequest],volume_lifecycle_modes为List[str]。在 swagger.json 中,tokenRequests标记为x-kubernetes-list-type: atomic(整个列表原子替换),而volumeLifecycleModes标记为x-kubernetes-list-type: set(无序集合语义)。
核心字段逐个深入
attach_required:是否需要 attach 操作
当 CSI 驱动实现了 CSIControllerPublishVolume()方法、即需要"先挂到节点后再挂到 Pod"时,应设置attach_required=True。此时 Kubernetes 的 attach/detach 控制器会调用 attach 卷接口,先检查volumeattachment状态并等待卷完成 attach,再继续执行 mount;CSI external-attacher 组件负责与驱动协调并在 attach 完成后更新volumeattachment状态。显式设置为false时跳过 attach 操作。该字段不可变,创建后不可修改。
fs_group_policy:挂载前是否修改卷属主与权限
fs_group_policy声明底层卷是否支持在挂载前被修改所有权和权限。该字段在 Kubernetes < 1.29 时不可变,1.29 起可变。未设置时语义上默认为ReadWriteOnceWithFSType:此时 Kubernetes 会逐个卷检查是否应修改属主权限——只有在定义了fstype且卷的访问模式包含ReadWriteOnce时,指定的fsGroup才会被应用。
node_allocatable_update_period_seconds:CSINode 可分配容量刷新周期
该整数字段指定驱动对应CSINode可分配容量(allocatable.count)周期性更新的间隔(秒)。一旦设置,周期性更新与"容量相关故障触发"的更新都会被启用;未设置时两类更新都不会发生,allocatable.count保持静态。字段最小允许值为10 秒,且依赖MutableCSINodeAllocatableCountfeature gate 开启。该字段可变。
pod_info_on_mount:挂载时传递 Pod 信息
pod_info_on_mount=True表示驱动在挂载操作中需要额外的 Pod 信息(Pod 名称、UID 等)。开启后,kubelet 会在 CSINodePublishVolume()调用中通过VolumeContext传入以下键值(该键列表未来可能扩充,但键前缀保持不变):
csi.storage.k8s.io/pod.name:Pod 名称csi.storage.k8s.io/pod.namespace:Pod 命名空间csi.storage.k8s.io/pod.uid:string(pod.UID)csi.storage.k8s.io/ephemeral:若卷是由CSIVolumeSource定义的临时内联卷则为"true",否则为"false"
其中csi.storage.k8s.io/ephemeral是 Kubernetes 1.16 引入的特性,仅对同时支持Persistent与Ephemeral两种VolumeLifecycleMode的驱动是必需的。驱动需要自行解析并校验传入的VolumeContext。该字段语义默认false,且在 Kubernetes < 1.29 时不可变,现可变。
prevent_pod_scheduling_if_missing:节点缺失驱动时阻止调度
设置为true时,调度器(以及内嵌默认调度器的组件,如 cluster-autoscaler)不会把 Pod 调度到未安装该 CSI 驱动的节点上。对于内嵌调度器并运行调度模拟的组件,必须通过CSINode对象感知驱动的注册信息,在调度模拟时除创建模拟Node对象外还需创建模拟CSINode对象;否则,当该字段在CSIDriver上全局开启时,任何新加入的节点都可能因缺失驱动信息而被调度器拒绝。这是beta 特性,需要启用VolumeLimitScalingfeature gate,语义默认false。
requires_republish:周期性重新调用 NodePublishVolume
requires_republish=True表示驱动希望 kubelet 周期性地调用NodePublishVolume,以反映挂载卷中任何可能的变化(例如令牌过期后刷新)。注意:首次成功的NodePublishVolume调用之后,后续调用只应更新卷内容,新产生的挂载点不会被运行中的容器看到。该字段默认false。
se_linux_mount:SELinux-o context挂载选项支持
se_linux_mount=True声明驱动支持-o context挂载选项,即驱动必须确保其提供的所有卷可以被不同-o context选项分别挂载(典型场景是提供"块设备上的文件系统"或独立共享卷的存储后端)。当 Pod 显式设置了 SELinux context 并挂载ReadWriteOncePod卷时,Kubernetes 会以-o context=xyz调用NodeStage/NodePublish;未来可能扩展到其他访问模式。无论如何,Kubernetes 都会保证卷只以单个 SELinux context 挂载。设置为false时(默认),Kubernetes 不会向驱动传递任何特殊 SELinux 挂载选项,这典型适用于表示更大共享文件系统子目录的卷。
service_account_token_in_secrets:令牌经 Secrets 字段传递(安全加固)
这是一个 opt-in 字段:设置为true时,CSI 驱动声明希望 service account 令牌通过NodePublishVolumeRequest的Secrets 字段(键csi.storage.k8s.io/serviceAccount.tokens)传递,而非VolumeContext字段。CSI 规范本就为令牌等敏感信息提供了专用的 Secrets 字段,这解决了敏感令牌随卷上下文被记录进日志的安全隐患。驱动必须相应升级为从 Secrets 字段读取令牌。false或未设置时维持既有行为(从VolumeContext读取同一键),保证向后兼容。
关键约束:该字段只能在配置了tokenRequests时设置,否则 API 服务器会直接拒绝该CSIDriverspec(这一点在 kubernetes/docs/V1CSIDriverSpec.md 的属性说明中明确记录)。未设置时默认走VolumeContext传递。
storage_capacity:调度时考虑存储容量
storage_capacity=True表示驱动希望 Pod 调度时考虑其通过创建CSIStorageCapacity对象上报的容量信息。可在部署驱动时立即启用该检查——此时,使用延迟绑定(late binding)的新卷供应会暂停,直到驱动发布合适的CSIStorageCapacity对象;也可以先以false/未设置部署,待容量信息发布后再翻转。该字段在 Kubernetes ≤ 1.22 时不可变,之后可变。
token_requests:需要的 Service Account 令牌规格
驱动需要所挂载 Pod 的 service account 令牌以完成必要认证时,通过该字段声明请求规格,元素为StorageV1TokenRequest(模型见 kubernetes/client/models/storage_v1_token_request.py),其包含两个属性:
audience(必填,str):令牌的目标受众,对应TokenRequestSpec中的 audience,默认取 kube-apiserver 的 audiences;expiration_seconds(可选,int):令牌有效期,与TokenRequestSpec.expirationSeconds默认值一致。
kubelet 会把这些令牌放入 CSINodePublishVolume调用的VolumeContext中,结构如下:
"csi.storage.k8s.io/serviceAccount.tokens": { "<audience>": { "token": <token>, "expirationTimestamp": <expiration timestamp in RFC3339>, }, ... }约束要点:每个TokenRequest的audience必须互不相同,且至多允许一个令牌的 audience 为空字符串。令牌过期后如需获取新令牌,可配合requires_republish周期性地触发NodePublishVolume。
volume_lifecycle_modes:支持的卷生命周期模式
声明驱动支持的卷类型。列表为空时语义默认"Persistent",即 CSI 规范定义、经 Kubernetes 常规 PV/PVC 机制实现的用法;另一种模式为"Ephemeral",卷在 Pod spec 内以CSIVolumeSource内联定义,其生命周期与 Pod 绑定,驱动只会收到对应的NodePublishVolume调用。驱动可支持其中一种或多种,未来可能新增更多模式。该字段为beta,且不可变。
序列化与反序列化:属性别名与校验机制
V1CSIDriverSpec的每个字段都通过 pydantic 的AliasChoices同时接受两种键名输入(见 v1_csi_driver_spec.py),例如AliasChoices("attachRequired", "attach_required")。配合__preprocess_input_names类方法,from_dict既能解析 Kubernetes API 返回的 camelCase JSON(如attachRequired),也能兼容开发者手写的 snake_case 字典(如attach_required),二者都会归一化为 Python 属性名。
模型配置(model_config)启用了validate_by_name、validate_by_alias、validate_assignment(赋值时即校验)与extra="forbid"(拒绝未知字段),因此传入未定义字段会直接报错。__eq__/__ne__基于to_dict()结果比较对象相等性。
该模型提供完整的方法族(kubernetes/docs/V1CSIDriverSpec.md 中的示例同样覆盖了这些用法):
to_str():返回 pprint 格式化字符串;to_json():按线上别名输出 JSON 字符串;from_json(json_str):从 JSON 字符串反序列化实例;to_dict(serialize=False):返回 dict,serialize=False时用 Python 属性名(snake_case),serialize=True时用线上别名(camelCase);from_dict(obj):从 dict 反序列化实例,其中tokenRequests列表项会逐个调用StorageV1TokenRequest.from_dict()。
from kubernetes.client.models.v1_csi_driver_spec import V1CSIDriverSpec # 从 JSON 字符串构建 spec = V1CSIDriverSpec.from_json('{"attachRequired": false, "podInfoOnMount": true}') print(spec.to_dict()) # {'attach_required': False, 'pod_info_on_mount': True, ...} print(spec.to_json()) # 输出含 attachRequired / podInfoOnMount 的 JSON # 从 dict 构建(同时接受 snake_case 键) spec2 = V1CSIDriverSpec.from_dict({ "attach_required": False, "volume_lifecycle_modes": ["Persistent", "Ephemeral"], }) assert spec2 == V1CSIDriverSpec.from_dict(spec2.to_dict())组合使用:从 spec 到完整 CSIDriver 对象
V1CSIDriverSpec不会单独使用,它是 V1CSIDriver 模型 的spec字段类型。V1CSIDriver还包含api_version(如storage.k8s.io/v1)、kind(CSIDriver)与metadata(V1ObjectMeta)。构建完整对象后,通过 StorageV1Api 提供的create_csi_driver/read_csi_driver/list_csi_driver/patch_csi_driver/replace_csi_driver/delete_csi_driver等方法操作集群中的CSIDriver资源。
以下示例展示如何创建一个声明了多种能力的 CSIDriver(同步客户端):
from kubernetes import client, config from kubernetes.client.models.v1_csi_driver import V1CSIDriver from kubernetes.client.models.v1_csi_driver_spec import V1CSIDriverSpec from kubernetes.client.models.storage_v1_token_request import StorageV1TokenRequest config.load_kube_config() api = client.StorageV1Api() spec = V1CSIDriverSpec( attach_required=False, # 无需 attach(如基于主机路径的驱动) pod_info_on_mount=True, # NodePublishVolume 时传递 Pod 信息 storage_capacity=True, # 调度时考虑 CSIStorageCapacity se_linux_mount=False, requires_republish=True, # 周期性重新发布卷内容(配合令牌刷新) token_requests=[StorageV1TokenRequest( # 申请 audience 为 "kubelet" 的令牌 audience="kubelet", expiration_seconds=600, )], volume_lifecycle_modes=["Persistent"], # 仅支持持久卷(默认模式) fs_group_policy="ReadWriteOnceWithFSType", prevent_pod_scheduling_if_missing=False, ) driver = V1CSIDriver( api_version="storage.k8s.io/v1", kind="CSIDriver", metadata=client.V1ObjectMeta(name="example.csi.storage.k8s.io"), spec=spec, ) created = api.create_csi_driver(body=driver) print(created.spec.to_dict())create_csi_driver还支持pretty、dry_run(如"All")、field_manager(长度小于 128 字符的可打印字符)与field_validation(Ignore/Warn/Strict)等查询参数;成功时返回V1CSIDriver(HTTP 200/201/202)。更新不可变字段(如attach_required、volume_lifecycle_modes)时服务端会拒绝请求,这与字段定义中的 immutable 约束一致。
异步(aio)用法
仓库同时提供完整的异步客户端kubernetes.aio,其模型与 API 方法位于独立包中:kubernetes/aio/client/models/v1_csi_driver_spec.py 与 kubernetes/aio/client/api/storage_v1_api.py。异步 API 方法以async def声明(例如async def create_csi_driver(...)),其余签名与同步版一致:
import asyncio from kubernetes import config from kubernetes.aio import client as aio_client async def main(): await aio_client.config.load_kube_config() # 或按需使用 load_incluster_config api = aio_client.StorageV1Api() driver = aio_client.V1CSIDriver( api_version="storage.k8s.io/v1", kind="CSIDriver", metadata=aio_client.V1ObjectMeta(name="example.csi.storage.k8s.io"), spec=aio_client.V1CSIDriverSpec( attach_required=False, volume_lifecycle_modes=["Persistent"], ), ) created = await api.create_csi_driver(body=driver) print(created.spec.volume_lifecycle_modes) await api.close() asyncio.run(main())实践建议与注意事项
- 善用不可变约束:
attach_required与volume_lifecycle_modes不可变,创建前必须一次配置正确;fs_group_policy、pod_info_on_mount、storage_capacity在较新 Kubernetes(≥1.29 / >1.22)中可变,可后续调整。 - 令牌传递二选一:
service_account_token_in_secrets必须配合token_requests使用,且驱动端需相应升级读取位置;若使用旧的VolumeContext传递方式,注意敏感令牌可能进入日志。 - 容量感知:开启
storage_capacity的驱动需持续发布CSIStorageCapacity对象,否则延迟绑定的卷供应会暂停等待。 - 特性门控依赖:
node_allocatable_update_period_seconds依赖MutableCSINodeAllocatableCount,prevent_pod_scheduling_if_missing依赖VolumeLimitScaling,使用前需确认集群已启用对应 feature gate(本文模型基于release-1.37的 scripts/swagger.json 生成)。 - 别名兼容:由于
AliasChoices同时接受 camelCase 与 snake_case,且extra="forbid"拒绝未知字段,从 API 响应反序列化时可直接使用V1CSIDriverSpec.from_dict(response["spec"]),无需手工转换键名。
参考资料(仓库内)
- 文档入口:doc/source/kubernetes.aio.client.models.v1_csi_driver_spec.rst
- 模型实现(异步/同步):kubernetes/aio/client/models/v1_csi_driver_spec.py、kubernetes/client/models/v1_csi_driver_spec.py
- 父对象与依赖模型:kubernetes/client/models/v1_csi_driver.py、kubernetes/client/models/storage_v1_token_request.py
- API 方法(同步/异步):kubernetes/client/api/storage_v1_api.py、kubernetes/aio/client/api/storage_v1_api.py
- Markdown 版模型文档:kubernetes/docs/V1CSIDriverSpec.md
- OpenAPI 定义来源:scripts/swagger.json(
v1.CSIDriverSpec定义,Kubernetes release-1.37)
- 后端
- 云原生
- 容器编排
【免费下载链接】python
Official Python client library for kubernetes
相关推荐
LightDash 数据库层实战指南:基于 Knex.js 与 PostgreSQL 的类型安全实体、分页与迁移机制
LightDash 数据库层实战指南:基于 Knex.js 与 PostgreSQL 的类型安全实体、分页与迁移机制 本文围绕 LightDash 后端 pac
后端云原生容器编排鸣潮终极自动化指南:3分钟解放双手,智能战斗与声骸管理全解析
鸣潮终极自动化指南:3分钟解放双手,智能战斗与声骸管理全解析 还在为《鸣潮》中重复刷副本、做日常任务而感到疲惫吗?ok ww是一款专为《鸣潮》玩家设计的后台自动
GUI 自动化计算机视觉RPA人工智能Kubernetes 官方 Python 客户端解析:ResourceV1ResourceClaim 模型与 DRA 资源声明编程指南
Kubernetes 官方 Python 客户端解析:ResourceV1ResourceClaim 模型与 DRA 资源声明编程指南 本篇技术指南以 doc/
后端云原生容器编排
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考