kubernetes模板工具。
kuku的Python项目详细描述
库库
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服务,在模板中定义服务name
、internalPort
和externalPort
。
给定以下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