基于Rancher應(yīng)用商店實現(xiàn)K8s服務(wù)一鍵升級的方案介紹
作者 | 郭楊勇,單位:智慧家庭運營中心成都業(yè)務(wù)支持中心
Labs 導(dǎo)讀
隨著云計算逐步向云原生靠攏,越來越多的傳統(tǒng)企業(yè)應(yīng)用進(jìn)行了容器化的改造,且紛紛移植到了K8s集群中。通過云原生的 DevOps 應(yīng)用開發(fā)模式,可以做到應(yīng)用的敏捷開發(fā),提升業(yè)務(wù)應(yīng)用的迭代速度,高效響應(yīng)用戶需求。不同于傳統(tǒng)的云計算平臺,云原生的應(yīng)用無法直接通過ssh等方式直接對云主機(jī)進(jìn)行命名行操作,與傳統(tǒng)的jenkins、gitlab-ci等持續(xù)交付中間件的對接都需要進(jìn)行一定的改造。
Part 01 概述
K8s是業(yè)界對Kubernetes的一般簡稱,是云原生基金會(CNCF)的核心拳頭產(chǎn)品,包含了用于管理和編排云原生容器的一套開源軟件系統(tǒng),它提供了云原生容器化部署、規(guī)劃、更新、監(jiān)控和維護(hù)的全套功能,基于K8s搭建的云原生平臺,能很好的做到基于項目、命名空間的賬號權(quán)限和資源配置的隔離。根據(jù)CNCF的最新統(tǒng)計,目前全球的后端開發(fā)者已有31%,超過560萬人在使用K8s,K8s已成為云原生改造的首選解決方案。
Rancher是一個開源的企業(yè)級多集群K8s管理平臺,實現(xiàn)了K8s集群在混合云+本地數(shù)據(jù)中心的集中部署與管理,為采用容器的團(tuán)隊提供了完整的軟件堆棧,解決了跨任何基礎(chǔ)設(shè)施架構(gòu)管理多個K8s集群的運維和安全挑戰(zhàn)。Rancher除了提供統(tǒng)一的K8s集群管理頁面外,還提供了非常完善的API,方便用戶與持續(xù)交付平臺進(jìn)行對接。Rancher管理頁面同K8s開源社區(qū)的另一個重要工具-Helm相結(jié)合就可以實現(xiàn)K8s應(yīng)用的一鍵自動升級,Helm 是管理 Kubernetes 的應(yīng)用管理工具(https://v2.helm.sh),相當(dāng)于centos的yum,python中pip,node中的npm。
Part 02 實現(xiàn)方法
以下將以Rancher2.6.3為例,逐步介紹如何通過Rancher的API來實現(xiàn)K8s應(yīng)用的一鍵升級。首先,在進(jìn)行API對接前,要做好基于應(yīng)用商店的初始化操作。初始化操作包括:
1、將編排好的Helm配置文件包推送到統(tǒng)一的Helm應(yīng)用商店中,并且通過“應(yīng)用商店=》添加應(yīng)用商店”將Helm應(yīng)用商店配置添加到Rancher的商店設(shè)置中。
2、在添加了應(yīng)用商店配置后,就可以通過“應(yīng)用商店=》啟動”,查看或刷新應(yīng)用列表,并且選擇需要啟動的應(yīng)用,在指定命名空間后進(jìn)行安裝。
其次,需要通過Rancher管理頁面查看和確認(rèn)應(yīng)用列表更新、應(yīng)用升級、應(yīng)用回滾相關(guān)的API接口URL,同時創(chuàng)建API接口調(diào)用所需要的認(rèn)證token。詳細(xì)操作包括:
1、通過Rancher的功能菜單=》API&Keys,創(chuàng)建API Key并指定API key的作用范圍。
2、通過Rancher管理頁面的“應(yīng)用商店=》管理=》API查看=》refresh”,查看并確認(rèn)應(yīng)用商店列表刷新的API。
商店列表刷新的API相對簡單,具體格式如下:
curl -H"Authorization:Bearer {API_KEY}" \
-X POST \
-k --connect-timeout 20 -m 30 --retry-delay 2 --retry 3 \
{Rancher_Domain}/v3/projectCatalogs/{Project_ID}:{APP_Store}?action=refresh
可變字段中API_KEY就是第一步中創(chuàng)建的API key,Rancher_Domain是Rancher頁面的域名,Project_ID為應(yīng)用商店所作用項目的ID,APP_Store為需要刷新的應(yīng)用商店的名稱。
3、通過“應(yīng)用商店=》應(yīng)用列表=》API查看=》upgrade/rollback”,查看并確認(rèn)應(yīng)用相關(guān)的API接口信息。
應(yīng)用更新的API就要復(fù)雜一點,不過也只需要修改幾個重要的可變字段即可,具體格式如下:
curl -H "Authorization:Bearer {API_KEY}" \
-d "{"externalId":"catalog://?catalog='{APP_Store}'&template='{APP_Name}'&version='{APP_Version}'", "forceUpgrade":true, "valuesYaml":""}'"\
-X POST -k --connect-timeout 20 -m 30 --retry-delay 2 --retry 3 \
{Rancher_Domain}/v3/project/local:{Project_ID}/apps/{Project_ID}
可變字段中API_KEY為第一步中創(chuàng)建的API key,Rancher_Domain是Rancher頁面的域名,Project_ID為應(yīng)用商店所作用項目的ID,APP_Store為需要刷新的應(yīng)用商店的名稱,APP_Name為需要升級的應(yīng)用名稱,APP_Version為升級的目標(biāo)版本號。
最后,就可以根據(jù)應(yīng)用相關(guān)的API URL和API Key,編寫應(yīng)用列表刷新、應(yīng)用升級/回滾的腳本。腳本包括了:
- 應(yīng)用列表刷新腳本
curl -H"Authorization:Bearer token-pggq6:zlr95srxvb88vqdtctrt8h2d5k79k94h964x2vxvmhf7zk754ltskz" \
-X POST \
-k --connect-timeout 20 -m 30 --retry-delay 2 --retry 3 \
https://rancher.5gvr.komect.com/v3/projectCatalogs/p-6rt82:vr-chartmuseum?action=refresh
- 應(yīng)用升級腳本
curl -H "Authorization:Bearer token-pggq6:zlr95srxvb88vqdtctrt8h2d5k79k94h964x2vxvmhf7zk754ltskz" \
-d "{"externalId":"catalog://?catalog='vr-chartmusem'&template='cmvr-ingress'&version='1.0.0.beta'", "forceUpgrade":true, "valuesYaml":""}'"\
-X POST -k --connect-timeout 20 -m 30 --retry-delay 2 --retry 3 \
https://rancher.5gvr.komect.com/v3/project/local:p-6rt82/apps/p-6rt82
到這里,就完成了Rancher自動刷新應(yīng)用列表和應(yīng)用升級所需API調(diào)用的腳本編寫,只需要將相關(guān)腳本集成到Jenkins或Gitlab-ci等持續(xù)發(fā)布中間件的job中,就可以實現(xiàn)K8s應(yīng)用的自動灰度升級,相對于傳統(tǒng)的ssh腳本操作,要更加安全高效。
當(dāng)然除了以上兩個有關(guān)應(yīng)用列表刷新和應(yīng)用升級的API之外,有需要的時候也可以通過Rancher管理頁面學(xué)習(xí)專門針對Deployment、Statefulset或者具體Pod的API接口,擴(kuò)展更豐富的自動化運維功能。
參考文獻(xiàn)
[1]Demystifying Kubernetes in less than 100 slides https://collabnix.com/demystifying-kubernetes-in-less-than-100-slides/
[2]CNCF Landscape Guide https://landscape.cncf.io/guide#orchestration-management--scheduling-orchestration
[3]Rancher中文文檔 https://docs.rancher.cn/?