☰
Kubernetes Python 客户端 V1CSIDriverSpec 模型详解:CSI 驱动声明式配置的完整字段指南
2026/9/29 3:24:17 网站建设 项目流程
  • 后端
  • 云原生
  • 容器编排

【免费下载链接】python

Official Python client library for kubernetes

项目地址:https://gitcode.com/gh_mirrors/python1/python
点击查看免费下载

本文聚焦官方 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_requiredattachRequiredboolNone不可变
fs_group_policyfsGroupPolicystrNone(语义默认ReadWriteOnceWithFSType)<1.29 不可变,现可变
node_allocatable_update_period_secondsnodeAllocatableUpdatePeriodSecondsintNone可变
pod_info_on_mountpodInfoOnMountboolNone(语义默认false)<1.29 不可变,现可变
prevent_pod_scheduling_if_missingpreventPodSchedulingIfMissingboolNone(语义默认false)可变
requires_republishrequiresRepublishboolNone(语义默认false)可变
se_linux_mountseLinuxMountboolNone(语义默认false)可变
service_account_token_in_secretsserviceAccountTokenInSecretsboolNone可变
storage_capacitystorageCapacityboolNone≤1.22 不可变,现可变
token_requeststokenRequestsList[StorageV1TokenRequest]None可变
volume_lifecycle_modesvolumeLifecycleModesList[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())

实践建议与注意事项

  1. 善用不可变约束:attach_required与volume_lifecycle_modes不可变,创建前必须一次配置正确;fs_group_policy、pod_info_on_mount、storage_capacity在较新 Kubernetes(≥1.29 / >1.22)中可变,可后续调整。
  2. 令牌传递二选一:service_account_token_in_secrets必须配合token_requests使用,且驱动端需相应升级读取位置;若使用旧的VolumeContext传递方式,注意敏感令牌可能进入日志。
  3. 容量感知:开启storage_capacity的驱动需持续发布CSIStorageCapacity对象,否则延迟绑定的卷供应会暂停等待。
  4. 特性门控依赖:node_allocatable_update_period_seconds依赖MutableCSINodeAllocatableCount,prevent_pod_scheduling_if_missing依赖VolumeLimitScaling,使用前需确认集群已启用对应 feature gate(本文模型基于release-1.37的 scripts/swagger.json 生成)。
  5. 别名兼容:由于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

项目地址:https://gitcode.com/gh_mirrors/python1/python
点击查看免费下载

相关推荐

上一篇:SillyTavern Launcher 安装与快速上手:从零到跑通的完整教程
下一篇:告别网盘下载慢:LinkSwift 网盘直链解析指南,三步覆盖九大云盘

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询