存放航海圖的博物館 ー ChartMuseum === ###### tags: `k8s` `CI/CD` `helm` `chartmuseum` [TOC] ## 簡介 (ChartMuseum)[https://github.com/helm/chartmuseum] 是一套儲存 Helm Chart 的伺服器,它解決了以往存放 Helm Chart 的不便。並提供與 Helm 整合的功能,可以透過 Helm 連接 ChartMuseum 做到上傳、部署 Chart 。 ChartMuseum 主要提供兩個功能 1. 可以支援多個主流雲端儲存空間 (Cloud Storage) 2. 提供上傳 Chart 的 API :::danger 警告: 目前 ChartMuseum 還只是 1 年多的新專案,還在快速發展中,因此可能存在各種不可預知的 bug,請小心使用 ::: ## 沒有 ChartMuseum 之前,怎麼保存、使用 Chart ? 在沒有 ChartMuseum 之前,如果我們要將 Chart 保存到一個公用的地方,讓每個伺服器都能存取的話,通常會將 Helm Chart 上傳到一個外部儲存空間中,這個外部儲存空間可能是 Cloud Storage (AWS S3 Bucket、Google Storage...等),或是公司內部的 NFS 等。 當 Chart 傳送到外部儲存空間後,Helm Client 通常有以下兩種方式可以取得 Chart 並且部署 1. 將 Chart 下載到 Local,再使用 Helm 指令進行部署 例如透過以下指令進行部署: ```bash wget https://chart.example.company.com/my-chart-1.1.0 helm upgrade alpha-release ./my-chart-1.1.0 --install ``` 透過下載 chart 的方式部署,最明顯的缺點就是操作時需要知道 chart 的明確路徑或是明確的版本編號,才能透過網址下載 Chart。 3. 維護一份 index.yaml,並使用 Helm Repo 功能進行部署 透過維護 index.yaml,就可以透過 helm 內建的機制取得 chart,部署指令如下: ```bash helm repo add my-repo https://chart.example.company.com/ # 設定新的 repo 名稱與 url helm repo update # 預設會下載 https://chart.example.company.com/index.yaml, index.yaml 中會紀錄有哪些 chart 可供使用 helm upgrade alpha-release my-repo/my-chart --install # 透過 repo/chart 的格式部署 helm chart,會自動下載紀錄在該 repo 中最新版本的 chart 進行部署 ``` 因為有 index.yaml 的關係,我們也可以透過 helm search 指令找尋 repo 中的 chart,例如以下指令 ```bash helm search my-repo/ ``` 而 helm repo 所需要的 index.yaml 文件,是可以透過 helm repo index 指令進行產生,產生的範例如下: ```yaml apiVersion: v1 entries: hackmd: - apiVersion: v1 appVersion: 1.0.1 created: 2018-12-20T15:13:55.193877+08:00 description: Realtime collaborative markdown notes on all platforms. digest: 6a74baf303c6ed1c0e02cae3d319fb6ef81fa5c7597b9509e7382c659804b424 engine: gotpl home: https://hackmd.io icon: https://hackmd.io/favicon.png name: hackmd sources: - https://github.com/hackmdio/hackmd - https://github.com/hackmdio/docker-hackmd urls: - hackmd-0.1.1.tgz version: 0.1.1 wordpress: - appVersion: 5.0.1 created: 2018-12-20T15:13:55.195293+08:00 description: Web publishing platform for building blogs and websites. digest: 5a29fa05919ce93f81349027bb1ae8c783be4c39c5a018a39a99c76d1152549a engine: gotpl home: http://www.wordpress.com/ icon: https://bitnami.com/assets/stacks/wordpress/img/wordpress-stack-220x234.png maintainers: - email: containers@bitnami.com name: Bitnami name: wordpress sources: - https://github.com/bitnami/bitnami-docker-wordpress urls: - wordpress-5.0.1.tgz version: 5.0.1 generated: 2018-12-20T15:13:55.191339+08:00 ``` index.yaml 檔案中,會在 entries 中包含了所有 chart 的資訊。 雖然維護一套 index.yaml 即可透過 helm 指令達到很多便利的好處,但當多人同時上傳修改過的 index.yaml 都 Cloud Storage / NFS 時,就有機會導致 index.yaml 的內容會被覆蓋。 ## Chart Museum 解決了什麼問題? 1. 支援多個雲端儲存空間 2. 提供 API 讓使用者可以上傳 Chart 到雲端,不需要透過雲端提供商的指令 3. 使用者只需要將 Chart 上傳到儲存空間中,ChartMuseum 會自動維護 index.yaml 檔案 Chart Museum 解決了以往要手動維護 index.yaml 的問題,會自動從 storage 中自動產生對應的 index.yaml 檔案, 因此使用者只需將 chart 檔案上傳到 cloud storage 中即可,不需要再上傳一份更改過的 index.yaml。 但手動將檔案上傳至 cloud storage 還是會有些問題,例如更改 Chart 後,如果忘記增加 Chart Version 版本編號, 就使用 helm package 指令打包 chart 後就上傳,可能就會直接覆蓋舊的 chart,導致版本追蹤上可能會有問題。 因為 Chart Museum 提供了一組 API 供上傳使用,可以透過設定防止使用者覆蓋已經存在的 Chart,這個機制就可以保護 Chart 不被重複上傳而覆蓋。 最後 Chart Museum 提供了 Helm 的 Plugin,讓使用者可以透過 helm push 指令,直接完成 Chart 的打包與上傳。 ## 安裝 Chart Museum Chart Museum 是使用 Go 語言撰寫的程式,官方提供了多種安裝方式,可以直接下載編譯好的 binary,或是透過官方釋出的 Docker Image 與 Helm Chart 部署。 ### 1. 直接使用 binary Chart Museum 提供了 Windows / macOS / Linux 三個平台的 Binary 檔案可以直接下載使用,網址如下 - windows: https://s3.amazonaws.com/chartmuseum/release/latest/bin/windows/amd64/chartmuseum - macOS: https://s3.amazonaws.com/chartmuseum/release/latest/bin/darwin/amd64/chartmuseum - Linux: https://s3.amazonaws.com/chartmuseum/release/latest/bin/linux/amd64/chartmuseum 以下操作以 macOS 為例,其他系統操作方式應該是類似的 ```bash mkdir ~/chartMuseum # 建立 chart museum 的目錄 cd ~/chartMuseum wget https://s3.amazonaws.com/chartmuseum/release/latest/bin/darwin/amd64/chartmuseum chmod +x chartmuseum mkdir charts # 建立儲存 charts 的目錄 # 啟動 chartmuseum,並設定以下參數: # 1. 將 chart 儲存在本機的檔案系統中,路徑為 ~/chartMuseum/charts, # 2. 設定 Basic Auth ,username 為 user、password 為 password ./chartmuseum --storage local --storage-local-rootdir ./charts --port 8000 --basic-auth-user user --basic-auth-pass password ``` ### 2. 使用 docker image ```bash mkdir ~/chartMuseum cd ~/chartMuseum mkdir charts docker run -p 8000:8080 -e STORAGE=local -e STORAGE_LOCAL_ROOTDIR=/charts -e BASIC_AUTH_USER=user -e BASIC_AUTH_PASS=password -v $(pwd)/charts:/charts chartmuseum/chartmuseum:latest ``` ### 3. 透過 helm chart ```bash # 設定 basic auth 的帳號密碼與啟用 ingress cat << EOF > values.yaml env: secret: BASIC_AUTH_USER: user BASIC_AUTH_PASS: password ingress: enabled: true EOF # 部署 chart museum helm install chartmuseum stable/chartmuseum -f values.yaml # 等待 ingress 取得 ip kubectl get ingresses --watch ``` ## 設定 Helm Client ```bash # 新增剛剛部署的 chart museum helm repo add chartmuseum http://localhost:8000 helm repo update # 安裝 chart museum 提供給 helm 的 plugin helm plugin install https://github.com/chartmuseum/helm-push ``` ## 測試將 chart 上傳至 Chart Museum ```bash # 從 helm 官方的 repo 中將 stable/jenkins 的 chart 下載下來 helm fetch stable/jenkins --version 0.26.0 # 將下載下來的 jenkins chart 上傳至 chart museum 中 helm push jenkins-0.26.0.tgz chartmuseum # 列出 chart museum 中所有的 chart helm search chartmuseum/ ```