
后端云原生容器编排【免费下载链接】pythonOfficial Python client library for kubernetes项目地址https://gitcode.com/gh_mirrors/python1/python点击查看免费下载本篇技术指南以 Kubernetes 官方 Python 客户端仓库GitHub 加速计划 / python1 / python即 kubernetes 官方 Python client library中由 OpenAPI Generator 生成的模型类V1LifecycleHandler为核心系统讲解容器生命周期钩子PostStart / PreStop中可用的四种动作类型Exec、HTTPGet、Sleep 与 TCPSocket。读者读完本文后将掌握该模型的完整字段定义、序列化规则、底层 pydantic 实现原理以及如何在同步客户端与 asyncio 客户端中构造和序列化生命周期钩子配置。从 RST 文档到源码V1LifecycleHandler 模块的定位本仓库的文档目录 doc/source 下kubernetes.aio.client.models.v1_lifecycle_handler模块的页面由 doc/source/kubernetes.aio.client.models.v1_lifecycle_handler.rst 通过automodule指令生成等价于将模块kubernetes.aio.client.models.v1_lifecycle_handler中全部公开成员含继承关系与未文档化的成员渲染到 HTML 文档中。该模块对应的实体源码为 kubernetes/aio/client/models/v1_lifecycle_handler.py同步客户端对应 kubernetes/client/models/v1_lifecycle_handler.py两者结构完全一致均基于 OpenAPI 文档版本 release-1.37 生成。从源码结构看V1LifecycleHandler继承自 pydantic 的BaseModel是一个纯数据模型类定义了 Kubernetes 容器生命周期钩子中一个且仅一个动作的四种候选动作。模型概览与核心语义类定义与 docstringV1LifecycleHandler在 v1_lifecycle_handler.py 中定义其类 docstring 明确给出了核心语义LifecycleHandler defines a specific action that should be taken in a lifecycle hook. One and only one of the fields, except TCPSocket must be specified.即生命周期钩子中必须且只能指定一个动作字段但tcpSocket是例外——它允许与其他字段共存这是自 Kubernetes 引入sleep与tcpSocket后对旧有互斥约束的放宽OpenAPI 层面以注释形式保留。四种动作字段Python 字段名wire 序列化名JSON/YAML类型是否必填说明execexecV1ExecAction否在容器内执行命令http_gethttpGetV1HTTPGetAction否发起 HTTP GET 请求sleepsleepV1SleepAction否在容器内休眠指定秒数tcp_sockettcpSocketV1TCPSocketAction否建立 TCP 连接可与其他字段共存源码中openapi_types与attribute_map类变量v1_lifecycle_handler.py分别记录了属性名→类型名映射与Python 字段名→JSON wire 名映射openapi_types: ClassVar[Dict[str, str]] { _exec: V1ExecAction, http_get: V1HTTPGetAction, sleep: V1SleepAction, tcp_socket: V1TCPSocketAction } attribute_map: ClassVar[Dict[str, str]] { _exec: exec, http_get: httpGet, sleep: sleep, tcp_socket: tcpSocket }__properties列表v1_lifecycle_handler.py则给出了序列化时实际参与输出的属性集合[exec, httpGet, sleep, tcpSocket]。四种动作类型的字段细节Exec 动作V1ExecAction对应源码 kubernetes/aio/client/models/v1_exec_action.py描述在容器内运行的动作仅含一个字段command: Optional[List[str]]容器内要执行的命令行。工作目录是容器文件系统中的根目录/命令是直接exec执行的不会经过 shell因此|、等 shell 指令不会生效如需 shell 必须显式调用例如[/bin/sh, -c, ...]。退出状态 0 视为健康非 0 视为不健康。HTTPGet 动作V1HTTPGetAction对应源码 kubernetes/aio/client/models/v1_http_get_action.py描述基于 HTTP GET 请求的动作字段如下host: Optional[str]要连接的主机名默认是 Pod IP官方建议在httpHeaders里设置Host头而不是直接设置host。http_headers: Optional[List[V1HTTPHeader]]wire 名httpHeaders自定义请求头HTTP 允许重复头。path: Optional[str]HTTP 服务器上要访问的路径。port: int | str必填要访问的容器端口号或端口名数字必须在 1~65535 范围端口名必须是 IANA_SVC_NAME。protocol: Optional[str]探测连接使用的 wire 协议缺省为 HTTP/1.1。scheme: Optional[str]连接 host 使用的协议方案默认 HTTP。其中V1HTTPHeaderkubernetes/aio/client/models/v1_http_header.py仅含name与value两个必填字段name在输出时会规范化大小写。Sleep 动作V1SleepAction对应源码 kubernetes/aio/client/models/v1_sleep_action.py描述休眠动作仅含一个必填字段seconds: int休眠的秒数。TCPSocket 动作V1TCPSocketAction对应源码 kubernetes/aio/client/models/v1_tcp_socket_action.py描述打开 socket的动作字段如下host: Optional[str]可选要连接的主机名默认是 Pod IP。port: int | str必填要访问的容器端口号或端口名数字范围 1~65535端口名必须是 IANA_SVC_NAME。模型在调用链中的位置V1LifecycleHandler处于一条完整的嵌套调用链中由容器规格逐层引用V1Container.lifecycle → V1LifecyclepostStart / preStop / stopSignal │ └── V1LifecycleHandlerexec / httpGet / sleep / tcpSocketkubernetes/aio/client/models/v1_container.py 中lifecycle: Optional[V1Lifecycle] None即每个容器的规格spec.containers[].lifecycle持有生命周期配置。kubernetes/aio/client/models/v1_lifecycle.py 中post_startwire 名postStart与pre_stopwire 名preStop均为V1LifecycleHandler类型另有stop_signalwire 名stopSignal字符串字段——stopSignal仅能用于.spec.os.name非空的 Pod。在 Kubernetes 语义中postStart在容器创建后立即执行preStop在容器终止前执行两者均为阻塞式管理除非容器进程失败导致 handler 被中止。字段名归一化Python 名 ↔ wire 名由于 OpenAPI 的 wire 名如httpGet、tcpSocket、postStart与 Python 命名规范snake_case不一致该生成器为每个模型实现了__preprocess_input_names归一化逻辑v1_lifecycle_handler.py。以V1LifecycleHandler为例规则如下exec与_exec同时出现会抛出ValueError只出现_exec时自动映射为exechttp_get自动归一化为httpGettcp_socket自动归一化为tcpSocket。因此使用方既可以用 Python 风格字段名也可以用 wire 风格字段名构造对象两种写法都会被正确归一化。序列化与反序列化to_dict / from_dict / to_jsonto_dict 的双通道输出to_dict(serializeFalse)v1_lifecycle_handler.py在serializeFalse时输出 Python 风格键_exec、http_get、tcp_socket在serializeTrue时输出 wire 风格键exec、httpGet、tcpSocket。现代 OpenAPI 投影通过__openapi_generator_modern_projection附加到to_dict上的现代投影v1_lifecycle_handler.py使用model_dump(by_aliasTrue, exclude_noneTrue)并递归调用四个动作子模型的to_dict()生成嵌套字典None字段不进入输出但被显式赋值的可空字段会保留。from_dict 与 from_jsonfrom_dict(obj)v1_lifecycle_handler.py先做输入名归一化再对各字段调用对应子模型的from_dict递归构造。from_json(json_str)v1_lifecycle_handler.py先json.loads再转交from_dict。to_json()则优先走现代投影并输出带 wire 别名的 JSONv1_lifecycle_handler.py。校验配置模型统一使用ConfigDict(validate_by_nameTrue, validate_by_aliasTrue, validate_assignmentTrue, extraforbid, protected_namespaces())v1_lifecycle_handler.py即既校验属性名也校验别名赋值时实时校验未知字段一律拒绝并放开 pydantic 对_前缀保护命名空间的限制这正是_exec字段能够存在的原因。实战示例构造与序列化生命周期钩子以下示例在同步与 asyncio 两套客户端中分别构造一个带postStartHTTPGet 动作与preStopExec 动作的V1LifecycleHandler。# 同步客户端kubernetes.client.models from kubernetes.client.models import ( V1Lifecycle, V1LifecycleHandler, V1ExecAction, V1HTTPGetAction, ) post_start_handler V1LifecycleHandler( http_getV1HTTPGetAction( path/ready, port8080, schemeHTTP, http_headers[{name: X-Env, value: prod}], ) ) pre_stop_handler V1LifecycleHandler( execV1ExecAction(command[/bin/sh, -c, sleep 3]) ) lifecycle V1Lifecycle(post_startpost_start_handler, pre_stoppre_stop_handler) # 输出 wire 风格字典{postStart: {httpGet: {...}}, preStop: {exec: {...}}} print(lifecycle.to_dict(serializeTrue)) print(post_start_handler.to_json())# asyncio 客户端kubernetes.aio.client.models from kubernetes.aio.client.models import ( V1Lifecycle, V1LifecycleHandler, V1ExecAction, V1HTTPGetAction, ) post_start_handler V1LifecycleHandler( http_getV1HTTPGetAction(path/ready, port8080) ) pre_stop_handler V1LifecycleHandler( execV1ExecAction(command[/bin/sh, -c, sleep 3]) ) lifecycle V1Lifecycle(post_startpost_start_handler, pre_stoppre_stop_handler) print(lifecycle.to_dict(serializeTrue))对应可运行的仓库示例可参考 examples/deployment_create.py 等文件其中展示了如何使用V1Container组装 Pod 规格并调用create_namespaced_deployment提交到集群。从反序列化方向也可以直接从一个字典还原模型from kubernetes.client.models import V1LifecycleHandler handler V1LifecycleHandler.from_dict({ exec: {command: [/bin/sh, -c, sleep 3]}, }) print(handler.to_json())同步与 asyncio 双客户端一致性本仓库同时维护两套功能对等的客户端同步包 kubernetes/client 与基于 asyncio 的 kubernetes/aio/client后者依赖aiohttp可通过 requirements-asyncio.txt 安装对应依赖。两套客户端的模型代码由同一 OpenAPI 规范生成V1LifecycleHandler及四个动作模型的字段、别名与序列化行为完全一致唯一的差异在于调用 API 时的并发模型同步阻塞 vs 异步协程模型层两者可相互对照阅读。文档页 doc/source/kubernetes.aio.client.models.v1_lifecycle_handler.rst 即服务于 asyncio 客户端模型文档源码级佐证见 kubernetes/aio/client/models/v1_lifecycle_handler.py。小结V1LifecycleHandler是 Kubernetes 容器生命周期钩子postStart/preStop的动作载体四种动作exec、httpGet、sleep、tcpSocket中通常只取一个tcpSocket允许例外共存模型基于 pydantic 的BaseModel实现支持字段名归一化、validate_by_alias、extraforbid严格校验以及to_dict(serialize...)双通道输出完整调用链为V1Container.lifecycle → V1Lifecycle → V1LifecycleHandler → 四种 Action同步与 asyncio 两套客户端行为一致实际使用中应将V1LifecycleHandler挂接到V1Lifecycle的postStart/preStop再通过V1Container(lifecycle...)组装 Pod 规格最终由对应 API 提交到 Kubernetes 集群。赞分享后端云原生容器编排【免费下载链接】pythonOfficial Python client library for kubernetes项目地址https://gitcode.com/gh_mirrors/python1/python点击查看免费下载相关推荐Kubernetes容器生命周期钩子深度解析Kubernetes容器生命周期钩子深度解析 前言 在Kubernetes中管理容器时了解容器生命周期的各个阶段至关重要。Kubernetes提供了类似编程框文档教程云原生Sails config/bootstrap.js 详解应用启动前的种子函数与生命周期钩子Sails config/bootstrap.js 详解应用启动前的种子函数与生命周期钩子 config/bootstrap.js 是 Sails 框架中一个后端D2L 构建者指南模型构建、参数管理与 GPU 计算的完整实战手册D2L 构建者指南模型构建、参数管理与 GPU 计算的完整实战手册 本篇技术指南围绕开源深度学习教材《Dive into Deep Learning》D2L后端云原生容器编排上一篇ESP32终极入门指南30分钟快速掌握Arduino核心开发下一篇QuickRecorder 完整指南macOS 免费轻量录屏工具双音轨分离一次讲清创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考