- 后端
- 云原生
- 容器编排
【免费下载链接】python
Official Python client library for kubernetes
本指南围绕官方 Kubernetes Python 客户端库(kubernetes)中V1ConfigMap这一核心数据模型展开,结合同步(kubernetes.client)与异步(kubernetes.aio.client)两套生成的模型源码、CoreV1Api的 CRUD 方法实现以及仓库内可运行的示例脚本,系统讲解 ConfigMap 的字段语义、序列化规则、创建/读取/补丁/删除的编程方法,以及不可变(Immutable)等高级特性的落地用法。读完本文,你将掌握用 Python 以类型安全的方式操作 Kubernetes ConfigMap 的完整方案,并理解模型底层由 OpenAPI Generator 生成的 pydantic 实现细节。
一、模型定位:ConfigMap 在客户端库中的角色
V1ConfigMap是 Kubernetes 官方 Python 客户端对 ConfigMap API 资源的类型化建模。ConfigMap 本身是 Kubernetes 中用于将配置数据与镜像内容解耦的机制,官方模型注释原文为:"ConfigMap holds configuration data for pods to consume"(ConfigMap 保存供 Pod 消费的配置数据)。在 kubernetes/aio/client/models/v1_config_map.py 和 kubernetes/client/models/v1_config_map.py 中,模型类基于 pydantic 的BaseModel实现,两者代码结构完全一致,区别仅在于同步包从kubernetes.client.models.v1_object_meta导入V1ObjectMeta,异步包则从kubernetes.aio.client.models.v1_object_meta导入。
从源码头部可以看到,模型由 OpenAPI Generator 依据 OpenAPI 文档(版本release-1.37)自动生成,文件头部明确标注 "Do not edit the class manually",因此所有字段定义与 Kubernetes API 约定严格对齐,直接反映当前仓库对应的上游 API 版本语义。
二、字段全景:六个属性及其约束语义
2.1 字段总览表
V1ConfigMap共定义六个可选字段,openapi_types与attribute_map两个类变量分别给出 Python 类型映射和 JSON 线上字段名映射(见 v1_config_map.py):
| 属性(Python 名) | JSON 字段(线上名) | Python 类型 | 默认值 | 说明 |
|---|---|---|---|---|
api_version | apiVersion | str | None | 对象的版本化 schema 标识,服务端应将已识别的 schema 转换为最新内部值,可能拒绝未识别的值 |
binary_data | binaryData | Dict[str, bytes] | None | 二进制数据,可包含超出 UTF-8 范围的字节序列;要求 apiserver 与 kubelet 为 1.10+;其 key 目前不会通过ConfigMapKeyRef/ConfigMapRef注入容器环境变量 |
data | data | Dict[str, str] | None | 常规配置数据,值为 UTF-8 字符串 |
immutable | immutable | bool | None | 为true时数据不可更新(仅对象元数据可改);未设置时任何时刻都可修改,默认值为 nil |
kind | kind | str | None | REST 资源类型标识,服务端可从提交请求的端点推断,CamelCase,不可更新 |
metadata | metadata | V1ObjectMeta | None | 标准对象元数据,见 V1ObjectMeta 模型 |
2.2 关键约束深入
- key 的字符约束:
data与binary_data的每个键都必须由字母数字字符以及-、_、.组成;data中不得出现非 UTF-8 字节序列(此类内容必须放入binary_data),且两个字段的 key 集合不允许重叠——模型描述中指出这一约束在服务端校验过程中强制执行。 - 二进制数据的使用前提:
binary_data依赖 1.10+ 版本的 apiserver 与 kubelet,并且其 key 当前不会像data的 key 那样通过ConfigMapKeyRef或ConfigMapRef环境变量源注入到容器环境变量,规划注入场景时需优先使用data。 - 不可变语义:
immutable置为true后,ConfigMap 的数据内容不可更新,只允许修改对象元数据;该字段默认值语义为 nil(即"未设置"而非布尔 false)。
三、字段名别名机制:Python 名与线上 JSON 名的自动互转
从源码可以确认,模型通过AliasChoices支持双向别名映射。例如:
api_version: Optional[StrictStr] = Field( default=None, validation_alias=AliasChoices("apiVersion", "api_version"), serialization_alias="apiVersion", ... )这意味着在构造模型时,你既可以传apiVersion也可以传api_version;而在序列化输出时统一使用apiVersion。__preprocess_input_names类方法会在from_dict阶段把下划线风格输入归一化为线上字段名(见 v1_config_map.py)。
序列化结果由仓库测试用例直接验证。在 kubernetes/test/test_generated_api.py 的test_builtin_model_patch_serializes_wire_aliases中:
body = V1ConfigMap( api_version='v1', kind='ConfigMap', metadata=V1ObjectMeta(name='sample', resource_version='7'), data={'key': 'value'}, )经patch_namespaced_config_map序列化后,请求体为:
{ "apiVersion": "v1", "kind": "ConfigMap", "metadata": {"name": "sample", "resourceVersion": "7"}, "data": {"key": "value"} }即 Python 下划线属性(api_version、resource_version)在线上被正确转为apiVersion、resourceVersion。这是使用模型类时必须理解的核心行为。
四、模型提供的方法:序列化与反序列化能力
V1ConfigMap继承并实现了 OpenAPI Generator 生成模型的完整方法集(见 v1_config_map.py):
to_str():返回to_dict()的pprint.pformat美化字符串,__repr__与__str__均复用它,便于调试打印。to_json():返回按 JSON 别名(alias)序列化的 JSON 字符串。from_json(json_str):从 JSON 字符串构造实例,内部调用from_dict(json.loads(json_str))。to_dict(serialize=False):返回全部已声明字段,默认使用公开的 Python 名称(如api_version),serialize=True时使用线上名称(如apiVersion)。from_dict(obj):从字典构造实例,支持传入None返回None;对metadata会递归调用V1ObjectMeta.from_dict(见 v1_config_map.py)。__eq__/__ne__:基于to_dict()的结果判断两个模型实例是否相等。
值得留意的是model_config = ConfigDict(validate_by_name=True, validate_by_alias=True, validate_assignment=True, extra="forbid", protected_namespaces=())(见 v1_config_map.py):extra="forbid"意味着传入未声明的字段会触发校验错误,这为构造 ConfigMap 提供了严格的类型安全保证。
五、实战:用同步客户端完成 ConfigMap CRUD
5.1 创建(create_namespaced_config_map)
在 kubernetes/aio/client/api/core_v1_api.py 中可以查看create_namespaced_config_map的完整签名(同步版本位于 kubernetes/client/api/core_v1_api.py),核心参数如下:
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
namespace | 是 | str | 对象名称与鉴权作用域(如命名空间名) |
body | 是 | V1ConfigMap | 请求体,即要创建的 ConfigMap 模型实例 |
pretty | 否 | str | 为'true'时输出美化打印,默认'false'(除非 user-agent 表明是浏览器或 curl/wget 等 CLI HTTP 工具) |
dry_run | 否 | str | 'All'表示执行所有 dry-run 阶段但不持久化,任何无效或不识别的 dryRun 指令都会导致错误响应 |
field_manager | 否 | str | 与做出变更的参与者关联的名称,长度须小于 128 字符且仅含可打印字符 |
field_validation | 否 | str | Ignore(静默丢弃未知字段与重复字段,v1.23 之前默认)、Warn(对每个被丢弃的未知字段发送警告头,v1.23+ 默认)、Strict(存在未知或重复字段时以 BadRequest 失败) |
方法成功时返回V1ConfigMap(200/201/202),401时返回None。完整示例可参考 examples/notebooks/create_configmap.ipynb:
from kubernetes import client, config config.load_kube_config() v1 = client.CoreV1Api() metadata = client.V1ObjectMeta(name="special-config", namespace="default") cmap = client.V1ConfigMap( api_version="v1", kind="ConfigMap", metadata=metadata, data={"special.how": "very", "special.type": "charm"}, ) v1.create_namespaced_config_map(namespace="default", body=cmap)5.2 读取(read_namespaced_config_map)
方法位于 core_v1_api.py,只需name(ConfigMap 名称)与namespace,成功返回V1ConfigMap:
cmap = v1.read_namespaced_config_map(name="special-config", namespace="default") print(cmap.data) # {'special.how': 'very', 'special.type': 'charm'} print(cmap.metadata.name)5.3 更新(patch_namespaced_config_map / replace_namespaced_config_map)
仓库提供了可直接运行的官方示例 examples/patch_namespaced_config_map.py:
from kubernetes import client, config def main(): config.load_kube_config() v1 = client.CoreV1Api() namespace = "your-namespace" config_map_data = {"test_key": "test_value"} config_map_name = "your-config-map-name" # 使用 client.V1ConfigMap 而不是 python dict object_meta = client.V1ObjectMeta(name=config_map_name, namespace=namespace) body = client.V1ConfigMap( api_version="v1", kind="ConfigMap", metadata=object_meta, data=config_map_data) v1.patch_namespaced_config_map(name=config_map_name, namespace=namespace, body=body) if __name__ == "__main__": main()关于补丁行为,仓库测试 kubernetes/test/test_generated_api.py 揭示了一个重要细节:
- 当
body是内置资源模型(如V1ConfigMap)或普通字典时,patch_namespaced_config_map默认使用application/strategic-merge-patch+json内容类型(对内置对象生效的合并语义); - 当
body是JSON Patch 风格的列表(如[{'op': 'replace', 'path': '/data/key', 'value': 'changed'}])时,客户端自动切换为application/json-patch+json(见 test_generated_api.py)。
因此,"用模型还是用字典、传对象还是传列表"会直接决定底层采用哪种补丁协议。
5.4 删除(delete_namespaced_config_map)
方法位于 core_v1_api.py:
v1.delete_namespaced_config_map(name="special-config", namespace="default")5.5 列表查询
list_namespaced_config_map(namespace=..., ...):列出指定命名空间内的 ConfigMap,返回V1ConfigMapList(core_v1_api.py)。list_config_map_for_all_namespaces(...):跨所有命名空间列出 ConfigMap,同样返回V1ConfigMapList(core_v1_api.py)。
两者均支持pretty、_continue、field_selector、label_selector、limit、watch等列表标准参数,可在方法签名中按需查阅。
六、实战:异步客户端(aio)使用要点
异步模型位于 kubernetes/aio/client/models/v1_config_map.py,与同步版本字段和方法完全一致,但 API 方法均为async def。仓库为异步客户端单独提供依赖清单 requirements-asyncio.txt 与安装入口 setup-asyncio.py。
典型异步 CRUD 用法(参考 examples_asyncio 目录下的通用模式):
import asyncio from kubernetes import config from kubernetes.aio import client as aio_client async def main(): await config.load_kube_config() # 或使用 aio 对应的配置加载方式 v1 = aio_client.CoreV1Api() body = aio_client.V1ConfigMap( api_version="v1", kind="ConfigMap", metadata=aio_client.V1ObjectMeta(name="async-cm", namespace="default"), data={"mode": "async"}, ) created = await v1.create_namespaced_config_map(namespace="default", body=body) print(created.data) await v1.delete_namespaced_config_map(name="async-cm", namespace="default") await v1.api_client.close() asyncio.run(main())注意异步客户端使用完毕后需要显式关闭底层连接(await v1.api_client.close()),避免事件循环中残留未关闭的会话资源。
七、进阶:利用 Pod 消费 ConfigMap 数据
ConfigMap 的价值最终体现在被 Pod 消费。仓库的 examples/notebooks/create_configmap.ipynb 演示了通过V1ConfigMapKeySelector将 ConfigMap 数据注入 Pod 环境变量的做法:
container = client.V1Container(name="test-container", image="k8s.gcr.io/busybox", ...) container.env = [ client.V1EnvVar( name="SPECIAL_LEVEL_KEY", value_from=client.V1EnvVarSource( config_map_key_ref=client.V1ConfigMapKeySelector( name="special-config", key="special.how" ) ), ), ]结合前面提到的字段约束,这里再次印证:注入环境变量只支持data中的 key(模型注释明确说明binary_data的 key 不会通过ConfigMapKeyRef/ConfigMapRef传播到容器环境变量)。因此,若配置项需作为环境变量注入,应写入data而非binary_data。
八、可选路径:动态客户端操作 ConfigMap
如果希望避免为每个资源编写强类型模型,可以使用动态客户端以字典形式操作。仓库示例 examples/dynamic-client/configmap.py 展示了完整流程:通过dynamic.DynamicClient获取v1/ConfigMap资源接口后,用普通字典 manifest 完成 create、get、patch、delete,无需导入V1ConfigMap模型。这在处理 CRD 或不确定 schema 的资源时更为灵活,但会牺牲静态类型检查与字段校验。
九、测试与验证依据
仓库通过 kubernetes/test/test_generated_api.py 对 ConfigMap 相关行为做了直接验证:
test_builtin_model_patch_serializes_wire_aliases(L567-L585):验证模型补丁时按线上别名序列化;test_builtin_object_patch_defaults_to_strategic_merge_patch(L557-L565):验证内置对象补丁默认使用 strategic merge patch;test_builtin_list_patch_defaults_to_json_patch(L587-L595):验证列表体补丁切换为 JSON Patch;test_create_from_yaml_supports_async_requests(L629-L644):验证 YAML 中kind: ConfigMap的 manifest 可通过create_from_yaml异步创建。
这些测试表明,ConfigMap 模型不仅在定义上对齐 Kubernetes API 约定,其序列化与补丁行为也有明确的回归测试保障,可作为实际开发中的行为契约参考。
十、小结
V1ConfigMap是官方 Kubernetes Python 客户端中类型安全操作 ConfigMap 的入口。理解其六个字段(尤其是data与binary_data的 key 约束与用途差异、immutable的不可变语义)、Python 名与线上 JSON 名的别名转换规则,以及create/read/patch/replace/delete/list系列 API 的默认补丁协议选择,即可在同步与异步两种编程模型下稳定地完成配置管理任务。进一步可结合 examples/patch_namespaced_config_map.py、examples/dynamic-client/configmap.py 与 examples/notebooks/create_configmap.ipynb 三个官方示例,快速落地到真实集群环境。
- 后端
- 云原生
- 容器编排
【免费下载链接】python
Official Python client library for kubernetes
相关推荐
Machine Learning for Trading 股票数据模块实战指南:Equity Data 目录、加载器与下载流程全解析
Machine Learning for Trading 股票数据模块实战指南:Equity Data 目录、加载器与下载流程全解析 《Machine Lear
后端云原生容器编排Kubernetes Python Client 的 DiscoveryV1EndpointPort 模型详解:EndpointSlice 端口定义与异步客户端实战
Kubernetes Python Client 的 DiscoveryV1EndpointPort 模型详解:EndpointSlice 端口定义与异步客户端
后端云原生容器编排深入解析 Kubernetes Python 异步客户端模型 AdmissionregistrationV1ServiceReference
深入解析 Kubernetes Python 异步客户端模型 AdmissionregistrationV1ServiceReference 导读 Admiss
后端云原生容器编排
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考