ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Kubernetes Python Client 异步版 ApiextensionsV1WebhookClientConfig 模型详解:CRD 转换 Webhook 的 TLS 连接配置

Kubernetes Python Client 异步版 ApiextensionsV1WebhookClientConfig 模型详解:CRD 转换 Webhook 的 TLS 连接配置 后端云原生容器编排【免费下载链接】pythonOfficial Python client library for kubernetes项目地址https://gitcode.com/gh_mirrors/python1/python点击查看免费下载导读ApiextensionsV1WebhookClientConfig是 Kubernetes 官方 Python 客户端kubernetes包异步版位于kubernetes.aio.client.models命名空间为apiextensions.k8s.io/v1的WebhookClientConfig结构生成的模型类它承载着自定义资源CRD版本转换 Webhook 的所有 TLS 连接参数服务端点定位service或url与 CA 证书校验caBundle。阅读本文后你将掌握该模型三个字段的语义与约束、service/url二选一的规则、基于 pydantic v2 的别名与校验行为并能直接用from_dict/from_json/to_dict在异步客户端代码中读写 CRD 转换 Webhook 配置。模型定位CRD 转换机制中的连接配置载体在 Kubernetes 中一个 CustomResourceDefinitionCRD可以同时暴露多个版本例如v1与v1beta1。当 API Server 需要在版本之间转换自定义资源时可选择strategy: Webhook即调用外部 Webhook 完成转换。此时 API Server 如何找到并信任这个 Webhook答案就是WebhookClientConfig——它恰好描述了建立 TLS 连接所需的全部信息。该模型在 Kubernetes OpenAPI 规范中的定义来自 scripts/swagger.json 中的apiextensions.v1.WebhookClientConfig源码生成依据为 release-1.37 的 OpenAPI 文档其描述原文为WebhookClientConfig contains the information to make a TLS connection with the webhook.在客户端库中该模型被注册于两个位置异步版kubernetes.aio.client.models.apiextensions_v1_webhook_client_config本关联文档对应模块Sphinx 参考页见 doc/source/kubernetes.aio.client.models.apiextensions_v1_webhook_client_config.rst同步版kubernetes.client.models.apiextensions_v1_webhook_client_config行为一致。模型类定义位于 kubernetes/aio/client/models/apiextensions_v1_webhook_client_config.py并作为顶层模型从 kubernetes/aio/client/models/init.py 与 kubernetes/aio/client/init.py 导出因此可同时通过以下两种方式导入from kubernetes.aio.client.models.apiextensions_v1_webhook_client_config import ApiextensionsV1WebhookClientConfig # 或 from kubernetes.aio.client.models import ApiextensionsV1WebhookClientConfig字段全景三个字段撑起整个 TLS 连接描述ApiextensionsV1WebhookClientConfig只有三个字段其类型、含义与序列化别名如下与 kubernetes/aio/docs/ApiextensionsV1WebhookClientConfig.md 的属性表一致Python 字段名类型JSON/Kubernetes 字段名必填说明ca_bundlebytes兼容strcaBundle可选PEM 编码的 CA 证书包用于校验 Webhook 服务端证书不指定时使用 API Server 的系统信任根serviceApiextensionsV1ServiceReferenceservice可选与url二选一指向集群内运行 Webhook 的 Service 的引用urlstrurl可选与service二选一Webhook 的标准 URL 形式地址形如scheme://host:port/path三个字段全部标记为可选Optional[...]但这不代表可以三字段都为空——service与url之间存在恰好指定一个的强约束详见下一节。从源码看模型同时声明了openapi_types与attribute_map两个类属性apiextensions_v1_webhook_client_config.py前者描述 Python 侧类型后者描述 Python 字段名到 JSON 键名的映射这正是序列化别名机制的根基。service 与 url 的二选一约束集群内还是集群外url字段在源码中带有一段极详细的官方说明apiextensions_v1_webhook_client_config.py可提炼为以下硬性规则互斥性url与service必须且只能指定其中一个。Webhook 在集群内运行时首选service集群外部署时使用url。host 语义host不应指向集群内运行的 Service那是service字段的职责host 可以是一个 IP 地址也可能由部分 API Server 通过外部 DNS 解析——例如kube-apiserver出于分层原则layering violation无法解析集群内 DNS。localhost 风险将host设为localhost或127.0.0.1是危险的除非你能确保该 Webhook 运行在每一个可能调用它的 API Server 主机上这类部署通常不可移植non-portable难以在新集群中复现。scheme 强制 HTTPSURL 必须以https://开头。path 用途路径可选可以是 URL 允许的任意字符串例如用来携带集群标识符等任意信息传给 Webhook。禁止内容不允许使用用户/基本认证形式如user:password也不允许携带片段#...与查询参数?...。对应的service字段则引用另一个模型ApiextensionsV1ServiceReferencekubernetes/aio/client/models/apiextensions_v1_service_reference.py其属性为字段类型必填说明namestr是Service 名称namespacestr是Service 所在命名空间pathstr否Webhook 被访问的可选 URL 路径portint否可选的服务端口取值 1–65535为向后兼容默认 443于是一个典型的集群内 CRD 转换 Webhook配置用 Python 构造如下from kubernetes.aio.client.models.apiextensions_v1_service_reference import ApiextensionsV1ServiceReference from kubernetes.aio.client.models.apiextensions_v1_webhook_client_config import ApiextensionsV1WebhookClientConfig service_ref ApiextensionsV1ServiceReference( nameexample-conversion-webhook, namespacekube-system, path/convert, port443, ) client_config ApiextensionsV1WebhookClientConfig(serviceservice_ref)而集群外或指向集群外服务的形态则是client_config ApiextensionsV1WebhookClientConfig( urlhttps://webhook.example.com:8443/convert )caBundleBase64 编码的 PEM CA 证书包ca_bundle字段在类型上被声明为bytesapiextensions_v1_webhook_client_config.pyca_bundle: Optional[Union[Annotated[bytes, Field(strictTrue)], Annotated[str, Field(strictTrue)]]] Field( defaultNone, validation_aliasAliasChoices(caBundle, ca_bundle), serialization_aliascaBundle, ... )其语义是一个 PEM 编码的 CA 证书包用于校验 Webhook 的服务端证书若未指定API Server 将回退使用系统信任根。值得注意的源码细节是它带有正则校验器apiextensions_v1_webhook_client_config.pyfield_validator(ca_bundle, modebefore) def ca_bundle_validate_regular_expression(cls, value): if value is None: return value if isinstance(value, str) and not re.match( r^(?:[A-Za-z0-9\/]{4})*(?:[A-Za-z0-9\/]{2}|[A-Za-z0-9\/]{3})?$, value ): raise ValueError(rmust validate the regular expression /^(?:[A-Za-z0-9\/]{4})*(?:[A-Za-z0-9\/]{2}|[A-Za-z0-9\/]{3})?$/) return value这个正则只匹配Base64 字符集含可选填充与 OpenAPI 规范中caBundle的format: byte即 Base64 编码的字节串定义完全对应见 scripts/swagger.json 中apiextensions.v1.WebhookClientConfig的caBundle属性。因此实际写入的值应当是把 PEM 证书内容先做 Base64 编码若传入的是明文字符串且不符合 Base64 形态模型在初始化阶段就会抛出ValueError。同时该字段的序列化别名固定为caBundle驼峰这意味着to_dict(serializeTrue)/to_json()产出的键名是caBundle而非ca_bundle与 Kubernetes API 的 JSON 载荷完全对齐。别名与反序列化兼容蛇形与驼峰两种输入模型基于 pydantic v2 构建配置了双别名解析apiextensions_v1_webhook_client_config.pymodel_config ConfigDict( validate_by_nameTrue, validate_by_aliasTrue, validate_assignmentTrue, extraforbid, protected_namespaces(), )validate_by_name与validate_by_alias同时开启构造对象时无论是传 Python 风格的ca_bundle还是 Kubernetes 线格式的caBundle都会被接受extraforbid任何未知字段都会触发校验错误防止拼写错误的键名静默丢失validate_assignmentTrue对象构造之后再次给属性赋值同样会触发类型与正则校验。反序列化入口from_dict还包含一个输入预处理步骤__preprocess_input_namesapiextensions_v1_webhook_client_config.py当字典中只出现ca_bundle而没有caBundle时会将其改写为caBundle再交给 pydantic 校验确保两种风格都能正确解析classmethod def __preprocess_input_names(cls, obj, remove_hidden_storage_namesTrue): if not isinstance(obj, _Mapping): return obj obj dict(obj) if caBundle not in obj and ca_bundle in obj: obj[caBundle] obj[ca_bundle] obj.pop(ca_bundle, None) return obj并且from_dict会递归地把内嵌的service字典交给ApiextensionsV1ServiceReference.from_dict(...)处理apiextensions_v1_webhook_client_config.py因此你可以直接传入从kubectl get -o json拿到的原始字典。序列化与完整生命周期示例模型提供了一套完整的转换方法均定义在 apiextensions_v1_webhook_client_config.pyto_str()/__repr__()返回pprint格式化的人类可读字符串便于调试打印to_json()返回按**别名驼峰键**序列化的 JSON 字符串to_dict(serializeFalse)返回 Python 字段名蛇形字典to_dict(serializeTrue)返回线格式驼峰键字典且内嵌的service对象会被递归转成字典from_json(json_str)/from_dict(dict)从 JSON 字符串或字典构造实例__eq__/__ne__基于to_dict()结果做深度相等比较。官方 Markdown 文档 kubernetes/aio/docs/ApiextensionsV1WebhookClientConfig.md 给出的标准用法如下from kubernetes.aio.client.models.apiextensions_v1_webhook_client_config import ApiextensionsV1WebhookClientConfig # 从一个 JSON 字符串创建实例 json {service: {name: example-conversion-webhook, namespace: kube-system, port: 443}} apiextensions_v1_webhook_client_config_instance ApiextensionsV1WebhookClientConfig.from_json(json) # 打印 JSON 字符串表示使用别名键 print(ApiextensionsV1WebhookClientConfig.to_json()) # 转换成 dictPython 字段名 apiextensions_v1_webhook_client_config_dict apiextensions_v1_webhook_client_config_instance.to_dict() # 从 dict 重建实例 apiextensions_v1_webhook_client_config_from_dict ApiextensionsV1WebhookClientConfig.from_dict( apiextensions_v1_webhook_client_config_dict )在异步客户端中你往往还需要把这些模型对象序列化后传给CustomObjectsApi等方法例如创建/更新 CRD 或执行replace_custom_resource_definition此时to_dict(serializeTrue)或to_json()能直接产出 API Server 可识别的线格式数据。上层调用链路从 CRD 到 Webhook 配置该模型在客户端库中不是孤立的它处于一条清晰的嵌套调用链中可从 kubernetes/aio/client/models/init.py 的导出关系印证V1CustomResourceConversionkubernetes/aio/client/models/v1_custom_resource_conversion.pyCRD 的spec.conversion字段。strategy取值为None或Webhook当取Webhook时要求spec.preserveUnknownFields为false且spec.conversion.webhook必须被设置。V1WebhookConversionkubernetes/aio/client/models/v1_webhook_conversion.py描述如何调用转换 Webhook包含clientConfig即本模型的ApiextensionsV1WebhookClientConfig与conversionReviewVersionsWebhook 期望的ConversionReview版本有序列表API Server 使用列表中的第一个它支持的版本若都不支持则转换失败。ApiextensionsV1WebhookClientConfig即本文主角承载clientConfig的 TLS 连接细节其from_dict实现中可以看到对V1WebhookConversion.from_dict的递归调用v1_webhook_conversion.py。也就是说一段完整的CRD Webhook 转换策略在 Python 中的组装方式为from kubernetes.aio.client.models.v1_custom_resource_conversion import V1CustomResourceConversion from kubernetes.aio.client.models.v1_webhook_conversion import V1WebhookConversion from kubernetes.aio.client.models.apiextensions_v1_webhook_client_config import ApiextensionsV1WebhookClientConfig client_config ApiextensionsV1WebhookClientConfig( serviceApiextensionsV1ServiceReference(nameconv-webhook, namespacedefault, port443) ) webhook_conversion V1WebhookConversion( client_configclient_config, conversion_review_versions[v1, v1beta1], ) conversion V1CustomResourceConversion( strategyWebhook, webhookwebhook_conversion, )这一链路清晰说明只要 CRD 采用strategy: Webhook的版本转换策略ApiextensionsV1WebhookClientConfig就是不可避免的核心配置对象。补充说明同步版与关联模型同步客户端中存在完全对等的模型 kubernetes/client/models/apiextensions_v1_webhook_client_config.py 及其文档 kubernetes/docs/ApiextensionsV1WebhookClientConfig.md字段与行为与异步版一致仅命名空间不同kubernetes.client.modelsvskubernetes.aio.client.models。同名的AdmissionregistrationV1WebhookClientConfigkubernetes/aio/client/models/admissionregistration_v1_webhook_client_config.py服务于 admissionregistration 场景Mutating/Validating Webhook与本模型结构几乎相同但分属不同的 API 组使用时应注意不要混用。本模型基于 pydantic v2 生成继承pydantic.BaseModel并要求 Python 3 环境异步版还需配合asyncio使用安装依赖见仓库根目录的 requirements-asyncio.txt。参考阅读模块 API 参考页doc/source/kubernetes.aio.client.models.apiextensions_v1_webhook_client_config.rst模型源码kubernetes/aio/client/models/apiextensions_v1_webhook_client_config.py关联 ServiceReference 模型kubernetes/aio/client/models/apiextensions_v1_service_reference.py上游 WebhookConversion 模型kubernetes/aio/client/models/v1_webhook_conversion.py生成依据的 OpenAPI 定义apiextensions.v1.WebhookClientConfigscripts/swagger.json赞分享后端云原生容器编排【免费下载链接】pythonOfficial Python client library for kubernetes项目地址https://gitcode.com/gh_mirrors/python1/python点击查看免费下载相关推荐Kubernetes Python 客户端中的 AdmissionregistrationV1WebhookClientConfig准入 Webhook TLS 连接配置模型详解Kubernetes Python 客户端中的 AdmissionregistrationV1WebhookClientConfig准入 Webhook TL后端云原生容器编排Kubernetes Python Client 异步版 APIService 状态模型 V1APIServiceStatus 详解Kubernetes Python Client 异步版 APIService 状态模型 V1APIServiceStatus 详解 本篇指南以官方 Kuber后端云原生容器编排Kubebuilder API 多版本转换设计指南Hub and Spoke 模型、Conversion Webhook 与 CRD 生成详解Kubebuilder API 多版本转换设计指南Hub and Spoke 模型、Conversion Webhook 与 CRD 生成详解 导读 本文以开发者工具代码生成CLI云原生后端上一篇QtSharp 项目使用教程下一篇Laravel-Admin多租户架构SaaS应用适配终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表