kubernetes模板工具。

kuku的Python项目详细描述


库库

Build Status

kuku使用python模板呈现kubernetes yaml清单。它的用法类似于helm(模板目录、值文件等)。

安装:

pip3 install kuku

或者使用Docker图像:

docker pull xarg/kuku

# Example usage (see more below):
docker run -v $(pwd)/:/tmp/ --rm xarg/kuku render -f /tmp/your-values.yaml /tmp/your-templates/ | kubectl apply -

用法

假设您想使用模板创建k8s服务,在模板中定义服务nameinternalPortexternalPort

给定以下service.py模板:

fromkubernetesimportclientdeftemplate(context):returnclient.V1Service(api_version="v1",kind="Service",metadata=client.V1ObjectMeta(name=context["name"]),spec=client.V1ServiceSpec(type="NodePort",ports=[{"port":context["externalPort"],"targetPort":context["internalPort"]}],selector={"app":context["name"]},),)

现在可以使用kuku通过运行:

$ ls .
service.py 
$ kuku render -s name=kuku-web,internalPort=80,externalPort=80 .

以上产生:

# Source: service.pyapiVersion:v1kind:Servicemetadata:name:kuku-webspec:ports:-port:80targetPort:80selector:app:kuku-webtype:NodePort

您还可以将上述内容与kubectl apply -f -结合起来,在k8s上实际创建您的服务:

kuku render -s name=kuku-web,internalPort=80,externalPort=80 . | kubectl apply -f -

与上面一样,但让我们将其缩短:

kuku apply -s name=kuku-web,internalPort=80,externalPort=80 .

最后删除:

kuku delete -s name=kuku-web,internalPort=80,externalPort=80 .
# same as above
kuku render -s name=kuku-web,internalPort=80,externalPort=80 . | kubectl delete -f - 

模板

模板是定义名为template的函数的python文件,该函数接受dict参数context,并且 返回K8S对象或K8S对象列表:

deftemplate(context):returnV1Namespace(name=context['namespace'])# example k8s object 

您可以创建多个模板文件,每个文件定义自己的template函数。 kuku使用来自official kubernetes python client package的k8s对象(aka模型)。 你可以找到它们全部here

cli

类似于helmkuku接受从cli定义其上下文变量:

kuku -s namespace=kuku .

-s namespace=kuku将传递给template函数中的context参数。运行kuku -h了解更多信息。

目标

编写python代码以生成k8s清单。

python是一种非常流行的语言,它拥有一个由devops包组成的庞大生态系统。最重要的是它比 今天用来生成k8s清单的一些模板语言。

没有k8s服务器端依赖项(即耕耘机)。

k8s已经有了一个当前状态的数据库(使用etcd)。我们可以直接从客户端连接到 执行我们的操作,而不是依赖额外的服务器端依赖。

运行前清单的本地验证kubectl apply

尽可能使用official k8s python client在本地进行验证。

使用标准工具

在可能的情况下,使用kubectl将更改应用到k8s集群,而不是实现特定的协议。 同样,这将使最终用户更容易进行调试。

为什么不掌舵?

Gorgias我们使用helm来管理我们的基础设施,但是有一些 我们发现有问题的地方:

  • 糟糕的模板语言:需要不断地引用文档,出现空白问题,yaml格式化很困难。
  • 服务器端依赖关系:如果升级服务器->;每个用户都需要更新其客户端-浪费宝贵的时间。
  • 缺少本地验证:helm lint不能真正确保清单的有效性(即k8s对象所需的密钥)。

图表名称、版本和其他特定于helm的特性与我们当前的工作流程不太匹配。

贡献

欢迎投稿(代码、问题、文档等)!

完成python环境设置后:

pip install -e .[dev]# will install dev dependencies
pre-commit install # will install pre-commit hooks for code quality checking 

向pypi发布新版本:

python setup.py upload

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
javascript通过WebSocket将服务器时间推送到多个客户端   这种java字节转换是如何工作的   数据库错误。sql。SQLEception:参数索引超出范围(1>参数数,为0)   java如何在搜索时过滤选定的viewpager片段中的recyclerview?   java如何使用OpenCV将图像转换为黑白图像并在ANDROID中消除阴影   Spring MVC项目中的java HTTP服务器状态404错误   Spring MVC中的java JSR303自定义约束验证器   java如何基于另一个ArrayList的值显示ArrayList中的特定项?   java如何在firebase messages节点获取最后发送给我的消息?   部署后在google app engine上运行servlet时发生java错误   java如何使用servlet在两个jsp之间发送数据   java日历年中的周是月中的周   从URL读取一个资源并直接返回这些字节作为REST请求的响应,Java 7和spring MVC 3.2不存储内存