- 后端
- 云原生
- 容器编排
【免费下载链接】python
Official Python client library for kubernetes
本文以 Kubernetes 官方 Python 客户端仓库中kubernetes.aio.client.models.v1beta1_lease_candidate模块(即V1beta1LeaseCandidate模型)为讲解主体,介绍该模型在协调式领导选举(Coordinated Leader Election)场景中的定义、字段语义、与V1beta1LeaseCandidateSpec/V1beta1LeaseCandidateList的协作关系,以及如何通过同步/异步两种客户端调用 coordination.k8s.io/v1beta1 API 完成候选对象的创建、读取、更新与删除。读完本文,你将掌握该模型完整的字段清单与校验规则、JSON 序列化行为,并能在真实集群中编写可运行的 LeaseCandidate 管理代码。
一、模型定位:它是什么,解决什么问题
V1beta1LeaseCandidate是 Kubernetes coordination API 组v1beta1版本中的一个资源模型,其类文档定义如下:
LeaseCandidate defines a candidate for a Lease object. Candidates are created such that coordinated leader election will pick the best leader from the list of candidates.
翻译过来就是:LeaseCandidate 定义了某个 Lease 对象的候选者。在协调式领导选举机制中,每个参与竞选的进程都会创建一个 LeaseCandidate 对象来声明自己具备候选资格,协调器(coordinated leader election 逻辑)会从候选者列表中挑选出“最优”的一个作为领导者,并将其信息写入对应的 Lease 对象。
这套机制与 Kubernetes 中经典的Lease选主(如 kube-controller-manager 使用的kubernetes.client.leaderelection模块)不同:Lease 方案是“先到先得 + 续约”,而 LeaseCandidate 方案引入了可比较的版本与策略字段,让系统能够依据候选者的binaryVersion、emulationVersion和strategy做更智能的仲裁。需要说明的是,本仓库的 leaderelection 模块 目前仍是围绕传统 Lease 实现的,LeaseCandidate 模型对应的是集群侧协调式选主的新机制。
该模型源码位于:
- 异步客户端:kubernetes/aio/client/models/v1beta1_lease_candidate.py
- 同步客户端:kubernetes/client/models/v1beta1_lease_candidate.py
两者代码完全同构,均基于release-1.37版本的 OpenAPI 规范由 OpenAPI Generator 生成,底层依赖 pydantic(BaseModel)实现字段校验与数据建模。
二、字段全景与语义解析
V1beta1LeaseCandidate共包含 4 个字段,完整定义如下表:
| 属性名(Python) | 属性名(JSON wire 名) | 类型 | 是否必填 | 说明 |
|---|---|---|---|---|
api_version | apiVersion | Optional[StrictStr] | 否 | 对象的版本化 schema 定义;服务器会将已识别的 schema 转换为最新的内部值,并可能拒绝无法识别的值 |
kind | kind | Optional[StrictStr] | 否 | 该 REST 资源对应的字符串值,客户端可从请求端点推断,不可更新,使用 CamelCase |
metadata | metadata | Optional[V1ObjectMeta] | 否 | 标准对象元数据(名称、命名空间、标签、注解等) |
spec | spec | V1beta1LeaseCandidateSpec | 是 | 候选对象的具体规范,见下一节 |
对应源码定义位于 kubernetes/aio/client/models/v1beta1_lease_candidate.py,其中openapi_types声明了字段类型映射,attribute_map声明了 Python 属性名与 JSON 键名(apiVersion、kind、metadata、spec)的对应关系。
几个值得注意的实现细节:
- 大小写双别名输入:字段使用
AliasChoices("apiVersion", "api_version"),意味着构造对象时既可以传 JSON 风格键apiVersion,也可以传 Python 风格键api_version;序列化输出时固定使用apiVersion(serialization_alias)。 spec为必填字段:没有默认值,构造时必须提供V1beta1LeaseCandidateSpec实例。- 严格模式校验:模型的
model_config设置了validate_by_name=True、validate_by_alias=True、validate_assignment=True、extra="forbid"。其中extra="forbid"意味着传入任何未声明的额外字段都会直接报错,这能有效防止拼写错误被静默忽略。 __preprocess_input_names归一化:from_dict在反序列化时会先把api_version这类 snake_case 键归一化为apiVersion,再交给 pydantic 校验。
2.1 V1beta1LeaseCandidateSpec:候选规范详解
spec承载了协调式选主所需的全部关键信息,定义于 kubernetes/aio/client/models/v1beta1_lease_candidate_spec.py:
| 属性名 | JSON wire 名 | 类型 | 是否必填 | 语义说明 |
|---|---|---|---|---|
binary_version | binaryVersion | StrictStr | 是 | 二进制版本,必须是不带前导v的 semver 格式,如1.37.0 |
emulation_version | emulationVersion | Optional[StrictStr] | 否(策略为OldestEmulationVersion时必填) | 模拟版本,同样要求 semver 格式且必须小于等于binaryVersion |
lease_name | leaseName | StrictStr | 是 | 该候选者竞争的 Lease 名称,命名限制与 Lease.name 相同,不可变更(immutable);多个候选者可以引用同一个 Lease.name |
ping_time | pingTime | Optional[datetime] | 否 | 服务器最后一次请求该 LeaseCandidate 续约的时间;仅在选主时用于检查候选者是否已失去资格,更新 PingTime 后候选者会响应更新 RenewTime |
renew_time | renewTime | Optional[datetime] | 否 | 候选者最后一次被更新的时间;每次选主时 PingTime 被更新以提示候选者更新 RenewTime,长期未续约的旧候选对象会被垃圾回收 |
strategy | strategy | StrictStr | 是 | 协调式选主挑选领导者所用的策略;如果多个候选者针对同一 Lease 给出不同策略,则采用binaryVersion最新候选者提供的策略,若仍有冲突则视为用户错误,协调式选主将暂停该 Lease 的操作 |
其中pingTime/renewTime构成了一条完整的“心跳”链路:选主时协调器把PingTime置为当前时间,候选者看到后回写RenewTime;协调器据此判断候选者是否存活,并对长时间未续约的候选对象进行垃圾回收(garbage collected)。这与传统 Lease 的renewTime语义一脉相承,但增加了服务端主动探测(ping)的环节。
strategy字段当前仓库中作为StrictStr自由字符串承载,实际合法取值由集群侧约定(如OldestEmulationVersion等),客户端不做枚举限制,因此编写代码时需以目标集群版本支持的策略为准。
2.2 V1beta1LeaseCandidateList:列表容器
当需要批量读取候选对象时,API 返回的是V1beta1LeaseCandidateList(源码见 kubernetes/aio/client/models/v1beta1_lease_candidate_list.py),包含:
items: List[V1beta1LeaseCandidate](必填):schema 对象列表;metadata: Optional[V1ListMeta]:列表级元数据(continue、resourceVersion 等,用于分页与 Watch);api_version/kind:与普通对象一致。
三个模型类均已在 kubernetes/aio/client/models/init.py 与同步客户端对应模块中导出,可直接通过kubernetes.client.models.V1beta1LeaseCandidate或kubernetes.aio.client.models.V1beta1LeaseCandidate导入使用。
三、序列化与反序列化:JSON 互操作细节
模型类继承 pydanticBaseModel,并额外实现了 OpenAPI Generator 生成的序列化方法:
to_dict(serialize=False):返回 Python 命名(snake_case)字段字典;to_dict(serialize=True)时返回 wire 命名(camelCase)字典。to_json():返回使用别名(alias)的 JSON 字符串,即键名固定为apiVersion、kind、metadata、spec,可直接用于 API 请求体。from_json(json_str)/from_dict(obj):从 JSON 字符串或字典反向构造实例;反序列化前会经过__preprocess_input_names把 snake_case 键归一化为 camelCase,因此两种风格都能正确解析。
一个代表性细节:现代投影方法(__openapi_generator_modern_projection)在输出字典时遵循“只有初始化时显式设置的None可空字段才输出、其余None一律忽略”的规则,并会递归调用嵌套对象(metadata、spec)的to_dict(),保证嵌套模型序列化行为一致。这意味着to_json()产出的请求体会非常精简,不会携带一堆无意义的"field": null。
四、与 CoordinationV1beta1Api 的配合:CRUD 实战
该模型对应的 REST 资源路径为/apis/coordination.k8s.io/v1beta1/namespaces/{namespace}/leasecandidates(集群级列表为/apis/coordination.k8s.io/v1beta1/leasecandidates),由 CoordinationV1beta1Api 提供全套操作方法。异步客户端中与 LeaseCandidate 直接相关的方法(均带async前缀)包括:
| 操作 | 异步方法(kubernetes.aio) | 同步方法(kubernetes.client) | HTTP 语义 |
|---|---|---|---|
| 创建 | create_namespaced_lease_candidate | create_namespaced_lease_candidate | POST |
| 读取(单个) | read_namespaced_lease_candidate | read_namespaced_lease_candidate | GET |
| 读取(命名空间内列表) | list_namespaced_lease_candidate | list_namespaced_lease_candidate | GET |
| 读取(全命名空间) | list_lease_candidate_for_all_namespaces | 同左 | GET |
| 替换 | replace_namespaced_lease_candidate | 同左 | PUT |
| 部分更新 | patch_namespaced_lease_candidate | 同左 | PATCH |
| 删除(单个) | delete_namespaced_lease_candidate | 同左 | DELETE |
| 删除(集合) | delete_collection_namespaced_lease_candidate | 同左 | DELETE |
每个异步方法还提供_with_http_info(返回ApiResponse,含状态码与响应头)和_without_preload_content(延迟读取响应体)两种变体,便于精细控制 HTTP 行为。
通用请求参数(同步/异步客户端签名一致):
namespace(必填):对象名称与认证作用域,如default;body(必填):V1beta1LeaseCandidate实例;pretty:"true"时输出美化打印;dry_run:"All"表示所有 dry-run 阶段均会被处理,修改不会持久化;field_manager:变更发起者的名称标识,需小于 128 字符且仅含可打印字符;field_validation:Ignore/Warn/Strict三档,控制对未知/重复字段的处理方式(Strict会直接返回 BadRequest);_request_timeout:可传单个超时秒数或(connection, read)元组。
4.1 异步客户端示例:注册一个选主候选者
以下代码演示如何使用kubernetes.aio异步客户端创建 LeaseCandidate(需集群已启用 coordination.k8s.io/v1beta1 资源):
import asyncio from datetime import datetime, timezone from kubernetes import config from kubernetes.aio import client from kubernetes.aio.client.models import ( V1ObjectMeta, V1beta1LeaseCandidate, V1beta1LeaseCandidateSpec, ) async def register_candidate() -> None: config.load_incluster_config() # 或 load_kube_config() async with client.ApiClient() as api_client: api = client.CoordinationV1beta1Api(api_client) spec = V1beta1LeaseCandidateSpec( lease_name="example-leader", binary_version="1.37.0", # semver 格式,不带前导 v emulation_version="1.37.0", # 必须 <= binary_version strategy="OldestEmulationVersion", renew_time=datetime.now(timezone.utc), ) candidate = V1beta1LeaseCandidate( api_version="coordination.k8s.io/v1beta1", kind="LeaseCandidate", metadata=V1ObjectMeta(name="candidate-1", namespace="default"), spec=spec, ) created = await api.create_namespaced_lease_candidate( namespace="default", body=candidate, field_manager="my-python-leader", field_validation="Warn", ) print("created:", created.to_json()) asyncio.run(register_candidate())4.2 同步客户端示例:读取与更新
同步客户端用法完全对应(来自 kubernetes/client/api/coordination_v1beta1_api.py):
from kubernetes import client, config config.load_kube_config() v1beta1 = client.CoordinationV1beta1Api() # 读取单个候选对象 candidate = v1beta1.read_namespaced_lease_candidate( name="candidate-1", namespace="default" ) print(candidate.spec.binary_version) # 列出命名空间内全部候选对象 candidate_list = v1beta1.list_namespaced_lease_candidate(namespace="default") for item in candidate_list.items: print(item.metadata.name, item.spec.lease_name, item.spec.strategy) # 续约(更新 renewTime)——leaseName 与 binaryVersion 均不可变更 candidate.spec.renew_time = datetime.now(timezone.utc) v1beta1.replace_namespaced_lease_candidate( name="candidate-1", namespace="default", body=candidate, field_manager="my-python-leader", )注意replace(PUT)是整体替换:由于V1beta1LeaseCandidateSpec.lease_name与binary_version都是不可变(immutable)字段,续约时不应修改它们,只更新renew_time等可变字段;patch_namespaced_lease_candidate则是更轻量的局部更新方式。
五、构建模型的三种方式与校验行为
得益于 pydantic 基类,可以从不同来源构建V1beta1LeaseCandidate:
# 1. 关键字构造(推荐) from kubernetes.client.models import V1beta1LeaseCandidate, V1beta1LeaseCandidateSpec spec = V1beta1LeaseCandidateSpec( lease_name="example-leader", binary_version="1.37.0", strategy="OldestEmulationVersion", ) obj = V1beta1LeaseCandidate(spec=spec) # 2. 从 dict 构造(支持 camelCase 或 snake_case 键) obj2 = V1beta1LeaseCandidate.from_dict({ "apiVersion": "coordination.k8s.io/v1beta1", "kind": "LeaseCandidate", "metadata": {"name": "candidate-1", "namespace": "default"}, "spec": { "leaseName": "example-leader", "binaryVersion": "1.37.0", "strategy": "OldestEmulationVersion", }, }) # 3. 从 JSON 字符串构造 obj3 = V1beta1LeaseCandidate.from_json('{"spec": {...}}') # 校验:必填缺失会抛 pydantic 校验错误 try: V1beta1LeaseCandidate() # spec 必填 except Exception as exc: print("validation failed:", exc) # 校验:extra="forbid" 会拒绝未知字段 try: V1beta1LeaseCandidate(spec=spec, unknown_field="x") except Exception as exc: print("extra field rejected:", exc)由于spec必填、strategy与binary_version为StrictStr,任何缺失或类型不符的输入都会在本地立即抛出 pydantic 校验异常,而不是等到请求发送到 API Server 后才失败——这是该模型类最有价值的防御性能力。
六、适用前提与注意事项
- 版本前提:本仓库模型基于
release-1.37OpenAPI 规范生成,LeaseCandidate属于 coordination.k8s.iov1beta1分组;经查 kubernetes/aio/client/api/coordination_v1_api.py 中没有lease_candidate相关方法,即当前仓库仅暴露 v1beta1 版本。使用时需确认目标集群启用了该 API 组。 - 同步与异步双通道:
kubernetes.client(同步,基于 urllib3)与kubernetes.aio.client(异步,基于 aiohttp)都完整覆盖了该模型与 API 方法,两套代码同构,可放心在任一工程中选用。 - 不可变字段:
spec.lease_name与spec.binary_version不可更新,续约时只应刷新renew_time(配合服务端的ping_time探测),否则集群侧会拒绝请求。 - 策略一致性:多个候选者若对同一 Lease 声明不同
strategy,协调式选主会采用binaryVersion最新者的策略;冲突持续存在时该 Lease 的协调式选主不会生效(视为用户配置错误)。 - 垃圾回收:长时间未更新
renew_time的旧 LeaseCandidate 对象会被集群自动回收,活跃候选者应周期性续约以维持候选资格。
七、延伸阅读路径
- 模型主文件:kubernetes/aio/client/models/v1beta1_lease_candidate.py(同步版 kubernetes/client/models/v1beta1_lease_candidate.py)
- 规范与列表模型:kubernetes/aio/client/models/v1beta1_lease_candidate_spec.py、kubernetes/aio/client/models/v1beta1_lease_candidate_list.py
- API 操作入口:kubernetes/aio/client/api/coordination_v1beta1_api.py(同步版 kubernetes/client/api/coordination_v1beta1_api.py)
- 模型导出声明:kubernetes/aio/client/models/init.py
- 传统选主实现(Lease 方案,供对比):kubernetes/leaderelection
- 后端
- 云原生
- 容器编排
【免费下载链接】python
Official Python client library for kubernetes
相关推荐
Kubernetes 高可用基石:基于 client-go leader-election 包实现分布式主从选举(Leader Election 实战指南)
Kubernetes 高可用基石:基于 client go leader election 包实现分布式主从选举(Leader Election 实战指南) 导
云原生容器编排集群管理微服务V1StorageClassList 模型详解:kubernetes Python 异步客户端中的 StorageClass 列表对象
V1StorageClassList 模型详解:kubernetes Python 异步客户端中的 StorageClass 列表对象 本文围绕 Kuberne
后端云原生容器编排Java 分布式系统中的 Leader Election 领导者选举模式:从 Bully 到 Ring 的完整实现剖析
Java 分布式系统中的 Leader Election 领导者选举模式:从 Bully 到 Ring 的完整实现剖析 本指南以 java design pat
示例工程教程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考