從Helm2遷移到Helm v3 的最佳實(shí)踐

JFrog凿傅,我們依靠KubernetesHelm來編排我們的系統(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è)施保持最新散怖。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市肄渗,隨后出現(xiàn)的幾起案子镇眷,更是在濱河造成了極大的恐慌,老刑警劉巖翎嫡,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件欠动,死亡現(xiàn)場離奇詭異,居然都是意外死亡惑申,警方通過查閱死者的電腦和手機(jī)具伍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來圈驼,“玉大人沿猜,你說我怎么就攤上這事⊥爰梗” “怎么了啼肩?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長衙伶。 經(jīng)常有香客問我祈坠,道長,這世上最難降的妖魔是什么矢劲? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任赦拘,我火速辦了婚禮,結(jié)果婚禮上芬沉,老公的妹妹穿的比我還像新娘躺同。我一直安慰自己阁猜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布剃袍。 她就那樣靜靜地躺著捎谨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涛救。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天检吆,我揣著相機(jī)與錄音,去河邊找鬼蹭沛。 笑死臂寝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的致板。 我是一名探鬼主播交煞,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼咏窿,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼斟或!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起集嵌,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤萝挤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后根欧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怜珍,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年凤粗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了酥泛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嫌拣,死狀恐怖柔袁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情异逐,我是刑警寧澤捶索,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站灰瞻,受9級(jí)特大地震影響腥例,放射性物質(zhì)發(fā)生泄漏辅甥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一燎竖、第九天 我趴在偏房一處隱蔽的房頂上張望璃弄。 院中可真熱鬧,春花似錦底瓣、人聲如沸谢揪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垦梆。三九已至,卻和暖如春托猩,著一層夾襖步出監(jiān)牢的瞬間京腥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國打工他宛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留厅各,地道東北人预柒。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓宜鸯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親投放。 傳聞我的和親對(duì)象是個(gè)殘疾皇子适贸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容