在JFrog凿傅,我們依靠Kubernetes和Helm來編排我們的系統(tǒng)并保持我們的工作負(fù)載運(yùn)行并保持最新狀態(tài)。我們的JFrog Cloud 服務(wù)最初使用 Helm v2 和 Tillerless插件部署以增強(qiáng)安全性,但現(xiàn)在我們已成功將數(shù)千個(gè)版本遷移到Helm v3丁眼。
與許多SaaS 服務(wù)提供商一樣,JFrog Cloud 在不同地區(qū)的許多 Kubernetes 集群中運(yùn)行昭殉,包括 AWS苞七、Azure 和 Google 云提供商。
我們?cè)诖诉^程中學(xué)到了一些重要的經(jīng)驗(yàn)教訓(xùn)挪丢,很高興與大家分享蹂风。
為什么遷移到Helm v3
Helm v3 的第一個(gè)版本于 2019 年 11 月發(fā)布, Helm v2 在一年內(nèi)仍然有更新版本乾蓬。 但是隨著 Helm 2.17.0 的最終版本于 2020 年 11 月發(fā)布惠啄,Helm v3 現(xiàn)在已經(jīng)是 Helm 開發(fā)者社區(qū)支持的唯一標(biāo)準(zhǔn)。
Helm v3 提供了一些重大改進(jìn)任内,最顯著的是刪除了Tiller撵渡。 這個(gè)集群內(nèi)的服務(wù)器與 Helm v2 客戶端交互的需要管理員權(quán)限才能執(zhí)行其職責(zé),這被認(rèn)為是共享 K8S 集群中的安全風(fēng)險(xiǎn)死嗦。 這可以通過 Tillerless 插件來克服趋距,但 Helm v3 不再需要這樣做。
此外越除,Helm v3 提供了一些新功能和更高的穩(wěn)定性节腐。 它現(xiàn)在也是唯一一個(gè)會(huì)在未來獲得有效性和安全性更新的版本外盯。
遷移策略
為了更輕松地將集群從Helm v2 遷移到 v3,Helm 開發(fā)人員社區(qū)創(chuàng)建了 helm-2to3 插件以與helm3 客戶端一起使用翼雀。 這里有一篇Helm 博客文章提供了有關(guān)如何使用它的一些很好的信息饱苟。
安裝插件很簡單:
$ helm3 plugin install https://github.com/helm/helm-2to3
但是您接下來如何執(zhí)行任務(wù)可能會(huì)根據(jù)您需要遷移的版本數(shù)量而有所不同。
手動(dòng)遷移
如果您只需要遷移幾個(gè)版本狼渊,您可以通過客戶端在命令行上進(jìn)行一一遷移箱熬。
首先,您可以使用helm list 命令列出當(dāng)前命名空間的所有已部署或失敗的版本:
$ helm2 list
NAME ??? REVISION UPDATED ???????????????? STATUS ? CHART ?????????? APP VERSION NAMESPACE
postgres 1 ?????? Thu Nov 14 15:01:00 2019 DEPLOYED postgresql-7.1.0 11.5.0 ???? postgres
然后狈邑,您可以通過遷移插件執(zhí)行每個(gè)命名版本的轉(zhuǎn)換城须。我們建議首先使用--dry-run 標(biāo)志來做一下預(yù)演,以確保之后的轉(zhuǎn)換運(yùn)行沒問題官地。
$ helm3 2to3 convert --dry-run postgres
$ helm3 2to3 convert postgres
您可以對(duì)所有版本重復(fù)此過程,您就完成了烙懦!
企業(yè)級(jí)的自動(dòng)化遷移
要將多個(gè)Helm v2 版本遷移到 v3驱入,您需要使用 shell 腳本自動(dòng)化該過程。
您的腳本將需要轉(zhuǎn)換的所有版本的列表氯析。您可以使用Helm v2 客戶端生成一個(gè)列表亏较,在本例中生成一個(gè)名為 release.log 的文件。
$ helm2 tiller run -- helm2 ls --max=0 | sed -n '1!p' | awk 'FNR > 1 { print $1 }' > releases.log
對(duì)于相對(duì)較少的版本(最多約200 個(gè))掩缓,這會(huì)產(chǎn)生快速的結(jié)果雪情。
然而,更多的情況下你辣,Helm 客戶端需要很長時(shí)間才能獲取所有版本巡通。
此外,我遇到了AWS EKS 集群的 Kubernetes API 限制舍哄。
JFrog Cloud 服務(wù)在每個(gè) Kubernetes 集群上運(yùn)行數(shù)千個(gè) Helm 版本宴凉,因此需要一種替代的、更快的方法表悬。
由于所有Tiller secrets都被標(biāo)記了弥锄,我們發(fā)現(xiàn)我們可以使用kubectl 命令將它們提取到releases.log 文件中:
$ kubectl -n kube-system get secret -l OWNER=TILLER,STATUS=DEPLOYED | awk 'FNR > 1 { print $1 }' | cut -f1 -d"." > releases.log
使用我們?cè)趓eleases.log 中的Helm v2 版本列表,我們可以使用bash 腳本自動(dòng)執(zhí)行遷移步驟:
#!/bin/bash
# Get releases list
RELEASES=$(cat releases.log )
for r in $RELEASES
do
??echo
??echo "Processing release $r"
??helm3 2to3 convert --tiller-out-cluster --release-versions-max=5 \
??????--delete-v2-releases --dry-run 2>&1 | tee -a convert.log
done
在此腳本中蟆沫,您可能想要或需要更改這些標(biāo)志:
--tiller-out-cluster 如果你沒有在 Kubenetes 集群中運(yùn)行 Tiller籽暇,則使用; 如果安裝了 Tiller饭庞,則應(yīng)將其刪除戒悠。
--delete-v2-releases 在遷移到 Helm v3 后刪除Helm v2 版本
--dry-run 用于測(cè)試遷移腳本是否工作,不真正執(zhí)行舟山,執(zhí)行實(shí)際遷移時(shí)需要?jiǎng)h除此參數(shù)
如果您選擇省略標(biāo)志--delete-v2-releases 并保留 Helm 2 版本救崔,您可以稍后使用以下命令清理它們:
$ helm3 2to3 cleanup --tiller-out-cluster --releases-cleanup --skip-confirmation
該腳本在文件convert.log 中查看遷移結(jié)果惶看,您應(yīng)該查看該文件以了解可能遇到的任何遷移問題。
在我們遷移JFrog Cloud 服務(wù)時(shí)六孵,并非所有版本都在同一?chart 版本上——它們使用了首次部署時(shí)有效的 charts纬黎。 所以一些遷移的舊版本無法使用 Helm v3 升級(jí)。
問題是一些Helm v3 標(biāo)簽和注釋沒有被添加到遷移的 Kubernetes 對(duì)象中劫窒。 當(dāng)檢查顯示它們不存在時(shí)本今,通過將它們添加到 Helm 升級(jí)步驟很容易解決這個(gè)問題:
$ kubectl -n ${NAMESPACE} label deployment -l "app.kubernetes.io/instance=${RELEASE}" "app.kubernetes.io/managed-by=Helm"
$ kubectl -n ${NAMESPACE} annotate deployment -l "app.kubernetes.io/instance=${RELEASE}" "meta.helm.sh/release-name=${RELEASE}" "meta.helm.sh/release-namespace=${NAMESPACE}"
讓我們開心遷移吧???
這就是將您的版本遷移到Helm v3 所需的全部內(nèi)容!
這個(gè)過程很簡單主巍,但請(qǐng)記住冠息,它不一定很快。
當(dāng)有數(shù)千個(gè)版本時(shí)——就像在大多數(shù)企業(yè)級(jí)組織中一樣——遷移過程確實(shí)需要時(shí)間來完成孕索。
使用這些步驟逛艰,您可以創(chuàng)建一個(gè)自動(dòng)化工具,幫助您將在Kubernetes 中運(yùn)行的大量版本從 Helm v2 遷移到 Helm v3搞旭,并使您的 Kubernetes 基礎(chǔ)設(shè)施保持最新散怖。