前两天,一篇「Think twice before using Helm[1]」(译文:「恕我直言,对Helm你们仍是要三思然后用」) 引发了你们的关注。做者从认证,生命周期管理,错误处理等多个角度说明了 Helm 自身的问题。我基本赞同做者的观点。多数状况下咱们只是把 helm 当作一个模板引擎在使用,把 charts 生成 Kubernetes 能够处理的格式。可是从使用角度来讲,这个模板实现的过重了。有兴趣的能够去读读原文。html
那若是 Helm 不轻量好用的话,咱们有啥其余选择?python
Ansible 作为部署管理的工具,正在受到愈来愈多的运维人员的追捧。他支持 Jinja2 的模板引擎,并且是无代理节点的架构,很方便来作一些模板工做。因此本文来介绍使用 Ansible 如何管理 Kubernetes 上面的资源。web
首先使用 Ansible 避免不了使用其模块。与 Kubernetes 相关的模块能够从[2]找到。如今主要有k8s, k8s_facts, k8s_scale, kubernetes和oc 5个模块。其中 kubernetes 和 oc 模块由于实现逻辑很差用,在 ansible 2.6 版本中已经废弃掉, 推荐使用前三个。其中,k8s_scale 来自 ansible 2.5, k8s 来自 ansible 2.6, k8s_facts 来自 ansible 2.7。使用这三个模块的话,还须要安装 openshift 的 Python 包。如下代码所有基于 ansible 2.7 版本。api
管理 kubernetes 各类资源的话,使用 k8s 模块就能够了,以下是建立 namespace 的写法架构
name: Create a k8s namespace
k8s:
name: testing
api_version: v1
kind: Namespace
state: present
若是要建立一个 Service, 也可使用以下面的写法。app
若是 k8s 模块和 ansible lookup 插件合用的话,能够写出更加简洁的代码,以下运维
#tasks.ymltcp
apiVersion: v1
kind: Service
metadata:
name: {{ name }} # <-- 这里可使用变量
namespace: testing
labels:
app: galaxy
service: web
spec:
selector:
app: galaxy
service: web
ports:ide
基于此,彻底可使用这种方式替换掉 helm 的模板功能,并且没有引入任何额外的依赖,就是直接的 ansible 生成相关文件,丢给 kubernetes api 来处理。等部署完成后,咱们也能够脱离 Ansible 继续经过 kubelet 命令维护这些资源。也正是因为这么简洁的实现,k8s 模块能够管理 Kubernetes 和 OpenShift, 也能够管理各类 CRD 资源。工具
相比于 helm , 这种方法的缺点在于 YAML 文件都要本身写,没有社区在维护的 Charts。不像 helm 那样,一个命令就能够把服务都安装上。前期的工做仍是挺多的。可是从另一个角度来讲,社区维护的 Charts 作一些 Demo 还能够,真要生产上面使用,仍是要作大量工做的。因此从这个角度上讲,使用 Ansible 也没有带来太大的工做量。
我更期待社区可使用 Ansible 直接管理 Charts 资源,或能够有一个工具把 Charts 的 Go 模板转成 Ansible 能够接受的 Jinja2 格式。
这两个模块算辅助的功能,我以为使用的机会可能并不会太多。k8s_scale 的例子以下:
name: Scale deployment up, and extend timeout
k8s_scale:
api_version: v1
kind: Deployment
name: elastic
namespace: myproject
replicas: 3
wait_timeout: 60
k8s_facts的例子以下:
由于 Ansible 是 Python 编写的,在使用 pip 安装时容易破坏系统已经安装的 Python 包,推荐使用虚拟环境来安装。
#mkvirtualenv --system-site-packages ansible
#pip install 'ansible<2.7' openshift
使用时,须要指定 Ansible 使用的 python interpreter 变量
#workon ansible
#ansible-playbook -i localhost, -c local test.yml -e ansible_python_interpreter=${VIRTUAL_ENV}/bin/python
如下是使用 ansible 在 OpenShift 上面部署 echoserver 的一个完整例子
参考文献:
[1]https://medium.com/virtuslab/think-twice-before-using-helm-25fbb18bc822;
[2]https://docs.ansible.com/ansible/latest/modules/list_of_clustering_modules.html;