Helm 是 Deis 開發的一個用於Kubernetes
應用的包管理工具,主要用來管理 Charts
。有點相似 CentOS 中的 yum包管理工具。能夠很方便的將以前打包的好的yaml
文件部署到Kubernetes
上。html
kubernetes上的應用對象,都是由特定的資源描述組成,包括deployment
、service
等,都保存各自文件中或集中寫到一個配置文件中,而後經過kubectl apply -f ...
進行部署。node
若是應用只是一個或幾個這樣的服務組成,上面的部署方式足夠了。而對於一個複雜的應用,會有不少相似上面的資源文件,例如爲服務架構應用,組成應用的服務可能多達十個,幾十個。若是有更新或回滾應用的需求,可能要修改和維護所涉及的大量資源文件,而這種組織和管理應用的方式就顯得力不從心。且因爲缺乏對發佈過的應用版本管理和空置,使Kubernetes
上的應用和更新等面臨諸多的挑戰。主要面臨如下幾個問題:mysql
kubernetes
應用配置文件。kubernetes
的應用配置。
✏️ helmlinux
Helm是一個命令行下的客戶端工具,主要用於kubernetes
應用程序Chart
的建立、打包、發佈和管理nginx
✏️ Tillerweb
Tiller 是 Helm 的服務端,部署在Kubernetes
集羣中,Tiller 用於接收 Helm 的請求,並根據 Chart 生成 kubernetes 的部署文件(Helm稱爲Release),而後提交給 Kubernetes 建立應用,Tiller 還提供了 Release 的升級、刪除、回滾等一系列功能sql
✏️ Chart數據庫
Helm 的軟件包,採用 TAR 格式,相似於 yum 的 rpm包,其包含了一組定義 Kubernetes 資源相關的 YAML 文件json
✏️ Releaseubuntu
基於 Chart 部署實體,一個 chart 被 helm 運行後將會生成對應的一個 release;將在 kubernetes 中建立出真實運行的資源對象。
✏️ Repoistory
Helm 的軟件倉庫,Repository 本質上是一個 Web 服務器,該服務器保存了一系列的 Chart 軟件包以供用戶下載,而且提供了一個該 Repository 的 Chart 包的清單文件以供查詢。Helm 能夠同時管理多個不一樣的 Repository。
下圖描述了 Helm 的幾個關鍵組件 Helm(客戶端)、Tiller(服務器)、Repository(Chart軟件倉庫)、Chart(軟件包)之間的關係。
Chart Install 過程
Chart Update 過程
Chart Rollback 過程
Chart 處理依賴說明
Tiller 在處理 Chart 時,直接將 Chart 以及其依賴的全部 Charts 合併爲一個 Release,同時傳遞給 Kubernetes。所以 Tiller 並不負責管理依賴之間的啓動順序。Chart 中的應用須要可以自行處理依賴關係。
Helm2時期,添加了Tiller組件和GRPC來處理Helm chart的安裝和管理,呈現chart並將它們推送到Kubernetes API服務器,2019年11月13日,Helm 團隊發佈了 Helm v3
的第一個穩定版本
架構變化
很明顯從helm v3
移除了 Tiller
Helm 3新特性
Release
名稱能夠在不一樣命名空間重用
支持將 Chart 推送至 Docker 鏡像倉庫中
使用JSONSchema驗證chart values
其餘特性以下
爲了更好地協調其餘包管理者的措辭 Helm CLI
個別改名
helm delete` 改名爲 `helm uninstall helm inspect` 改名爲 `helm show helm fetch` 改名爲 `helm pull 但以上舊的命令當前仍能使用
移除了用於本地臨時搭建 Chart Repository
的 helm serve
命令。
自動建立名稱空間
在不存在的命名空間中建立發行版時,Helm 2建立了命名空間。Helm 3遵循其餘Kubernetes對象的行爲,若是命名空間不存在則返回錯誤。
再也不須要requirements.yaml
, 依賴關係是直接在chart.yaml
中定義。
helm 部署方式有不少,能夠參考官方文檔
1.下載helm
# wget https://mirrors.huaweicloud.com/helm/v2.16.9/helm-v2.16.9-linux-amd64.tar.gz
2.安裝配置
# tar xvzf helm-v2.16.9-linux-amd64.tar.gz # cp -av linux-amd64/helm /usr/bin/ # cp -av linux-amd64/tiller /usr/bin/
3.指定配置文件(此步驟視狀況而定,好比rke部署的k8s集羣則須要;kubeadm部署的集羣默認在master節點則不須要)
# vim /root/.bashrc alias helm='helm --kubeconfig /home/rancher/kube_config_cluster.yml' # source /root/.bashrc
4.在kube-system命名空間中建立serviceaccount
# kubectl create serviceaccount --namespace kube-system tiller
5.建立ClousterRoleBinding以授予tiller帳戶對集羣的訪問權限
# kubectl create clusterrolebinding tiller-cluster-admin --clusterrole=cluster-admin --group=system:serviceaccounts --namespace=kube-system:tiller
6.安裝helm server(tiller),注意保持版本號相同
helm init --service-account tiller --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.16.9 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts --force-upgrade
7.查看tiller服務是否正常運行
# kubectl get pod -n kube-system -l app=helm NAME READY STATUS RESTARTS AGE tiller-deploy-79f8998f84-85lwq 1/1 Running 0 45s
8.查看版本(注意:client和server版本必需要保持一致)
# helm version Client: &version.Version{SemVer:"v2.16.9", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"} Server: &version.Version{SemVer:"v2.16.9", GitCommit:"0e7f3b6637f7af8fcfddb3d2941fcc7cbebb0085", GitTreeState:"clean"}
補充:若是須要在kubernetes
中卸載已部署的 Tiller, 可以使用以下命令進行卸載
# helm reset
helm v3
已經移除了tiller
,因此只須要部署helm客戶端便可,即解壓軟件移動命令便可
# wget https://mirrors.huaweicloud.com/helm/v3.2.1/helm-v3.2.1-linux-amd64.tar.gz # tar xvzf helm-v3.2.1-linux-amd64.tar.gz # cp -av linux-adm64/helm /usr/bin/
命令 | 描述 |
---|---|
create | 建立一個chart並指定名字 |
dependency | 管理chart依賴 |
get | 下載一個release。可用子命令:all、hooks、manifest、notes、values |
history | 獲取release歷史 |
install | 安裝一個chart |
list | 列出release |
package | 將chart目錄打包到chart存檔文件中 |
pull | 從遠程倉庫中下載chart並解壓到本地 # helm pull stable/mysql --untar |
repo | 添加,列出,移除,更新和索引chart倉庫。可用子命令:add、index、list、remove、update |
rollback | 從以前版本回滾 |
search | 根據關鍵字搜索chart。可用子命令:hub、repo |
show | 查看chart詳細信息。可用子命令:all、chart、readme、values |
status | 顯示已命名版本的狀態 |
template | 本地呈現模板 |
uninstall | 卸載一個release |
upgrade | 更新一個release |
version | 查看helm客戶端版本 |
經常使用倉庫以下:
✏️ 添加倉庫
添加微軟倉庫爲 stable # helm repo add stable http://mirror.azure.cn/kubernetes/charts "stable" has been added to your repositories 添加阿里雲倉庫爲 aliyun # helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts "aliyun" has been added to your repositories
✏️ 查看倉庫
# helm repo list NAME URL stable http://mirror.azure.cn/kubernetes/charts aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
✏️ 查看一個倉庫中全部的包
# helm search repo stable NAME CHART VERSION APP VERSION DESCRIPTION stable/acs-engine-autoscaler 2.2.2 2.1.1 DEPRECATED Scales worker nodes within agent pools stable/aerospike 0.3.2 v4.5.0.5 A Helm chart for Aerospike in Kubernetes stable/airflow 7.1.5 1.10.10 Airflow is a platform to programmatically autho... stable/ambassador 5.3.2 0.86.1 DEPRECATED A Helm chart for Datawire Ambassador stable/anchore-engine 1.6.9 0.7.2 Anchore container analysis and policy evaluatio...
✏️ 刪除倉庫
# helm repo remove aliyun "aliyun" has been removed from your repositories
這裏示例經過helm部署一個MySQL進行示例
1.查找 chart
:
# helm search repo mysql NAME CHART VERSION APP VERSION DESCRIPTION stable/mysql 1.6.4 5.7.30 Fast, reliable, scalable, and easy to use open-... ......
2.查看下這個chart
的變量信息,這裏將變量文件保存到本地,進行修改後再使用,這裏咱們將persistence
中enabled
改成false
,表示不適用存儲卷,查看變量文件能夠發現會自動綁定pvc
,可是這裏沒有提早準備pv
,若是不修改也能夠,先建立一個pv便可。
# helm show values stable/mysql > values.yaml # vim values.yaml persistence: enabled: false # 修改成false ## database data Persistent Volume Storage Class ## If defined, storageClassName: <storageClass> ## If set to "-", storageClassName: "", which disables dynamic provisioning ## If undefined (the default) or set to null, no storageClassName spec is ## set, choosing the default provisioner. (gp2 on AWS, standard on ## GKE, AWS & OpenStack) ## # storageClass: "-" accessMode: ReadWriteOnce size: 8Gi annotations: {}
3.經過helm install
進行安裝,這裏因爲修改了values
,因此經過-f
指定了本地的values.yaml
文件
# helm install my-mysql -f values.yaml stable/mysql NAME: my-mysql LAST DEPLOYED: Sun Jun 21 13:35:04 2020 NAMESPACE: default STATUS: deployed REVISION: 1 NOTES: MySQL can be accessed via port 3306 on the following DNS name from within your cluster: my-mysql.default.svc.cluster.local To get your root password run: MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default my-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo) To connect to your database: 1. Run an Ubuntu pod that you can use as a client: kubectl run -i --tty ubuntu --image=ubuntu:16.04 --restart=Never -- bash -il 2. Install the mysql client: $ apt-get update && apt-get install mysql-client -y 3. Connect using the mysql cli, then provide your password: $ mysql -h my-mysql -p To connect to your database directly from outside the K8s cluster: MYSQL_HOST=127.0.0.1 MYSQL_PORT=3306 # Execute the following command to route the connection: kubectl port-forward svc/my-mysql 3306 mysql -h ${MYSQL_HOST} -P${MYSQL_PORT} -u root -p${MYSQL_ROOT_PASSWORD}
4.查看狀態
# helm list NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION my-mysql default 1 2020-06-21 13:38:32.133419251 +0800 CST deployed mysql-1.6.4 5.7.30 查看發佈狀態 # helm status my-mysql 查看pod狀態 # kubectl get pods NAME READY STATUS RESTARTS AGE my-mysql-7557c5798c-lvshx 1/1 Running 0 35s
5.根據上面提示的查看密碼,進行鏈接MySQL進行測試
# kubectl get secret --namespace default my-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo i8MgJpwwZe # kubectl exec -it my-mysql-7557c5798c-lvshx -- mysql -u root -pi8MgJpwwZe ...... Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec)
上面變示例了經過helm部署一個應用(MySQL)。咱們也能夠進行自行構建Chart
進行部署。
Chart 目錄結構說明
mychart/ ├── charts ├── Chart.yaml ├── templates │ ├── deployment.yaml │ ├── _helpers.tpl │ ├── hpa.yaml │ ├── ingress.yaml │ ├── NOTES.txt │ ├── serviceaccount.yaml │ ├── service.yaml │ └── tests │ └── test-connection.yaml └── values.yaml
📝 示例
1.首先經過create生成chart模板樣式,進行修改便可,這裏採用徹底自定義,因此咱們將用不到的yaml文件進行刪除
# helm create mychart Creating mychart # tree mychart/ mychart/ ├── charts ├── Chart.yaml ├── templates └── values.yaml 2 directories, 2 files
2.修改Chart.yaml文件,定義版本和名字等
# cd mychart/ # vim Chart.yaml apiVersion: v2 name: mychart description: A Helm chart for Kubernetes type: application version: 0.1.0 appVersion: 1.16.0
3.這裏部署經過部署一個web站點nginx進行示例,首先經過kubectl create 生產一個deployment 模板進行修改,下面yaml文件中將 副本數(replicas)、name、image定義爲了變量進行傳遞
# kubectl create deployment deployment --image=nginx:1.12 --dry-run -o yaml > templates/deployment.yaml # vim templates/deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: deployment name: {{ .Values.Name }} spec: replicas: {{ .Values.replicas }} selector: matchLabels: app: deployment template: metadata: labels: app: deployment spec: containers: - image: {{ .Values.image }} name: nginx
4.編寫變量文件
# vim values.yaml Name: mychart-deploy-demo replicas: 3 image: nginx:1.18.0
其實上面這兩個文件的內容就已經算是一個能夠安裝的chart包了。
5.進行安裝
# helm install web mychart/ NAME: web LAST DEPLOYED: Sun Jun 21 17:50:53 2020 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None # helm list NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION my-mysql default 1 2020-06-21 17:15:24.316454342 +0800 CST deployed mysql-1.6.4 5.7.30 # kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES mychart-deploy-demo-8475948ddd-565kk 1/1 Running 0 11s 10.244.1.35 k8s-node1 <none> <none> mychart-deploy-demo-8475948ddd-6d69h 1/1 Running 0 11s 10.244.2.33 k8s-node2 <none> <none> mychart-deploy-demo-8475948ddd-gvqqv 1/1 Running 0 11s 10.244.2.32 k8s-node2 <none> <none>
1.首先進行訪問測試,能夠看到訪問結果nginx版本爲1.18.0
# curl -I 10.244.1.35 HTTP/1.1 200 OK Server: nginx/1.18.0 Date: Sun, 21 Jun 2020 10:15:08 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Tue, 21 Apr 2020 12:43:12 GMT Connection: keep-alive ETag: "5e9eea60-264" Accept-Ranges: bytes
2.發佈新版本的chart時,或者當要更改發佈的配置時,可使用helm upgrade
命令,好比這裏升級鏡像爲1.19.0
# helm upgrade --set image=nginx:1.19.0 web mychart Release "web" has been upgraded. Happy Helming! NAME: web LAST DEPLOYED: Sun Jun 21 18:20:10 2020 NAMESPACE: default STATUS: deployed REVISION: 2 TEST SUITE: None # kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES mychart-deploy-demo-59fc9f9c7f-kk5mq 1/1 Running 0 15s 10.244.2.35 k8s-node2 <none> <none> mychart-deploy-demo-59fc9f9c7f-w94zq 1/1 Running 0 12s 10.244.2.36 k8s-node2 <none> <none> mychart-deploy-demo-59fc9f9c7f-x2pxg 1/1 Running 0 14s 10.244.1.39 k8s-node1 <none> <none> 訪問測試 # curl -I 10.244.1.39 HTTP/1.1 200 OK Server: nginx/1.19.0 Date: Sun, 21 Jun 2020 10:26:16 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Tue, 26 May 2020 15:00:20 GMT Connection: keep-alive ETag: "5ecd2f04-264" Accept-Ranges: bytes
能夠看到已經升級鏡像版本爲1.19.0版本,若是有大量的改動,那麼能夠修改values文件,而後經過以下命令進行更新
# helm upgrade -f values.yaml web mychart
若是在發佈後沒有達到預期的效果,則可使用helm rollback
回滾到以前的版本。經過helm history
命令能夠查看發佈版本記錄
# helm history web REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION 1 Sun Jun 21 18:24:41 2020 superseded mychart-0.1.0 1.16.0 Install complete 2 Sun Jun 21 18:25:27 2020 deployed mychart-0.1.0 1.16.0 Upgrade complete
好比這裏咱們要回滾到第一個版本:
# helm rollback web 1 Rollback was a success! Happy Helming!
在經過helm history
命令進行查看,能夠看到後面的 DESCRIPTION還有詳細版本說明。
# helm history web REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION 1 Sun Jun 21 18:24:41 2020 superseded mychart-0.1.0 1.16.0 Install complete 2 Sun Jun 21 18:25:27 2020 superseded mychart-0.1.0 1.16.0 Upgrade complete 3 Sun Jun 21 18:30:52 2020 deployed mychart-0.1.0 1.16.0 Rollback to 1
還能夠經過helm get manifest
命令查看模板被渲染事後的資源文件
# helm get manifest web --- # Source: mychart/templates/deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: deployment name: mychart-deploy-demo spec: replicas: 3 selector: matchLabels: app: deployment template: metadata: labels: app: deployment spec: containers: - image: nginx:1.18.0 name: nginx
若是咱們須要將構建的Chart打包保存,並推送到charts倉庫共享別人使用,則能夠經過helm package
命令進行打包
# helm package mychart/ Successfully packaged chart and saved it to: /root/helm/mychart-0.1.0.tgz
有時候咱們須要安裝應用,可是默認的chart的一些參數並非咱們須要的,這時候則須要咱們自定義參數傳給已有的 chart 進行安裝應用。示例,下面將進行自定義安裝MySQL
# helm show values stable/mysql ...... ## Specify password for root user ## ## Default: random 10 character string # mysqlRootPassword: testing ## Create a database user ## # mysqlUser: ## Default: random 10 character string # mysqlPassword: ## Allow unauthenticated access, uncomment to enable ## # mysqlAllowEmptyPassword: true ## Create a database ## # mysqlDatabase: ...... persistence: enabled: true ......
在安裝過程當中傳遞配置數據的方式有兩種:
經過上面查看默認的變量中,咱們進行自定義MySQL root用戶密碼,並安裝完成自動建立一個應用用戶及設置密碼,並建立一個應用數據庫helm;同事設定了不啓用persistence
# vim mysql_values.yaml mysqlRootPassword: te123 mysqlUser: helm mysqlPassword: helm123 mysqlDatabase: helm persistence: enabled: false
# helm install --set mysqlRootPassword=te123,mysqlUser=helm,mysqlPassword=helm123,mysqlDatabase=helm,persistence.enabled=false mysql-test stable/mysql
更多values yaml與set使用對應以下: