十八,helm的原理及基礎使用


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名稱

參考鏈接:https://www.cnblogs.com/peitianwang/p/11649621.html,https://www.cnblogs.com/tylerzhou/p/11136107.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM