目錄
helm介紹
helm把一系列復雜的有狀態和無狀態服務的部署封裝起來(實際上就是對yaml文件的組織),然后你可以暴露出一些自定義參數信息供用戶選擇,這樣部署就會變得簡單很多.
核心術語
- Helm 是一個命令行下的客戶端工具。主要用於 Kubernetes 應用程序 Chart 的創建、打包、發布以及創建和管理本地和遠程的 Chart 倉庫。
- Tiller 是 Helm 的服務端,部署在 Kubernetes 集群中。Tiller 用於接收 Helm 的請求,並根據 Chart和Config 生成 Kubernetes 的部署文件( Helm 稱為 Release ),然后提交給 Kubernetes 創建應用。Tiller 還提供了 Release 的升級、刪除、回滾等一系列功能。
- Chart :一個Helm 的軟件包,采用 TAR 格式。類似於 APT 的 DEB 包或者 YUM 的 RPM 包,其包含了一組定義 Kubernetes 資源相關的 YAML 文件
- Repoistory: Helm 的軟件倉庫,Repository 本質上是一個 Web 服務器,該服務器保存了一系列的 Chart 軟件包以供用戶下載,並且提供了一個該 Repository 的 Chart 包的清單文件以供查詢。Helm 可以同時管理多個不同的 Repository。
- Release 使用 helm install 命令在 Kubernetes 集群中部署的 Chart 稱為 Release
組成示意圖
helm安裝
helm安裝
wget https://get.helm.sh/helm-v2.14.3-linux-amd64.tar.gz
tar xf helm-v2.14.3-linux-amd64.tar.gz
cd linux-amd64 #進入解壓目錄會看到兩個可執行文件helm和tiller, 若采用容器化部署到kubernetes中,則可以不用管tiller,只需將helm復制到/usr/bin目錄即可
cp helm /usr/bin/
echo "source <(helm completion bash)" >> /root/.bashrc # 命令自動補全
Tiller安裝
創建tiller相關的rbac
[root@master helm]# vim helm-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: tiller
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: tiller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: tiller
namespace: kube-system
[root@master helm]# kubectl apply -f helm-rbac.yaml
serviceaccount/tiller created
clusterrolebinding.rbac.authorization.k8s.io/tiller created
helm init --upgrade -i registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.14.3 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
因為牆, 所以指定國內tiller鏡像, tiller標簽和helm保持一致, 這里是v2.14.3
kubectl get pods -n kube-system -l app=helm
kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
初始化后通過命令查看tiller pod創建情況
helm使用
添加chart源
由於阿里的chart源可能更新不及時, 會比較老, 所以建議替換為默認源或者微軟的azure源
參考鏈接: https://github.com/BurdenBear/kube-charts-mirror
helm repo add stable http://mirror.azure.cn/kubernetes/charts/
helm repo add incubator http://mirror.azure.cn/kubernetes/charts-incubator/
helm常用命令:
release管理:
install:創建一個release,下載的壓縮文件默認存放路徑為/$HOME/.helm/cache/archive/
delete
upgrade/rollback
list
history:release的歷史信息;
status:獲取release狀態信息;
chart管理:
create
fetch :遠程獲取並展開
get
inspect :查看chart詳細信息
package:打包chart文件
verify:校驗
基礎命令
命令 | 作用 |
---|---|
搜索chart | helm search CHARTNAME |
查看chart詳細信息 | helm inspect CHARTNAME |
安裝 | helm install --name mem1(指定別名) stable/redis --values valueFiles |
獲取狀態信息 | helm status mem1 |
列出release | helm list [-a] |
刪除release | helm delete [--purge] mem1 |
下載chart | helm fetch stable/redis |
創建chart | helm create CHARTNAME |
語法檢測 | helm lint CHARTNAME |
打包 | helm package CHARTNAME |
目錄
自定義chart
一、chart的結構
(1)更改helm為阿里雲倉庫源
[root@master helm]# helm repo remove stable
"stable" has been removed from your repositories
[root@master helm]# helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
"stable" has been added to your repositories
[root@master helm]# helm repo list
NAME URL
local http://127.0.0.1:8879/charts
incubator https://kubernetes-charts-incubator.storage.googleapis.com/
stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
#更新
[root@master helm]# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "incubator" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈ Happy Helming!⎈
(2)
[root@master helm]# pwd
/root/manifests/helm
[root@master helm]# helm fetch stable/redis #獲取chart,會得到一個壓縮包
[root@master helm]# tar zxf redis-6.4.3.tgz
[root@master helm]# ls
redis redis-6.4.3.tgz tiller-rbac.yaml
#chart目錄結構
[root@master helm]# tree redis
redis
├── Chart.yaml #chart元數據描述信息(關鍵詞,版本等...)
├── ci
│ ├── default-values.yaml
│ ├── dev-values.yaml
│ ├── production-values.yaml
│ ├── redisgraph-module-values.yaml
│ └── redis-lib-values.yaml
├── README.md #該chart的簡介,可選文件
├── templates #資源定義清單模板文件
│ ├── configmap.yaml
│ ├── health-configmap.yaml
│ ├── _helpers.tpl
│ ├── metrics-deployment.yaml
│ ├── metrics-prometheus.yaml
│ ├── metrics-svc.yaml
│ ├── networkpolicy.yaml
│ ├── NOTES.txt
│ ├── redis-master-statefulset.yaml
│ ├── redis-master-svc.yaml
│ ├── redis-rolebinding.yaml
│ ├── redis-role.yaml
│ ├── redis-serviceaccount.yaml
│ ├── redis-slave-deployment.yaml
│ ├── redis-slave-svc.yaml
│ └── secret.yaml
├── values-production.yaml
└── values.yaml #為 templates中的資源定義清單設置自定義屬性值
#其他目錄結構
requirements.yaml #當前chart是否依賴其他chart,這個文件是可選的。
charts/ #里面放置的是當前chart所要依賴的其他chart,這個是可選的。
#可以通過chart官方手冊,來了解以上每項的詳細含義:
https://docs.helm.sh/developing_charts/#charts
二、用helm生成基礎chart示例性文件
(1)
[root@master helm]# helm create myapp #創建myapp,自動生成chart基礎目錄結構
Creating myapp
[root@master helm]# ls |grep myapp
myapp
[root@master helm]# tree myapp/
myapp/
├── charts
├── Chart.yaml
├── templates #go模板語法
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── ingress.yaml
│ ├── NOTES.txt
│ └── service.yaml
└── values.yaml
[root@master myapp]# vim Chart.yaml #自定義Chart.yaml
apiVersion: v1
appVersion: "1.0"
scription: A Helm chart for Kubernetes myapp
name: myapp
version: 0.0.1
maintainer:
name: li
email: ll@163.com
url: www.beijing.club
[root@master myapp]# vim requirements.yaml
#自定義依賴的chart,定義chart的name,version,來自哪個倉庫等,該步驟為可選步驟
[root@master myapp]# cd templates/
[root@master templates]# tree ../templates/
../templates/
├── deployment.yaml
├── _helpers.tpl
├── ingress.yaml
├── NOTES.txt #提供給用戶的提示信息
├── service.yaml
└── tests
└── test-connection.yaml
#可以自己修改每個文件里的值,然后做語法檢查
[root@master helm]# helm lint myapp #語法檢查,注意執行的目錄,需要在myapp的上級目錄
==> Linting myapp
[INFO] Chart.yaml: icon is recommended
1 chart(s) linted, no failures
#打包
[root@master helm]# helm package myapp/ #打包chart
Successfully packaged chart and saved it to: /root/manifests/helm/myapp-0.0.1.tgz
[root@master helm]# ls |grep myapp
myapp
myapp-0.0.1.tgz
(2)啟動本地倉庫,並應用
[root@master helm]# helm repo list
NAME URL
stable https://kubernetes-charts.storage.googleapis.com
local http://127.0.0.1:8879/charts #通過本機的8878端口獲取
#啟動本地倉庫
[root@master helm]# helm serve #啟動8878端口
Regenerating index. This may take a moment.
Now serving you on 127.0.0.1:8879
#查看,可見myapp已經自動保存在倉庫中了
[root@master ~]# helm search myapp
NAME CHART VERSION APP VERSION DESCRIPTION
local/myapp 0.0.1 1.0 A Helm chart for Kubernetes myapp chart
#如果定義的沒問題,就可以部署了
[root@master ~]# helm install --name myapp1 local/myapp
#查看當前Release的狀態信息
[root@node1 ~]# helm status myapp1
#當前Release
[root@master ~]# helm delete --purge myapp1 # --purge 移除並釋放該名稱,后續還可繼續使用myapp1名稱