Kubernetes筆記(10) - Helm
應用微服務化后雖然便于部署和擴展,實作了敏捷開發和運維,但另一方面,在將單體應用微服務化后,往往又導致了應用管理復雜度的增加,例如,在Kubernetes系統之上,每個應用基本上都有著不止一個資源,而每個應用又有不同的環境(如qa、test和prod等),這會使得配置清單數量變得非常多而且維護起來非常復雜,而借助Helm可以簡化資源的管理,
Helm基礎
簡單來說,Helm就是Kubernetes的應用程式包管理器,類似于Linux系統之上的yum或apt-get等,可用于實作幫助用戶查找、分享及使用Kubernetes應用程式,
Helm將Kubernetes應用的相關配置組織為Charts,并通過它完成應用的常規管理操作,通常來說,使用Charts管理應用的流程包括從0開始創建Charts、將Charts及其相關的檔案打包為歸檔格式、將Charts存盤于倉庫(repository)中并與之互動、在Kubernetes集群中安裝或卸載Charts以及管理經Helm安裝的應用的版本發行周期,
Helm的核心術語
- Charts:即一個Helm程式包,它包含了運行一個Kubernetes應用所需要的鏡像、依賴關系和資源定義等,必要時還會包含Service的定義;它類似于APT的dpkg檔案或者yum的rpm檔案;
- Repository:Charts倉庫,用于集中存盤和分發Charts;
- Config:應用程式實體化安裝運行時使用的配置資訊;
- Release:應用程式實體化配置后運行于Kubernetes集群中的一個Charts實體;在同一個集群上,一個Charts可以使用不同的Config重復安裝多次,每次安裝都會創建一個新的Release,
Helm架構
Helm主要由Helm客戶端、Tiller服務器和Charts倉庫組成:
- Helm客戶端是命令列客戶端工具,采用Go語言撰寫,基于gRPC協議與Tiller server互動,它主要完成如下任務:
- 本地Charts開發
- 管理Charts倉庫
- 與Tiller服務器互動:發送Charts以安裝、查詢Release的相關資訊以及升級或卸載已有的Release
- Tiller server是托管運行于Kubernetes集群之中的容器化服務應用,它接收來自Helm客戶端的請求,并在必要時與Kubernetes API Server進行互動,它主要完成以下任務:
- 監聽來自于Helm客戶端的請求
- 合并Charts和配置以構建一個Release
- 向Kubernetes集群安裝Charts并對相應的Release進行跟蹤
- 升級和卸載Charts
- Charts倉庫,既可以運行為公共托管平臺,也可以是用戶自建的服務器,通常用戶于Helm客戶端本地遵循其格式撰寫Charts檔案,而后即可部署于Kubernetes集群之上運行為一個特定的Release,僅在有分發需求時,才需要將Charts檔案打包成歸檔壓縮格式提交到特定的Charts倉庫,
安裝Helm
Helm的原始碼位于https://github.com/helm/helm,根據檔案,mac可直接使用brew安裝:
~ brew install helm
~ helm version
需要注意的是,Helm的運行依賴于本地安裝并配置完成的kubectl方能與運行于Kubernetes集群之上的Tiller服務器進行通信,因此,運行Helm的節點也應該是可以正常使用kubectl命令的主機,
對于version 3+的版本來說,helm的安裝已經完成了,如果是較低的版本,還需要進一步安裝
tiller server,
安裝Helm chart
首先設定chart倉庫指向ArtifactHUB:
helm repo add bitnami https://charts.bitnami.com/bitnami
對應的網址為https://artifacthub.io/
Redis Chart使用示例
搜索redis
helm repo update
helm search repo redis
安裝,不指定實體名稱時必須使用--generate-name
helm install bitnami/redis --generate-name
或
helm install redis-test bitnami/redis
安裝完成后會有類似這樣的提示:
NAME: redis-1625445720
LAST DEPLOYED: Mon Jul 5 08:42:05 2021
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
此外還有詳細的使用提示:
Redis(TM) can be accessed on the following DNS names from within your cluster:
redis-1625531591-master.default.svc.cluster.local for read/write operations (port 6379)
redis-1625531591-replicas.default.svc.cluster.local for read-only operations (port 6379)
To get your password run:
export REDIS_PASSWORD=$(kubectl get secret --namespace default redis-1625531591 -o jsonpath="{.data.redis-password}" | base64 --decode)
To connect to your Redis(TM) server:
1. Run a Redis(TM) pod that you can use as a client:
kubectl run --namespace default redis-client --restart='Never' --env REDIS_PASSWORD=$REDIS_PASSWORD --image docker.io/bitnami/redis:6.2.4-debian-10-r13 --command -- sleep infinity
Use the following command to attach to the pod:
kubectl exec --tty -i redis-client \
--namespace default -- bash
2. Connect using the Redis(TM) CLI:
redis-cli -h redis-1625531591-master -a $REDIS_PASSWORD
redis-cli -h redis-1625531591-replicas -a $REDIS_PASSWORD
To connect to your database from outside the cluster execute the following commands:
kubectl port-forward --namespace default svc/redis-1625531591-master 6379:6379 &
redis-cli -h 127.0.0.1 -p 6379 -a $REDIS_PASSWORD
洗掉部署的chart:
heml delete <release name>
Helm Charts
Charts是Helm使用的Kubernetes程式包打包格式,一個Charts就是一個描述一組Kubernetes資源的檔案的集合,
Charts檔案組織結構
一個Charts就是按特定格式組織的目錄結構,目錄名即為Charts名
使用helm pull bitnami/redis --untar下載redis chart并解壓到當前目錄,內容如下
~ ls
Chart.lock charts templates
Chart.yaml ci values.schema.json
README.md img values.yaml
它們各自的作用為:
- Chart.yaml:當前Charts的描述資訊
- LICENSE:當前Charts的許可證資訊,純文本檔案,可選
- README.md:可選
- values.yaml:當前Charts用到的默認配置值
- charts/:目錄,存放當前Charts依賴到的所有Charts檔案
- templates/:目錄,存放當前Charts用到的模板檔案,可應用于Charts生成有效的Kubernetes清單檔案
- templates/NOTES.txt:純文本檔案,Templates簡單使用注解,
Chart.yaml檔案組織格式
Chart.yaml用于提供Charts相關的各種元資料,如名稱、版本、關鍵詞、維護者資訊、使用的模板引擎等,它是一個Charts必備的核心檔案,主要包含以下欄位:
name:當前Charts的名稱,必選欄位,?
version:遵循語意化版本規范第2版的版本號,必選欄位,?
description:當前專案的單陳述句描述資訊,可選欄位,?
keywords:當前專案的關鍵詞串列,可選欄位,?
home:當前專案的主頁URL,可選欄位,
sources:當前專案用到的原始碼的來源URL串列,可選欄位,?
maintainers:項目維護者資訊,主要嵌套name、email和URL幾個屬性組成;可選欄位,?
engine:模板引擎的名稱,默認為gotpl,即go模板,?
icon:URL,指向當前專案的圖示,SVG或PNG格式的圖片;可選欄位,?
appVersion:本專案用到的應用程式的版本號,可選欄位,且不必為語意化版本,?
deprecated:當前Charts是否已廢棄,可選欄位,布爾型值,?
tillerVersion:當前Charts依賴的Tiller版本號,可以是語意化版本號的范圍,如“>2.4.0”;可選欄位,
Template
Helm Charts模板(template)遵循Go模板語言格式,位于templates檔案夾,在當前Charts被Helm參考時,此目錄中的所有模板檔案都會傳遞給模板引擎進行處理,
模板檔案中用到的值(value)有如下兩種提供方式,
- 通過Charts的values.yaml檔案提供,通常用于提供默認值,
- 在運行“helm install”命令時傳遞包含所需要的自定義值的YAML檔案, 會覆寫默認值,
學習資料
《Kubernetes實戰進階》 馬永亮著
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/296398.html
標籤:其他
上一篇:系統架構設計背后的不良涌現物
下一篇:2021年度軟體開發狀態報告
