☰
Kubernetes Python 客户端 V1ContainerRestartRule 模型详解:基于退出码的容器级重启规则(同步与异步 API 实战指南)
2026/9/29 2:48:55 网站建设 项目流程
  • 后端
  • 云原生
  • 容器编排

【免费下载链接】python

Official Python client library for kubernetes

项目地址:https://gitcode.com/gh_mirrors/python1/python
点击查看免费下载

导读

V1ContainerRestartRule是 Kubernetes 官方 Python 客户端(本仓库gh_mirrors/python1/python)中描述"容器退出后如何处理"的核心模型:它允许开发者针对容器退出码(exit code)定义逐条求值的重启规则,从而在 Pod 级/容器级restartPolicy之外实现更精细的容器自愈策略。本文将以doc/source/kubernetes.aio.client.models.v1_container_restart_rule.rst对应的模块为骨架,结合同步(kubernetes.client)与异步(kubernetes.aio.client)两套生成的源码、Swagger 定义与官方模型文档,完整讲解该模型的字段语义、配置约束、构造/序列化用法及其在V1Container中的实际挂载方式。

一、文档定位:Sphinx autodoc 生成的模型参考页

doc/source/kubernetes.aio.client.models.v1_container_restart_rule.rst本身是一个标准的 Sphinxautomodule存根文件,内容为:

.. automodule:: kubernetes.aio.client.models.v1_container_restart_rule :members: :show-inheritance: :undoc-members:

这意味着该页面的全部正文由 Sphinx 在构建文档时自动从 kubernetes/aio/client/models/v1_container_restart_rule.py 模块中抽取生成——包括类 docstring、每个字段的Field(description=...)注释以及全部公开方法(to_json/from_json/to_dict/from_dict等)。因此,理解该模型的权威材料正是仓库内的模型源码与 OpenAPI 定义,本文后续内容全部以此为事实依据。

该模块属于仓库的异步客户端(aio目录),对应的同步版本位于 kubernetes/client/models/v1_container_restart_rule.py,两者由 OpenAPI Generator 从release-1.37版本的 Kubernetes OpenAPI 规范(见 scripts/swagger.json)生成,结构完全对称。

二、模型字段语义:action 与 exit_codes

在 kubernetes/aio/client/models/v1_container_restart_rule.py#L97-L108 中,类定义如下:

class V1ContainerRestartRule(BaseModel): """ ContainerRestartRule describes how a container exit is handled. """ action: StrictStr = Field(description="Specifies the action taken on a container exit if the requirements are satisfied. The only possible value is \"Restart\" to restart the container.") exit_codes: Optional[V1ContainerRestartRuleOnExitCodes] = Field( default=None, validation_alias=AliasChoices("exitCodes", "exit_codes"), serialization_alias="exitCodes", )

其字段构成如下:

字段类型必选语义
actionStrictStr是(required)容器退出且满足条件时采取的动作,当前唯一合法取值是"Restart"(即重启容器)。Swagger 定义中required: ["action"](scripts/swagger.json#L7230-L7232)
exit_codesOptional[V1ContainerRestartRuleOnExitCodes]否描述"依据容器退出码判断是否满足重启条件"的条件对象;Swagger 中其描述为 "Represents the exit codes to check on container exits."(scripts/swagger.json#L7224-L7227)

值得注意的细节:

  • 字段名大小写转换:Python 属性名为 snake_case 的exit_codes,但在 API 线格式(JSON)中序列化为 camelCase 的exitCodes。这是通过validation_alias=AliasChoices("exitCodes", "exit_codes")与serialization_alias="exitCodes"双重别名实现的——构造对象时两种写法都可接受,输出 JSON 时统一使用exitCodes。
  • 类级元数据:openapi_types、attribute_map与__properties = ["action", "exitCodes"]三个类变量分别记录了字段类型映射、属性名到 JSON 键的映射以及参与序列化的属性清单,可用于反射式地遍历模型结构。

2.1 子模型 V1ContainerRestartRuleOnExitCodes:In / NotIn 退出码条件

exit_codes指向的 V1ContainerRestartRuleOnExitCodes(源码见 kubernetes/aio/client/models/v1_container_restart_rule_on_exit_codes.py#L95-L106),负责表达"哪些退出码会触发规则":

class V1ContainerRestartRuleOnExitCodes(BaseModel): operator: StrictStr = Field(description="... Possible values are: - In: ... - NotIn: ...") values: Optional[List[StrictInt]] = Field( default=None, description="Specifies the set of values to check for container exit codes. At most 255 elements are allowed.", )
字段类型必选语义与约束
operatorStrictStr是退出码与指定取值集合的关系运算符,可选In(容器退出码属于指定集合即满足)或NotIn(不属于指定集合即满足),见官方模型文档 kubernetes/docs/V1ContainerRestartRuleOnExitCodes.md
valuesOptional[List[int]]否待匹配的退出码取值集合,Swagger 中元素格式为int32(scripts/swagger.json#L7241-L7247),最多允许 255 个元素

三、挂载位置:V1Container.restartPolicyRules 的约束语义

V1ContainerRestartRule并不会单独出现在 API 请求里,而是作为容器规格的规则列表被挂载。在 kubernetes/aio/client/models/v1_container.py#L131 中:

restart_policy_rules: Optional[List[V1ContainerRestartRule]] = Field( default=None, validation_alias=AliasChoices("restartPolicyRules", "restart_policy_rules"), serialization_alias="restartPolicyRules", description="Represents a list of rules to be checked to determine if the container should be restarted on exit. The rules are evaluated in order. Once a rule matches a container exit condition, the remaining rules are ignored. If no rule matches the container exit condition, the Container-level restart policy determines the whether the container is restarted or not. Constraints on the rules: - At most 20 rules are allowed. - Rules can have the same action. - Identical rules are not forbidden in validations. When rules are specified, container MUST set RestartPolicy explicitly even it if matches the Pod's RestartPolicy.", )

由该字段描述与 Swagger 定义(scripts/swagger.json#L7054-L7061)可以提炼出以下权威约束:

  1. 按序求值,首个命中即短路:规则列表按顺序检查,一旦某条规则匹配了容器退出条件,剩余规则被忽略;
  2. 无规则命中时回退:若所有规则均不匹配,则由容器级restartPolicy(V1Container.restart_policy,见 v1_container.py#L130)决定是否重启;
  3. 数量上限:最多允许 20 条规则;
  4. 显式声明要求:只要指定了restartPolicyRules,容器必须同时显式设置RestartPolicy(即使其值与 Pod 的 RestartPolicy 相同);
  5. 列表语义:Swagger 中restartPolicyRules数组标记为x-kubernetes-list-type: atomic(scripts/swagger.json#L7060),即该列表作为整体原子替换,不参与按 key 合并;
  6. 作用范围限制:restartPolicyRules还出现在V1EphemeralContainer上(kubernetes/aio/client/models/v1_ephemeral_container.py#L131),但字段描述明确说明"You cannot set this field on ephemeral containers"——临时容器(如调试用 debug container)不允许配置重启规则。

四、构造、校验与序列化实战

4.1 直接构造与别名容忍

由于 pydantic 配置为validate_by_alias=True且AliasChoices("exitCodes", "exit_codes"),构造时两种键写法均合法:

from kubernetes.aio.client.models.v1_container_restart_rule import V1ContainerRestartRule from kubernetes.aio.client.models.v1_container_restart_rule_on_exit_codes import V1ContainerRestartRuleOnExitCodes # 方式一:使用 camelCase 别名 rule = V1ContainerRestartRule( action="Restart", exitCodes=V1ContainerRestartRuleOnExitCodes(operator="In", values=[137, 143]), ) # 方式二:使用 snake_case 属性名(效果等价) rule2 = V1ContainerRestartRule( action="Restart", exit_codes=V1ContainerRestartRuleOnExitCodes(operator="NotIn", values=[0]), )

两个需要留意的校验行为(来自model_config,见 v1_container_restart_rule.py#L134-L140):

  • validate_assignment=True:字段赋值时同样进行类型校验;
  • extra="forbid":未知字段会被直接拒绝(例如误写exitCode单数会抛校验错误);
  • action类型为StrictStr,传入非字符串会校验失败;不过客户端并不内置枚举校验,"Restart"以外的取值在模型层仍可通过(最终由 API Server 校验),使用时请严格遵循唯一合法值"Restart"。

4.2 JSON 与 dict 的往返

官方模型文档 kubernetes/docs/V1ContainerRestartRule.md 给出的标准用法如下:

from kubernetes.aio.client.models.v1_container_restart_rule import V1ContainerRestartRule # 从 JSON 字符串创建实例 rule_instance = V1ContainerRestartRule.from_json('{"action": "Restart", "exitCodes": {"operator": "In", "values": [1, 137]}}') # 转回 JSON(使用别名,输出 exitCodes 驼峰键) print(rule_instance.to_json()) # 转 dict,再反序列化回来 rule_dict = rule_instance.to_dict() rule_from_dict = V1ContainerRestartRule.from_dict(rule_dict)

底层实现要点(均可在 v1_container_restart_rule.py 中核实):

  • from_dict会先调用__preprocess_input_names(v1_container_restart_rule.py#L120-L132):当输入 dict 中只有 snake_case 的exit_codes而没有exitCodes时,自动转换为exitCodes再进入 pydantic 校验——这正是官方生成代码保证"两种命名都能反序列化"的机制;
  • from_dict对嵌套对象递归调用V1ContainerRestartRuleOnExitCodes.from_dict(...)(v1_container_restart_rule.py#L239),确保子模型完整还原;
  • to_dict()与to_json()通过_get_openapi_to_dict检测到的"现代投影"方法生成以 wire 名(exitCodes)为键的字典,且None值仅在显式设置过时才输出(见 v1_container_restart_rule.py#L185-L206)。

4.3 组装进完整容器规格

结合V1Container,可以构建出携带规则的可提交规格(写入/更新 Pod 或工作负载时使用):

from kubernetes.aio.client.models.v1_container import V1Container from kubernetes.aio.client.models.v1_container_restart_rule import V1ContainerRestartRule from kubernetes.aio.client.models.v1_container_restart_rule_on_exit_codes import V1ContainerRestartRuleOnExitCodes container = V1Container( name="worker", image="busybox:1.36", command=["sh", "-c", "exit 137"], restart_policy="Always", # 规则存在时 MUST 显式设置(见 v1_container.py#L130-L131) restart_policy_rules=[ V1ContainerRestartRule( action="Restart", exit_codes=V1ContainerRestartRuleOnExitCodes(operator="In", values=[137, 143]), ), V1ContainerRestartRule( action="Restart", exit_codes=V1ContainerRestartRuleOnExitCodes(operator="NotIn", values=[0]), ), ], ) print(container.to_json())

上述restart_policy_rules最多 20 条、按序求值、首个命中即生效;values集合最多 255 个元素——这些限制在编码前就应纳入设计。

五、同步客户端与异步客户端的对称关系

本仓库为同一 OpenAPI 定义维护了两套生成客户端:

  • 同步版:kubernetes.client.models.v1_container_restart_rule.V1ContainerRestartRule(kubernetes/client/models/v1_container_restart_rule.py);
  • 异步版:kubernetes.aio.client.models.v1_container_restart_rule.V1ContainerRestartRule(本 RST 文档所对应模块)。

两者的字段定义、别名策略、校验配置与序列化行为完全一致,差异仅在导入路径。异步版的所有模型会被聚合导出,可以直接从包顶层导入,如 kubernetes/aio/client/init.py#L1120-L1121 所示:

from kubernetes.aio.client.models.v1_container_restart_rule import V1ContainerRestartRule as V1ContainerRestartRule from kubernetes.aio.client.models.v1_container_restart_rule_on_exit_codes import V1ContainerRestartRuleOnExitCodes as V1ContainerRestartRuleOnExitCodes

同时也注册在 kubernetes/aio/client/models/init.py#L110-L111 的__all__中。因此在实际项目中可以这样使用:

from kubernetes.aio.client.models import V1ContainerRestartRule, V1ContainerRestartRuleOnExitCodes

同步客户端的使用方式完全相同,只需把kubernetes.aio.client换成kubernetes.client。

六、源码与文档索引(供深入研读)

以下文件按"从定义到使用"的链条排列,便于继续跟踪:

  • 模型定义(异步):kubernetes/aio/client/models/v1_container_restart_rule.py,子模型 v1_container_restart_rule_on_exit_codes.py
  • 模型定义(同步):kubernetes/client/models/v1_container_restart_rule.py
  • 挂载字段restartPolicyRules:V1Container(kubernetes/aio/client/models/v1_container.py#L131)与V1EphemeralContainer(kubernetes/aio/client/models/v1_ephemeral_container.py#L131)
  • 官方模型文档页:kubernetes/docs/V1ContainerRestartRule.md、kubernetes/docs/V1ContainerRestartRuleOnExitCodes.md
  • OpenAPI 规范来源:scripts/swagger.json#L7217-L7251(v1.ContainerRestartRule与v1.ContainerRestartRuleOnExitCodes定义)、scripts/swagger.json#L7054-L7061(v1.Container.restartPolicyRules)
  • Sphinx 文档存根:doc/source/kubernetes.aio.client.models.v1_container_restart_rule.rst

结语

V1ContainerRestartRule是 Kubernetes 客户端在容器级重启策略上的精细控制入口:通过action + exit_codes(In/NotIn)的组合,配合V1Container.restartPolicyRules的按序求值语义,可以实现"特定退出码才重启、正常退出不重启"之类的定向自愈逻辑。使用时请务必记住三条硬约束——action仅"Restart"、规则最多 20 条、values最多 255 个元素,且一旦启用规则就必须显式设置容器restartPolicy;同时注意该字段对 ephemeral 容器不可用。掌握以上语义后,无论使用同步还是异步客户端,都能正确构造、校验并提交这类规格。

  • 后端
  • 云原生
  • 容器编排

【免费下载链接】python

Official Python client library for kubernetes

项目地址:https://gitcode.com/gh_mirrors/python1/python
点击查看免费下载

相关推荐

上一篇:7步掌握Dependency-Check:构建安全的软件供应链
下一篇:Locust Web UI 深度扩展指南:以 React 组件库方式定制你的压测控制台

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询