正式开放 | 阿里云 10 亿级镜像服务正式支持 Helm Charts,云原生交付再加速!
作者 | 阿里巴巴高級開發工程師 謝于寧(予棲)
- 2018 年 6 月,Helm 正式加入了 CNCF 孵化項目;
- 2018 年 8 月,據 CNCF 的調研表明,有百分之六十八的開發者選擇了 Helm 作為其應用包裝方案;
- 2019 年 6 月,阿里云正式開放了開放云原生應用中心,為國內用戶提供了海量的本地化 Helm Charts 應用;
- 2019 年 7 月,阿里云鏡像服務企業版正式開放了 Helm Charts 托管能力,允許企業版用戶完成私有 Helm Charts 的推送、拉取以及批量管理;
- 2019 年 8 月,云原生應用大賽開啟(9 月 2 日前均可報名),鼓勵和普及 Helm Charts 在國內的使用。
Helm Chart,究竟是什么呢?
伴隨著云原生技術的迅速崛起,Kubernetes 事實上已經成為應用容器化平臺的標準,成為了云原生領域的一等公民。它以一種聲明式的容器編排與管理體系,讓軟件交付變得越來越標準化。具體來說,Kubernetes 提供了統一模式的 API,能以 YAML 格式的文件定義 Kubernetes 集群內的資源。這些資源的種類繁多,例如無狀態應用的部署 Deployment,有狀態應用的部署 StatefulSet,配置項 ConfigMap 等等。
這一些 YAML 格式的資源定義使得 Kubernetes 能輕松被上下游系統所集成,完成一系列原本需要用非標準化腳本、人工來完成的操作。但是這些文件的缺點也很明顯,當我們想要創建一個資源時,往往要書寫這樣的一個 YAML 文件,這對于剛入門的開發者來說,存在著一些門檻。同時,當我們在大團隊中協作,迭代這些資源時,就總覺得直接修改這樣一個文件,會有沖突,無法回滾,難以溯源,邊界模糊等問題。
因此云原生社區也衍生出了一系列最佳實踐解決這些痛點,例如:
- 一些人將 YAML 文件都放到一個 Git 倉庫中,依賴于 Git 的版本管理能力來管理線上架構,借助 CI 平臺完成從 Git 倉庫到線上環境的自動部署,人們把這稱為 GitOps。GitOps 解決了 YAML 無法被版本化、變更無法溯源的問題;
- kubernetes-sigs/kustomize 引入了 YAML 的公共模塊機制,使得不同的 YAML 之間可以彼此引用依賴,使書寫更加方便,維護起來更加清晰;
- 本文的主角 Helm 也是其中一個項目,它提出了 Chart 這個概念。一個 Chart 打包了一個應用的所有Kubernetes 資源的 YAML 文件,對外提供文檔、配置項、版本等信息。而 Helm 本身則是一個命令行工具,我們可以使用 Helm 提交一個 Chart 到 Kubernetes 集群中,運行在集群中的控制器(v2 中為 tiller)會將 Chart 內的資源分別部署到 Kubernetes 集群中。
人們擅長于用已知來理解未知,我們就用下表來簡單地介紹 Kubernetes 的世界中 Helm 的角色。
從現狀來看,Helm 已經成為了應用分發界事實上的標準,但仍能聽到一些反聲音表示:在生產環境中使用,務必三思而后行:
- Helm 的書寫過程就是反人類的,Golang Template 的引入讓事情變得更加復雜;
- Helm 生命周期管理能力很弱,無法處理復雜的部署;
- v2 版本中 Tiller 的引入,讓 RBAC 變得毫無作用。
Helm Chart 現狀
根據 CNCF 在去年八月份的調研,有百分之六十八的人選擇了 Helm Chart。不僅僅是開源軟件的第三方交付,許多企業內部也借助 Helm 對于運行態 Release 的管理功能,滿足其實現軟件迭代過程中軟件版本化、可追溯、可回滾方面的訴求。
在這些企業內部,用戶使用 Chart 時面臨著 Chart 存儲方案的選擇難題。我們做了一些調研,其實能被選擇的方案并不多。一些用戶將 Chart 直接放到 Git 倉庫中進行版本化管理,一些客戶則借助于開源軟件來搭建一個類似于 Docker Hub 的 Chart 倉庫來完成 Chart 托管,而有另外一些開源軟件,則實現了一個 Helm 插件,可以將 Helm Chart 直接推送到類似于 OSS、S3 這樣的對象存儲中去。
然而對于企業級客戶而言,這幾種方案都面臨著一些缺點。Git 倉庫上手快,但其 Chart 內容版本和 Git 倉庫分支沒有關聯;以開源軟件搭建的 Chart 倉庫又是另外一個需要維護的應用,增加了基礎架構的依賴;Helm Chart 直接推送到 OSS 中,缺少企業級的權限管理,管理幾乎都在命令行中完成。
鏡像服務企業版 Helm Chart 托管功能開放
圖 1:基于鏡像服務企業版的軟件迭代一站式解決方案
2019 年 7 月,阿里云鏡像服務企業版正式開放了 Helm Chart 托管能力,提供了與容器鏡像幾乎一樣的使用體驗,理論上可以支持無限量的 Helm Chart 托管,提供 99.999999999% 的數據可靠性。類比于其他同類別的開源產品,我們做了深度改造,提供了如下的企業級特性:
安全合規
作為云服務提供,第一要務便是安全合規。在社區默認的例子里,Chartmuseum 使用了 Basic Auth 的認證,這種認證通常為固定的密碼,無法接入阿里云 RAM 鑒權體系。在改造中,我們將 Chartmuseum 改成了 OAuth 2.0 Bearer Token 的鑒權機制,借鑒了 Registry 與 Docker Engine 之間的鑒權鏈路。同時開發了 Helm 客戶端插件 AliyunContainerService/helm-acr 來自動完成鑒權,提升數據安全性和用戶體驗。
圖 2: OAuth2.0 鑒權鏈路,來自 chartmuseum/auth-server-example
RAM 鑒權管理體系
默認 Chartmuseum 的 UI 控制臺無法完成一些復雜的操作。我們希望控制臺可以允許:
- 多命名空間和 Chart 倉庫管理;
- 不同子賬號對不同命名空間的權限管理;
原生的 Chartmuseum 提供了 depth 的參數,用于控制租戶級別:當 depth 等于 0 時,它表現為一個平面的倉庫,可以堆放任意 Chart 版本。當 depth 等于 2 時,它增加了 org(組織),repo(倉庫)的概念如下:
為了讓 Chartmuseum 的層級與我們現有的容器鏡像保持統一,我們配置 depth 為 2,將組織映射到了我們的命名空間,將倉庫映射到了我們的倉庫,而這個倉庫則是一片平地,可以推任意版本的 Chart。
基于這部分關系映射后,我們通過回調改造將 Chartmuseum 的關系同步映射過來,如下表。結合阿里云的 RAM 鑒權策略,我們可以非常方便地對不同子賬號、不同命名空間、倉庫進行授權管理。
鏡像服務企業版 ├── 命名空間 A │ ├── Chart 倉庫 A │ │ └── nginx-ingress-0.9.3.tgz ├── 命名空間 B │ ├── Chart 倉庫 B │ │ └── chartmuseum-0.4.0.tgz自定義網絡 ACL
與企業版中提供的容器鏡像服務一致,我們對 Helm Chart 托管能力的可訪問入口也提供了自定義網絡 ACL 的能力,您可以指定不同的 VPC、互聯網 IP 地址訪問到不同的企業版實例。
動手實踐
容器鏡像服務企業版支持 v2 版本的 Chart 安全托管,在企業版實例概覽頁開啟 Charts 組件,待組件狀態變為運行中,即可開始托管 Chart 類型倉庫。
圖 3:容器鏡像服務企業版概覽界面
安裝并配置客戶端
從官方下載需要的 Helm Chart 版本。
# 解壓縮 tar -zxvf helm-v2.14.2-linux-amd64.tgz # 移動至指定位置 mv linux-amd64/helm /usr/local/bin/helm使用 Helm Chart 托管功能時,請確??蛻舳藶?v2 最新版本,可以通過 helm version -c 確認,建議使用 v2.14.2 版本。
# 安裝 Helm 插件,請注意預先安裝 git helm plugin install https://github.com/AliyunContainerService/helm-acr # 初始化 # 1. 如果您當前在容器服務集群節點上,默認已經有初始化完成的 tiller ,只需要初始化 client??梢允褂?skip-refresh 命令避免訪問 google Chart 源: helm init --client-only --skip-refresh # 2. 如果您當前在自建的 Kubernetes 集群節點上,并且希望避免訪問 google Chart 源,可以使用以下命令: helm init --skip-refresh配置本地倉庫映射
您需要指定一個本地倉庫名稱,映射到線上某一個命名空間下的某一個 Chart 倉庫。
export HELM_REPO_USERNAME='<企業版實例訪問憑證中賬號>'; export HELM_REPO_PASSWORD='<企業版實例訪問憑證中密碼>'; helm repo add <本地倉庫名稱> acr://<實例名稱>-chart..cr.aliyuncs.com/<命名空間>/<Chart 倉庫> --username ${HELM_REPO_USERNAME} --password ${HELM_REPO_PASSWORD}推送 Chart
在簡單配置企業版實例的訪問憑證并打開網絡訪問控制后,就可以在終端推送 Chart 到 Chart 倉庫中。
# 本地創建一個 Chart helm create <Chart 名稱> # 推送 Chart 目錄 helm push <Chart 名稱> <本地倉庫名稱> # 或者推送 Chart 壓縮包 helm push <Chart 名稱>-<Chart 版本>.tgz <本地倉庫名稱>您可以在企業版控制臺查看這些版本的大小信息并便捷管理版本,點擊幫助文檔,查看更多操作詳情。
圖 4:企業版 Chart 版本列表界面
未來
阿里云容器鏡像服務(ACR)是國內最大的公有云鏡像服務平臺之一,支撐數萬名開發者,十億級別的鏡像拉取,為開發者的每個應用鏡像保駕護航。容器鏡像服務企業版(ACR EE)是新推出面向企業級客戶的安全托管平臺,支持容器鏡像及 Helm Chart 多種云原生應用資產管理,提供企業版實例獨享部署、自定義網絡訪問控制及 P2P 大規模鏡像分發等功能。未來我們將持續改進、優化 Helm Chart 托管能力,提供自定義接入域名,服務端 BYOK 存儲加密等企業級功能。
總結
以上是生活随笔為你收集整理的正式开放 | 阿里云 10 亿级镜像服务正式支持 Helm Charts,云原生交付再加速!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分布式应用的未来 — Distribut
- 下一篇: Knative 基本功能深入剖析:Kna