您好,登錄后才能下訂單哦!
前兩天,一篇「Think twice before using Helm[1]」(譯文:「恕我直言,對(duì)Helm大家還是要三思而后用」) 引起了大家的關(guān)注。作者從認(rèn)證,生命周期管理,錯(cuò)誤處理等多個(gè)角度說(shuō)明了 Helm 自身的問(wèn)題。我基本贊同作者的觀點(diǎn)。多數(shù)情況下我們只是把 helm 當(dāng)做一個(gè)模板引擎在使用,把 charts 生成 Kubernetes 可以處理的格式。但是從使用角度來(lái)說(shuō),這個(gè)模板實(shí)現(xiàn)的太重了。有興趣的可以去讀讀原文。
那如果 Helm 不輕量好用的話,我們有啥其他選擇?
Ansible 做為部署管理的工具,正在受到越來(lái)越多的運(yùn)維人員的追捧。他支持 Jinja2 的模板引擎,而且是無(wú)代理節(jié)點(diǎn)的架構(gòu),很方便來(lái)做一些模板工作。所以本文來(lái)介紹使用 Ansible 如何管理 Kubernetes 上面的資源。
首先使用 Ansible 避免不了使用其模塊。與 Kubernetes 相關(guān)的模塊可以從[2]找到?,F(xiàn)在主要有k8s, k8s_facts, k8s_scale, kubernetes和oc 5個(gè)模塊。其中 kubernetes 和 oc 模塊因?yàn)閷?shí)現(xiàn)邏輯不好用,在 ansible 2.6 版本中已經(jīng)廢棄掉, 推薦使用前三個(gè)。其中,k8s_scale 來(lái)自 ansible 2.5, k8s 來(lái)自 ansible 2.6, k8s_facts 來(lái)自 ansible 2.7。使用這三個(gè)模塊的話,還需要安裝 openshift 的 Python 包。以下代碼全部基于 ansible 2.7 版本。
管理 kubernetes 各種資源的話,使用 k8s 模塊就可以了,如下是創(chuàng)建 namespace 的寫(xiě)法
name: Create a k8s namespace
k8s:
name: testing
api_version: v1
kind: Namespace
state: present
如果要?jiǎng)?chuàng)建一個(gè) Service, 也可以使用如下面的寫(xiě)法。
如果 k8s 模塊和 ansible lookup 插件合用的話,可以寫(xiě)出更加簡(jiǎn)潔的代碼,如下
#tasks.yml
apiVersion: v1
kind: Service
metadata:
name: {{ name }} # <-- 這里可以使用變量
namespace: testing
labels:
app: galaxy
service: web
spec:
selector:
app: galaxy
service: web
ports:
基于此,完全可以使用這種方式替換掉 helm 的模板功能,而且沒(méi)有引入任何額外的依賴,就是直接的 ansible 生成相關(guān)文件,丟給 kubernetes api 來(lái)處理。等部署完成后,我們也可以脫離 Ansible 繼續(xù)通過(guò) kubelet 命令維護(hù)這些資源。也正是由于這么簡(jiǎn)潔的實(shí)現(xiàn),k8s 模塊可以管理 Kubernetes 和 OpenShift, 也可以管理各種 CRD 資源。
相比于 helm , 這種方法的缺點(diǎn)在于 YAML 文件都要自己寫(xiě),沒(méi)有社區(qū)在維護(hù)的 Charts。不像 helm 那樣,一個(gè)命令就可以把服務(wù)都安裝上。前期的工作還是挺多的。但是從另外一個(gè)角度來(lái)說(shuō),社區(qū)維護(hù)的 Charts 做一些 Demo 還可以,真要生產(chǎn)上面使用,還是要做大量工作的。所以從這個(gè)角度上講,使用 Ansible 也沒(méi)有帶來(lái)太大的工作量。
我更期待社區(qū)可以使用 Ansible 直接管理 Charts 資源,或可以有一個(gè)工具把 Charts 的 Go 模板轉(zhuǎn)成 Ansible 可以接受的 Jinja2 格式。
這兩個(gè)模塊算輔助的功能,我覺(jué)得使用的機(jī)會(huì)可能并不會(huì)太多。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的例子如下:
因?yàn)?Ansible 是 Python 編寫(xiě)的,在使用 pip 安裝時(shí)容易破壞系統(tǒng)已經(jīng)安裝的 Python 包,推薦使用虛擬環(huán)境來(lái)安裝。
#mkvirtualenv --system-site-packages ansible
#pip install 'ansible<2.7' openshift
使用時(shí),需要指定 Ansible 使用的 python interpreter 變量
#workon ansible
#ansible-playbook -i localhost, -c local test.yml -e ansible_python_interpreter=${VIRTUAL_ENV}/bin/python
以下是使用 ansible 在 OpenShift 上面部署 echoserver 的一個(gè)完整例子
參考文獻(xiàn):
[1]https://medium.com/virtuslab/think-twice-before-using-helm-25fbb18bc822;
[2]https://docs.ansible.com/ansible/latest/modules/list_of_clustering_modules.html;
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。