Skip to main content

Kubernetes Operator Pythonic 框架 (Kopf)

项目描述

Kubernetes Operator Pythonic 框架 (Kopf)

支持的 Python 版本 CI 编解码器 覆盖状态 警报总数 语言等级:Python 预提交

Kopf ——Kubernetes Operator Pythonic 框架——是一个框架和库,可以让 Kubernetes Operator 的开发更容易,只需几行 Python 代码。

主要目标是将域驱动设计带入基础设施级别,Kubernetes 是域对象(自定义资源)的编排器/数据库,并且操作员包含域逻辑(没有基础设施逻辑或具有最少的基础设施逻辑)。

该项目最初zalando-incubator/kopf于 2019 年 3 月启动,然后nolar/kopf于 2020 年 8 月分叉:但它是相同的代码库、相同的包、相同的开发人员。

文档

特征

  • 简单但功能强大:
    • 仅包含 2 个文件的全功能运算符:一个Dockerfile+ 一个 Python 文件 (*)。
    • 使用声明性方法处理通过装饰器注册的函数。
    • 没有与 K8s API 通信的基础设施样板代码。
    • 同步和异步处理程序,同步处理程序在后台线程化。
    • 带有示例的详细文档。
  • Python 概念与 Kubernetes 概念之间的直观映射:
    • 将资源数据编组到处理程序的 kwargs。
    • 将处理程序的结果编组到资源的状态。
    • 将日志消息发布为链接到资源的 Kubernetes 事件。
  • 支持 K8s 中存在的任何东西:
    • 自定义 K8s 资源。
    • 内置 K8s 资源(pod、命名空间等)。
    • 一个运算符中的多种资源类型。
    • 集群和命名空间运算符。
  • 开发人员希望的所有处理方式:
    • 从 K8s API 接收到的事件的低级处理程序“按原样”(相当于通知)。
    • 用于检测到的更改原因的高级处理程序(创建、带有差异的更新、删除)。
    • 仅处理选定字段而不是整个对象(如果需要)。
    • 动态生成或有条件的子处理程序(高级功能)。
    • 只要资源存在就计时的计时器,可选地,自上次更改以来有延迟。
    • 只要资源存在就运行的守护进程(在线程或异步任务中)。
    • 验证和修改 admission webhook(使用开发模式隧道)。
    • 资源或其摘录的实时内存索引。
    • 使用隐身模式过滤(无日志记录):通过任意过滤函数、通过带有值的标签/注释、存在/不存在或动态回调。
    • 内存中的通用容器,用于存储单个资源的不可序列化对象。
  • 处理的最终一致性:
    • 在出现任意错误的情况下重试处理程序,直到它们成功。
    • 请求特殊重试或不再重试的特殊例外。
    • 尝试次数或时间的自定义限制。
    • 运营商重新启动后存活的进度的隐式持久性。
    • 对重新启动和长时间停机的容忍度:事后处理更改。
  • 了解其他基于 Kopf 的运营商:
    • 相同资源种类的不同基于 Kopf 的运算符的可配置身份。
    • 由于同一操作员的跨 pod 感知(“对等”)而避免双重处理。
    • 当开发模式操作员在集群外运行时暂停已部署的操作员。
  • 额外的工具包和集成:
    • 对具有名称/标签传播的对象层次结构的一些有限支持。
    • 对任何 K8s 客户端库都友好(并且与客户端无关)。
    • 启动/清理操作员级别的处理程序。
    • 活性探测端点和基本指标导出。
    • 用于在内存中按测试操作员运行的基本测试工具包。
    • 可嵌入到其他 Python 应用程序中。
  • 高度可配置(在一定程度上)。

(*)小字体:运营商本身的两个文件,加上一些部署文件,如 RBAC 角色、绑定、服务帐户、网络策略——在特定基础架构中部署应用程序所需的一切。

例子

有关典型用例的示例,请参见示例。

一个简约的运算符可以如下所示:

import kopf

@kopf.on.create('kopfexamples')
def create_fn(spec, name, meta, status, **kwargs):
    print(f"And here we are! Created {name} with spec: {spec}")

有许多 kwargs 可用,例如body, meta, spec, status, name, namespace, retry, diff, old, new,logger等:请参阅参数

为每个资源运行一个永不退出的函数,只要它存在:

import time
import kopf

@kopf.daemon('kopfexamples')
def my_daemon(spec, stopped, **kwargs):
    while not stopped:
        print(f"Object's spec: {spec}")
        time.sleep(1)

或与计时器相同:

import kopf

@kopf.timer('kopfexamples', interval=1)
def my_timer(spec, **kwargs):
    print(f"Object's spec: {spec}")

就这么简单!有关更多功能,请参阅文档

用法

需要 Python 3.7+: 官方支持并测试了CPythonPyPy ;其他 Python 实现也可以工作。

我们假设在集群中执行算子时,必须使用您喜欢的 CI/CD 工具将其打包成 docker 镜像。

FROM python:3.7
ADD . /src
RUN pip install kopf
CMD kopf run /src/handlers.py --verbose

handlers.py带有处理程序的 Python 脚本在哪里(参见examples/*/example.py示例)。

有关kopf run --help附加处理程序的其他方法,请参阅。

贡献

请阅读CONTRIBUTING.md 以了解我们向我们提交拉取请求的流程的详细信息,并请确保您遵循CODE_OF_CONDUCT.md

要为本地开发安装环境,请阅读DEVELOPMENT.md

版本控制

我们使用SemVer进行版本控制。有关可用版本,请参阅此存储库上的版本。

执照

这个项目是根据 MIT 许可证获得许可的——有关详细信息,请参阅LICENSE文件。

致谢

  • 首先感谢 Zalando 在 Zalando 的开源孵化器中启动这个项目。
  • 感谢@side8和他们的k8s-operator 的启发。

发布历史 发布通知| RSS订阅