- 后端
- 云原生
- 容器编排
【免费下载链接】python
Official Python client library for kubernetes
本篇技术指南围绕官方 Kubernetes Python 客户端(同步版kubernetes.client与异步版kubernetes.aio.client)中的V1IngressClassList模型展开,完整讲解该模型的字段结构、序列化机制、与V1IngressClass单对象及V1ListMeta元数据的组合关系,并给出通过NetworkingV1Api.list_ingress_class获取、过滤、分页乃至 watch IngressClass 列表的实战方案。读完本文,你将能准确理解 IngressClass 列表对象在 API 响应中的组织方式,并可直接在真实集群中编写可运行的列表查询代码。
V1IngressClassList是 Kubernetesnetworking.k8s.io/v1分组下IngressClass资源集合的列表容器。它对应 REST 端点GET /apis/networking.k8s.io/v1/ingressclasses的标准响应结构,其文档页由 Sphinx 的automodule指令自动生成(见 doc/source/kubernetes.aio.client.models.v1_ingress_class_list.rst),而模型本体则由 OpenAPI Generator 依据 scripts/swagger.json 自动生成,手工修改无意义,一切以服务端 OpenAPI 定义为准。
模型定位:IngressClass 的集合容器
在 Kubernetes 的 API 约定中,几乎所有资源类型都会配套一个对应的 List 类型,用于承载某个资源集合的查询结果。IngressClass用于描述 Ingress 的类别(例如区分不同的负载均衡器实现),而V1IngressClassList即"IngressClasses 的集合"(源码注释原文:IngressClassList is a collection of IngressClasses)。
从类的继承关系看,V1IngressClassList直接继承自pydantic.BaseModel(见 kubernetes/aio/client/models/v1_ingress_class_list.py),这意味着它拥有 Pydantic v2 的完整能力:字段类型校验、别名(alias)支持、赋值时验证(validate_assignment)、多余字段拒绝(extra="forbid")等。这与旧版基于six/普通类的生成模型不同,是本仓库当前版本(OpenAPI 文档版本release-1.37,见文件头部注释)的实现形态。
同步版与异步版各自拥有完全对称的实现:
- 同步版:kubernetes/client/models/v1_ingress_class_list.py
- 异步版:kubernetes/aio/client/models/v1_ingress_class_list.py
两者的字段定义、方法签名一致,区别仅在于异步版配套的 API 客户端是非阻塞实现。
字段结构详解:四个属性各司其职
V1IngressClassList一共只有四个字段(源码第 108–111 行),它们共同构成一个标准的 Kubernetes List 对象:
| 字段(Python 属性) | JSON 键(wire 名称) | 类型 | 是否必填 | 说明 |
|---|---|---|---|---|
api_version | apiVersion | Optional[StrictStr] | 否 | 对象的 API 版本模式,即networking.k8s.io/v1。服务端会将可识别的模式转换为最新内部值,对无法识别的值可能直接拒绝 |
items | items | List[V1IngressClass] | 是 | 实际的 IngressClass 对象列表,是集合的核心载荷 |
kind | kind | Optional[StrictStr] | 否 | REST 资源类型名称,列表场景下通常为IngressClassList;服务端可从请求端点推断,客户端一般不应修改 |
metadata | metadata | Optional[V1ListMeta] | 否 | 列表级元数据,包含resourceVersion、continue令牌、remainingItemCount等分页与一致性控制信息 |
其中items是唯一必填字段(源码第 109 行items: List[V1IngressClass] = Field(description="items is the list of IngressClasses.")),它是整个列表对象的主体。
apiVersion与kind:Kubernetes 类型标识约定
api_version和kind都是Optional[StrictStr],默认值为None,允许不填。源码注释给出的官方语义是:服务端会依据请求端点自行推断kind,而apiVersion定义了该表示对象的版本化模式(见 kubernetes/aio/client/models/v1_ingress_class_list.py)。在实际集群交互中,服务端返回的列表响应都会带上这两个字段,因此你从 API 拿到的对象它们通常非空。
items:与 V1IngressClass 的嵌套组合
items的每个元素都是V1IngressClass实例。V1IngressClass本身包含四个字段:api_version、kind、metadata(V1ObjectMeta)以及spec(V1IngressClassSpec),其中spec承载 IngressClass 的核心配置,例如控制器名称controller和参数引用parameters(见 kubernetes/aio/client/models/v1_ingress_class.py)。因此,一个典型的V1IngressClassListJSON 结构长这样:
{ "apiVersion": "networking.k8s.io/v1", "kind": "IngressClassList", "metadata": { "resourceVersion": "12345", "continue": "" }, "items": [ { "apiVersion": "networking.k8s.io/v1", "kind": "IngressClass", "metadata": { "name": "nginx", "uid": "a1b2c3d4-...", "resourceVersion": "12344" }, "spec": { "controller": "k8s.io/ingress-nginx" } } ] }metadata:V1ListMeta 提供的一致性保障
metadata的类型是V1ListMeta(见 kubernetes/aio/client/models/v1_list_meta.py),它不同于V1IngressClass中的V1ObjectMeta。V1ListMeta关注的不是单个对象的身份信息,而是列表级控制信息:resourceVersion用于标识列表快照版本,continue令牌用于后续分页续取,remainingItemCount用于提示剩余条目数。当使用limit分页时,服务端会把下一个continue令牌写入列表的metadata.continue中。
命名映射与别名机制:snake_case 与 camelCase 的桥接
Kubernetes API 的 JSON 字段采用 camelCase(apiVersion),而 Python 命名习惯是 snake_case(api_version)。该模型通过attribute_map类变量显式声明两者的对应关系(源码第 119–124 行):
attribute_map: ClassVar[Dict[str, str]] = { "api_version": "apiVersion", "items": "items", "kind": "kind", "metadata": "metadata" }同时每个字段声明了validation_alias=AliasChoices("apiVersion", "api_version")和serialization_alias="apiVersion",配合model_config中的validate_by_alias=True、validate_by_name=True,意味着:
- 反序列化时,无论你传入
{"apiVersion": ...}还是{"api_version": ...},都能被正确识别(AliasChoices同时接受两个名字); - 序列化输出时,统一使用 wire 名称
apiVersion,保证与服务端 JSON 兼容。
这层封装让用户写 Python 代码时使用obj.api_version、obj.items,而 HTTP 载荷中始终是apiVersion。
实例化与反序列化:四个核心方法
构造函数签名在文档中明确为V1IngressClassList(api_version=None, items=None, kind=None, metadata=None)(对应 Sphinx 生成页 doc/html/kubernetes.aio.client.models.v1_ingress_class_list.html 的类签名)。四个参数全部可选,items虽在 OpenAPI 定义中必填,但构造时允许稍后赋值,Pydantic 会在校验时强制执行。
模型提供了一套完整的双向转换方法:
to_dict():返回 Python dict。默认返回 Python 命名键(api_version),传入serialize=True时返回 wire 名称(apiVersion);to_json():返回 JSON 字符串,使用 wire 名称(alias)序列化;from_dict(obj):从 dict 构造实例。内部先调用__preprocess_input_names统一键名(把api_version规整为apiVersion),再对items逐个调用V1IngressClass.from_dict、对metadata调用V1ListMeta.from_dict(源码第 235–258 行),实现嵌套对象的递归还原;from_json(json_str):先json.loads再走from_dict。
此外还实现了to_str()/__repr__(pprint 格式化打印)以及基于to_dict()比较的__eq__/__ne__,这意味着两个内容相同的列表对象可以直接用==判断相等(源码第 158–170 行)。
from kubernetes.aio.client.models.v1_ingress_class_list import V1IngressClassList raw = { "apiVersion": "networking.k8s.io/v1", "kind": "IngressClassList", "metadata": {"resourceVersion": "100"}, "items": [ {"apiVersion": "networking.k8s.io/v1", "kind": "IngressClass", "metadata": {"name": "nginx"}, "spec": {"controller": "k8s.io/ingress-nginx"}} ], } lst = V1IngressClassList.from_dict(raw) print(lst.items[0].metadata.name) # nginx print(lst.to_json()) # 输出 camelCase JSON实战一:用 list_ingress_class 获取全量列表
V1IngressClassList最常见的来源是NetworkingV1Api.list_ingress_class。该方法在异步版中定义于 kubernetes/aio/client/api/networking_v1_api.py,HTTP 方法为GET /apis/networking.k8s.io/v1/ingressclasses,成功响应(200)直接反序列化为V1IngressClassList(响应类型映射见源码第 6777–6780 行_response_types_map)。同步版对应 kubernetes/client/api/networking_v1_api.py 中的同名方法。
一个完整的异步查询示例:
import asyncio from kubernetes import config from kubernetes.aio.client.api.networking_v1_api import NetworkingV1Api from kubernetes.aio.client.configuration import Configuration async def main(): config.load_kube_config() # 或使用 load_incluster_config() async with NetworkingV1Api() as api: result: V1IngressClassList = await api.list_ingress_class() print(f"共 {len(result.items)} 个 IngressClass") for ic in result.items: print(f"- {ic.metadata.name} -> {ic.spec.controller if ic.spec else 'N/A'}") asyncio.run(main())同步版本写法类似,使用kubernetes.client.api.networking_v1_api.NetworkingV1Api直接调用list_ingress_class(),无需await。异步版的NetworkingV1Api支持上下文管理器(async with),内部自动处理连接生命周期。
实战二:分页、过滤与 watch
list_ingress_class支持十余个可选参数(同步与异步版参数完全一致),以下参数在真实集群操作中最常用:
| 参数 | 类型 | 作用 |
|---|---|---|
label_selector | str | 按标签过滤,例如"app=nginx",默认不过滤 |
field_selector | str | 按字段过滤,例如"metadata.name=nginx" |
limit | int | 单次最多返回条数;若还有更多条目,服务端会在metadata.continue写入续取令牌 |
_continue | str | 携带上次返回的 continue 令牌续取下一页 |
resource_version | str | 指定列表请求基于的资源版本,未设置时默认取最新 |
resource_version_match | str | 配合resourceVersion使用,官方建议显式设置,取值如NotOlderThan |
watch | bool | 置为true时返回变更事件流而非静态列表 |
timeout_seconds | int | list/watch 调用的总超时上限 |
allow_watch_bookmarks | bool | 请求BOOKMARK类型的 watch 事件 |
pretty | str | 设为'true'时输出美化 JSON |
分页遍历:limit + continue
continue令牌的有效期一般为五到十五分钟,过期后服务端返回410 ResourceExpired,此时需要重启列表请求(不带 continue)。分页遍历的典型模式:
async def list_all(api: NetworkingV1Api): continue_token = None while True: result = await api.list_ingress_class( limit=50, _continue=continue_token, label_selector="app=nginx", ) for ic in result.items: process(ic) # 处理当前页 if result.metadata and result.metadata.continue_: continue_token = result.metadata.continue_ else: break注意:使用continue续取时,服务端保证返回结果与一次性不带 limit 的全量列表在一致性上等价(consistent snapshot),即分页期间对象的创建/修改/删除不会进入后续页——这正是V1ListMeta中continue语义的核心价值。
watch 模式:持续监听变更
将watch置为true并配合resource_version,即可将同一个端点变为变更事件流。结合仓库中的 watch 模块(kubernetes/watch/watch.py),可以编写事件驱动的监听器:
from kubernetes.watch import Watch w = Watch() for event in w.stream( api.list_ingress_class, watch=True, timeout_seconds=60, ): # event["type"] ∈ {"ADDED", "MODIFIED", "DELETED", "BOOKMARK"} obj = event["object"] # V1IngressClass print(event["type"], obj.metadata.name)若启用send_initial_events=True(需同时设置resource_version_match),watch 流会先发送合成事件以呈现当前集合状态,再以一个带k8s.io/initial-events-end: "true"注解的 Bookmark 事件标记初始同步完成。
校验行为与错误防护
V1IngressClassList的model_config(源码第 141–147 行)设置了四项关键约束:
model_config = ConfigDict( validate_by_name=True, validate_by_alias=True, validate_assignment=True, extra="forbid", protected_namespaces=(), )validate_by_name/validate_by_alias:构造时既可按 Python 名(api_version)也按 alias(apiVersion)传参;validate_assignment:赋值时同样校验,例如把items赋成字符串会立即抛ValidationError;extra="forbid":拒绝未声明字段,服务端返回中若出现模型不认识的字段会报错——这保证了模型与 OpenAPI 定义严格对齐,也意味着当集群版本升级、响应新增字段时,需要同步更新客户端生成版本(本仓库基于release-1.37的 scripts/swagger.json 生成)。
protected_namespaces=()则取消了 Pydantic 对以model_开头的字段名的保留限制,避免与生成代码冲突。
源码生成机制:为什么模型长这样
V1IngressClassList与同仓库数千个模型一样,由 OpenAPI Generator 从 scripts/swagger.json 自动生成,生成的同步版本位于 kubernetes/client/models/,异步版本位于 kubernetes/aio/client/models/。仓库提供了更新脚本 scripts/update-client.sh 和 scripts/update-client-asyncio.sh。因此:
- 你不需要、也不应该手改这些模型文件;
- 模型字段与 Kubernetes 服务端 API 的对应关系,始终以仓库携带的 swagger 定义为权威;
- 文档目录 doc/source/ 中数以千计的
.rst文件(包括本模型的 kubernetes.aio.client.models.v1_ingress_class_list.rst)同样是自动生成、通过automodule拉取源码 docstring,构成 API 参考文档的骨架。
小结
V1IngressClassList虽只有四个字段,却是理解 IngressClass 集合查询的关键枢纽:items承载数据、metadata承载分页与版本一致性信息、apiVersion/kind标识类型。配合NetworkingV1Api.list_ingress_class的limit/_continue分页、label_selector过滤与watch监听能力,你可以用数行 Python 代码完成从"全量拉取"到"事件驱动监听"的完整 IngressClass 管理场景。若需查看全部 API 端点清单,可参考 kubernetes/README.md(其中NetworkingV1Api.list_ingress_class对应GET /apis/networking.k8s.io/v1/ingressclasses)。
- 后端
- 云原生
- 容器编排
【免费下载链接】python
Official Python client library for kubernetes
相关推荐
LeetCode 2707 字符串中的额外字符(Extra Characters in a String):从递归到 Trie 的七种解法全解析
LeetCode 2707 字符串中的额外字符(Extra Characters in a String):从递归到 Trie 的七种解法全解析 导读 本文围绕
后端云原生容器编排Kubernetes Python 异步客户端 V1Deployment 模型全解析:从字段语义到序列化与实战
Kubernetes Python 异步客户端 V1Deployment 模型全解析:从字段语义到序列化与实战 导读 V1Deployment 是 Kubern
后端云原生容器编排Kubernetes Python 异步客户端 CoreV1Event 模型全解析:字段语义、序列化机制与实战读取
Kubernetes Python 异步客户端 CoreV1Event 模型全解析:字段语义、序列化机制与实战读取 本篇技术指南聚焦 Kubernetes 官方
后端云原生容器编排
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考