Kubernetes Operator Pythonic 框架 (Kopf)
项目描述
Kubernetes Operator Pythonic 框架 (Kopf)
Kopf ——Kubernetes Operator Pythonic 框架——是一个框架和库,可以让 Kubernetes Operator 的开发更容易,只需几行 Python 代码。
主要目标是将域驱动设计带入基础设施级别,Kubernetes 是域对象(自定义资源)的编排器/数据库,并且操作员包含域逻辑(没有基础设施逻辑或具有最少的基础设施逻辑)。
该项目最初zalando-incubator/kopf
于 2019 年 3 月启动,然后nolar/kopf
于 2020 年 8 月分叉:但它是相同的代码库、相同的包、相同的开发人员。
文档
特征
- 简单但功能强大:
- 仅包含 2 个文件的全功能运算符:一个
Dockerfile
+ 一个 Python 文件 (*)。 - 使用声明性方法处理通过装饰器注册的函数。
- 没有与 K8s API 通信的基础设施样板代码。
- 同步和异步处理程序,同步处理程序在后台线程化。
- 带有示例的详细文档。
- 仅包含 2 个文件的全功能运算符:一个
- 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+: 官方支持并测试了CPython和PyPy ;其他 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 的启发。