ARTICLE DETAIL

资讯详情

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

使用 Kubernetes Python 异步客户端 CoordinationV1Api 管理 Lease 租约对象

使用 Kubernetes Python 异步客户端 CoordinationV1Api 管理 Lease 租约对象 后端云原生容器编排【免费下载链接】pythonOfficial Python client library for kubernetes项目地址https://gitcode.com/gh_mirrors/python1/python点击查看免费下载本文以 Kubernetes 官方 Python 客户端仓库OpenAPI Generator 生成的异步 SDKOpenAPI 版本 release-1.37中coordination_v1_api模块为主线完整讲解异步CoordinationV1Api的类结构、V1Lease系列模型、全部 CRUD 方法与底层调用链并结合仓库中leaderelection分布式选主组件给出可直接运行的实战方案。读完本文你将掌握用async/await方式对coordination.k8s.io/v1下的 Lease 资源进行创建、读取、更新、补丁、删除、批量删除与全集群列举的完整能力并理解三种返回形态普通、_with_http_info、_without_preload_content的差异与选择场景。一、模块定位异步 SDK 中的 Coordination v1 入口该 RST 文档doc/source/kubernetes.aio.client.api.coordination_v1_api.rst通过 Sphinxautomodule指令将 kubernetes/aio/client/api/coordination_v1_api.py 中的CoordinationV1Api类自动展开为 API 参考页。也就是说该文档的主体即是这个类——它是异步客户端中操作Lease租约资源的唯一v1入口对应 Kubernetes 的coordination.k8s.io/v1API 组。几个关键定位事实类文件头部标注 OpenAPI 文档版本为release-1.37由 OpenAPI Generator 自动生成源码顶部明确generated by Openapi GeneratorDo not edit the class manually。在 kubernetes/aio/client/init.py 中CoordinationV1Api与CoordinationApi聚合版本、CoordinationV1alpha2Api、CoordinationV1beta1Api一起被导出说明该仓库同时提供了v1、v1alpha2、v1beta1三个版本的协调 API本文聚焦稳定的v1版本。类实现了异步上下文管理器协议__aenter__/__aexit__与close()。构造函数若未传入api_client会通过ApiClient._get_default_or_new()获取并自持所有权若传入则共享外部 clientclose()时只关闭自有的 client。这保证了 client 的生命周期不会因为 API 对象被重新赋值而意外转移或泄漏。在深入方法前先理解它操作的数据模型。二、核心模型V1Lease 与 V1LeaseSpec 字段全解CoordinationV1Api的全部方法都围绕Lease对象展开。涉及的模型在模块头部导入v1_lease.py —V1Lease即单个 Lease 资源含metadata与specv1_lease_list.py —V1LeaseList列表返回v1_lease_spec.py —V1LeaseSpec租约规格v1_delete_options.py —V1DeleteOptions删除选项v1_status.py —V1Status批量删除结果v1_api_resource_list.py —V1APIResourceList资源发现结果其中V1LeaseSpec是最需要理解的部分v1_lease_spec.py 定义了 7 个字段含义如下字段Python 属性 / JSON 名类型说明acquire_time/acquireTimedatetime当前租约被获取的时间holder_identity/holderIdentitystr当前租约持有者标识若使用 Coordinated Leader Election必须等于被选中的LeaseCandidate.metadata.namelease_duration_seconds/leaseDurationSecondsint候选者需要等待多长时间才能强制获取租约以最近一次renewTime为基准lease_transitions/leaseTransitionsint租约在持有者之间转移的次数preferred_holder/preferredHolderstr向当前持有者提示存在更优持有者、应当让出租约仅当strategy被设置时才可设置renew_time/renewTimedatetime当前持有者最近一次续约的时间strategystr协调式选主coordinated leader election的选主策略不设置表示该租约没有活跃的协调逻辑Alpha需开启CoordinatedLeaderElectionfeature gate值得注意的模型特性V1LeaseSpec采用 pydantic v2 的AliasChoices同时接受acquireTime与acquire_time两种输入命名见 v1_lease_spec.py且extraforbid即传入未声明的字段会被拒绝to_dict(serializeTrue)输出 wire 命名如holderIdentityto_dict()默认输出 Python 命名。构造请求体时建议直接用 JSON 别名命名避免序列化歧义。三、方法全景CoordinationV1Api 的 9 组操作从 coordination_v1_api.py 的方法定义可见CoordinationV1Api共提供 9 组公共操作每组另有_with_http_info与_without_preload_content变体公共方法HTTP 语义底层端点返回类型create_namespaced_leasePOST/apis/coordination.k8s.io/v1/namespaces/{namespace}/leasesV1Leasedelete_collection_namespaced_leaseDELETE/apis/coordination.k8s.io/v1/namespaces/{namespace}/leasesV1Statusdelete_namespaced_leaseDELETE/apis/coordination.k8s.io/v1/namespaces/{namespace}/leases/{name}objectget_api_resourcesGET/apis/coordination.k8s.io/v1/V1APIResourceListlist_lease_for_all_namespacesGET/apis/coordination.k8s.io/v1/leasesV1LeaseListlist_namespaced_leaseGET/apis/coordination.k8s.io/v1/namespaces/{namespace}/leasesV1LeaseListpatch_namespaced_leasePATCH/apis/coordination.k8s.io/v1/namespaces/{namespace}/leases/{name}V1Leaseread_namespaced_leaseGET/apis/coordination.k8s.io/v1/namespaces/{namespace}/leases/{name}V1Leasereplace_namespaced_leasePUT/apis/coordination.k8s.io/v1/namespaces/{namespace}/leases/{name}V1Lease上述端点路径均可以从各_serialize方法的resource_path参数直接确认例如创建方法的路径定义在 coordination_v1_api.py删除方法在 coordination_v1_api.py列表方法在 coordination_v1_api.py替换方法在 coordination_v1_api.py。三种调用形态与底层调用链每个操作都有三个公开变体这是 OpenAPI Generator 异步模板的固定模式普通形态如create_namespaced_lease返回反序列化后的模型对象V1Lease等适合大多数场景。_with_http_info形态返回ApiResponse[T]除数据外还携带 HTTP 状态、请求头等完整信息适合需要诊断或判断状态码的调用。_without_preload_content形态返回原始RESTResponseType响应体不预加载、流式读取适合大响应体或需要自行消费原始流的场景例如 Watch 流。底层调用链高度统一以create_namespaced_lease为例见 coordination_v1_api.pycreate_namespaced_lease └─ await _create_namespaced_lease_serialize(...) # 组装 path/query/header/body/auth └─ await api_client.call_api(*_param, _request_timeout...) └─ await response_data.read() └─ api_client.response_deserialize(response_data, response_types_map) └─ .data # 得到 V1Lease_serialize阶段会把可选参数映射为查询参数如pretty、dryRun、fieldManager、fieldValidation把namespace填入路径参数并设置Accept头application/json、application/yaml、application/vnd.kubernetes.protobuf、application/cbor认证方式统一为BearerToken_auth_settings: [BearerToken]。四、关键参数详解写入类操作的通用参数所有写入POST/PUT/PATCH/DELETE方法共享一批参数理解它们对正确使用 API 至关重要pretty可选 strtrue时输出美化格式默认false除非 User-Agent 表明是浏览器或 curl/wget 等命令行工具。dry_run可选 strAll表示执行所有 dry-run 阶段但不持久化修改非法或未识别的 dryRun 指令会返回错误响应。field_manager可选 str与修改行为关联的实体名称必须少于 128 个字符且只含可打印字符。对于 apply 请求application/apply-patch必填对 JsonPatch、MergePatch、StrategicMergePatch 等非 apply 补丁可选。field_validation可选 str服务端处理请求体中未知字段/重复字段的策略三档取值Ignore静默丢弃未知字段、忽略重复字段v1.23 之前的默认行为Warn对每个被丢弃的未知字段和重复字段通过标准 warning 响应头告警请求仍会成功v1.23 默认Strict只要存在会被丢弃的未知字段或重复字段就以 BadRequest 失败错误信息包含所有问题字段。grace_period_seconds可选 int删除用删除前等待的秒数必须是非负整数0表示立即删除不设置则使用该资源类型的默认宽限期。propagation_policy可选 str删除用垃圾回收策略取值Orphan依赖对象被孤立、Background后台级联删除、Foreground前台级联删除与已废弃的orphan_dependents互斥。force可选 bool仅 PATCH强制 Apply 请求时夺回他人拥有的冲突字段非 apply 补丁必须不设置。ignore_store_read_error_with_cluster_breaking_potential可选 bool删除用默认false。置true会在正常删除流程遇到损坏对象错误时触发不安全删除——跳过 finalizer 与前置条件检查直接移除存储对象可能破坏集群文档明确警告use only if you REALLY know what you are doing。列表类方法list_namespaced_lease、list_lease_for_all_namespaces还额外支持分页与 Watch 相关参数_continue续传令牌过期约 5–15 分钟、limit分页大小服务端保证一致快照语义、label_selector/field_selector标签/字段过滤、resource_version与resource_version_match资源版本约束、allow_watch_bookmarks、send_initial_eventsWatch 时先发合成事件与 Bookmark、watch开启流式监听、timeout_secondslist/watch 超时。从 coordination_v1_api.py 可见列表请求的Accept额外包含application/json;streamwatch、application/vnd.kubernetes.protobuf;streamwatch、application/cbor-seq即支持流式监听协议。五、实战用异步方式完成 Lease 全生命周期管理下面给出可直接复制的完整异步示例覆盖创建 → 列出 → 读取 → 补丁 → 替换 → 删除全流程。示例使用kubeconfig加载集群配置仓库中的 examples/out_of_cluster_config.py 展示了同样的加载方式。import asyncio from datetime import datetime, timezone from kubernetes import config from kubernetes.aio.client import ApiClient, CoordinationV1Api from kubernetes.aio.client.models import V1Lease, V1LeaseSpec, V1ObjectMeta async def main(): # 1) 加载 kubeconfig 并创建异步 client 与 API 对象 config.load_kube_config() async with ApiClient() as api_client: api CoordinationV1Api(api_client) namespace default name demo-lease # 2) 创建 Lease构造 V1Leasespec 字段使用 JSON 别名 lease V1Lease( metadataV1ObjectMeta(namename, namespacenamespace), specV1LeaseSpec( holderIdentitydemo-holder, leaseDurationSeconds15, acquireTimedatetime.now(timezone.utc), renewTimedatetime.now(timezone.utc), leaseTransitions0, ), ) created await api.create_namespaced_lease(namespacenamespace, bodylease) print(created:, created.metadata.name, created.spec.holder_identity) # 3) 列出命名空间内所有 Lease返回 V1LeaseList lease_list await api.list_namespaced_lease(namespacenamespace) print(total leases:, len(lease_list.items)) # 4) 读取单个 Lease got await api.read_namespaced_lease(namename, namespacenamespace) print(holder:, got.spec.holder_identity) # 5) 补丁更新partially update patched await api.patch_namespaced_lease( namename, namespacenamespace, body{spec: {leaseTransitions: 1}}, ) print(transitions after patch:, patched.spec.lease_transitions) # 6) 完整替换PUT lease.spec.lease_transitions 2 replaced await api.replace_namespaced_lease( namename, namespacenamespace, bodylease ) print(transitions after replace:, replaced.spec.lease_transitions) # 7) 删除单个 Lease带 propagationPolicy await api.delete_namespaced_lease( namename, namespacenamespace, propagation_policyBackground, ) # 8) 演示批量删除按 labelSelector 过滤 await api.delete_collection_namespaced_lease( namespacenamespace, label_selectorappdemo, propagation_policyBackground, ) if __name__ __main__: asyncio.run(main())要点提示建议用async with ApiClient() as api_client包住全部调用借助__aexit__自动关闭连接CoordinationV1Api本身也实现了__aenter__/__aexit__可嵌套使用。构造V1LeaseSpec时既可传holderIdentity也可传holder_identity但为避免歧义代码中统一使用 JSON 别名风格。若需要拿到完整 HTTP 响应状态码、响应头把方法替换为_with_http_info变体即可例如resp await api.read_namespaced_lease_with_http_info(namename, namespacenamespace) print(resp.status_code, resp.headers)六、仓库佐证Leaderelection 组件如何消费 LeaseCoordinationV1Api的核心应用场景正是分布式选主。仓库在 kubernetes/leaderelection 目录实现了完整的 Leader Election 逻辑其中leaderelection.py 负责选主状态机与续约循环leaderelectionrecord.py 定义LeaderElectionRecord其字段holderIdentity、leaseDurationSeconds、acquireTime、renewTime、leaseTransitions与V1LeaseSpec一一对应electionconfig.py 提供Config配置类lease_duration、renew_deadline、retry_period等leaderelection_test.py 是完整的单测覆盖。也就是说V1LeaseSpec中的leaseDurationSeconds、renewTime、holderIdentity、leaseTransitions正是选主算法的续约窗口、最近续约时间、当前持有者与转移计数——开发者可以直接基于CoordinationV1Api实现自定义的分布式锁或高可用主备切换也可以直接复用仓库的leaderelection包。七、注意事项与最佳实践RBAC 权限所有请求使用BearerToken认证见各_serialize的_auth_settings调用方 ServiceAccount/用户需具备对coordination.k8s.io/v1下leases资源的相应 verbsget/list/watch/create/update/patch/delete。续约必须及时leaseDurationSeconds是候选者强制获取租约的等待时长持有者应在其renewTime过期前周期性调用replace_namespaced_lease或patch_namespaced_lease续约read_namespaced_lease返回的spec.renew_time是判断自己是否仍持有租约的依据。delete_collection_namespaced_lease的过滤批量删除通过label_selector/field_selector精确定位对象避免误删dry_runAll可在删除前验证影响范围。Watch 流式监听list_lease_for_all_namespaces(watchTrue, allow_watch_bookmarksTrue)可长期订阅全集群 Lease 变更配合_without_preload_content或kubernetes/watch组件消费流式事件注意同时设置resource_version与合理的timeout_seconds。strategy与preferredHolder是 Alpha 能力仅在启用CoordinatedLeaderElectionfeature gate 的集群中有效生产环境使用前需确认集群版本与 feature gate 状态。异常处理401是所有方法的已知错误响应码各_response_types_map中401: None读取、写入失败会抛出ApiException建议统一捕获并按状态码分支处理。八、进一步探索查看完整类定义与每个方法的 docstringkubernetes/aio/client/api/coordination_v1_api.py模型字段与序列化细节kubernetes/aio/client/models/v1_lease_spec.py、kubernetes/aio/client/models/v1_lease.py异步 client 基类与连接管理kubernetes/aio/client/api_client.py选主组件kubernetes/leaderelection异步用法总览examples_asyncio本文档的 Sphinx 源doc/source/kubernetes.aio.client.api.coordination_v1_api.rst赞分享后端云原生容器编排【免费下载链接】pythonOfficial Python client library for kubernetes项目地址https://gitcode.com/gh_mirrors/python1/python点击查看免费下载相关推荐3个你从未意识到的GitHub社区AI代码审查如何改变你的开发习惯3个你从未意识到的GitHub社区AI代码审查如何改变你的开发习惯 想象一下当你提交代码后一个智能助手立即为你分析每一个潜在问题从安全漏洞到性能瓶颈再到后端云原生容器编排kube-state-metrics 中 Lease 监控指标详解用 kube_lease_owner 与 kube_lease_renew_time 观测 K8s 租约对象kube state metrics 中 Lease 监控指标详解用 kube_lease_owner 与 kube_lease_renew_time 观测可观测性指标监控云原生使用 Kubernetes Python 客户端异步 API 操作 apiregistration.k8s.io从 APIGroup 发现到 APIService 全生命周期管理使用 Kubernetes Python 客户端异步 API 操作 apiregistration.k8s.io从 APIGroup 发现到 APIServi后端云原生容器编排上一篇LeRobot多机器人支持详解从HopeJR到SO-101的完整配置教程下一篇itrustee_sdk与OpenEuler完美融合构建企业级可信计算平台创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表