k8s (二十三) --- kubernetes Helm之構建一個 Helm Chart

一、創建helm chart

可以使用以下命令來創建一個名爲mychart 的 helm chart:

[root@server1 helm]# helm create mychart
Creating mychart

創建後會在目錄創建一個mychart目錄:

[root@server1 helm]# ls
mychart  redis-ha
[root@server1 helm]# tree mychart/		#查看結構
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

其中mychart目錄下的templates目錄中保存有部署的模板文件,values.yaml中定義了部署的變量,Chart.yaml文件包含有version(chart版本)和appVersion(包含應用的版本)。

在這裏插入圖片描述
現在我們來更改變量文件values.yaml

[root@server1 mychart]# vim values.yaml 

選擇鏡像及標籤和副本數(這裏設置1個)。
在這裏插入圖片描述編輯完成後檢查依賴和模板配置是否正確:

[root@server1 mychart]# helm lint .
==> Linting .
[INFO] Chart.yaml: icon is recommended

1 chart(s) linted, 0 chart(s) failed

將應用打包:

[root@server1 mychart]# cd ..
[root@server1 helm]# helm package mychart/
Successfully packaged chart and saved it to: /root/helm/mychart-0.1.0.tgz

打包後會在當前目錄下生成一個名爲mychart-0.1.0.tgz壓縮包:

[root@server1 helm]# ls
mychart  mychart-0.1.0.tgz  redis-ha

其中0.1.0爲在Chart.yaml文件中定義的version(chart版本)信息。

二、構建本地chart倉庫

helm v3 需要外部倉庫軟件的支持,我們這裏使用以前部署的harbor倉庫(新版本的harbor倉庫支持helm chart庫)。

harbor倉庫的部署可以參考:https://blog.csdn.net/qq_35887546/article/details/105411743

部署好之後需要在harbor創建一個公有項目來存放chart:

在這裏插入圖片描述
可以看出現在倉庫還沒有chart。

將倉庫添加到helm:

[root@server1 helm]# helm repo add mychart https://reg.westos.org/chartrepo/charts
Error: looks like "https://reg.westos.org/chartrepo/charts" is not a valid chart repository or cannot be reached: Get https://reg.westos.org/chartrepo/charts/index.yaml: x509: certificate signed by unknown authority

可以看出報錯是缺少證書,可以將證書複製到redhat的全局證書地址:

[root@server1 helm]# cd /etc/docker/certs.d/reg.westos.org/
[root@server1 reg.westos.org]# ls
ca.crt
[root@server1 reg.westos.org]# cp ca.crt /etc/pki/ca-trust/source/anchors/
[root@server1 reg.westos.org]# update-ca-trust 		#更新證書

再次添加:

[root@server1 reg.westos.org]# helm repo add mychart https://reg.westos.org/chartrepo/charts
"mychart" has been added to your repositories

添加成功,查看倉庫:

[root@server1 reg.westos.org]# helm repo list
NAME   	URL                                      
stable 	http://mirror.azure.cn/kubernetes/charts/
mychart	https://reg.westos.org/chartrepo/charts

三、安裝push插件

將chart push到helm倉庫需要push插件,這個插件有兩種安裝方式:

在線安裝:

 helm plugin install https://github.com/chartmuseum/helm-push	//在線安裝,注意需要先安裝git

在線安裝比較慢,也可以使用離線安裝的方式:

[root@server1 ~]# helm env		//獲取插件目錄
HELM_BIN="helm"
HELM_DEBUG="false"
HELM_KUBEAPISERVER=""
HELM_KUBECONTEXT=""
HELM_KUBETOKEN=""
HELM_NAMESPACE="default"
HELM_PLUGINS="/root/.local/share/helm/plugins"		#插件目錄
HELM_REGISTRY_CONFIG="/root/.config/helm/registry.json"
HELM_REPOSITORY_CACHE="/root/.cache/helm/repository"
HELM_REPOSITORY_CONFIG="/root/.config/helm/repositories.yaml"
 
[root@server1 ~]# mkdir -p /root/.local/share/helm/plugins/helm-push				#創建插件目錄
[root@server1 ~]# cd /root/.local/share/helm/plugins
[root@server1 plugins]# ls
helm-push

加壓插件的安裝包到插件目錄:

[root@server1 ~]# tar zxf helm-push_0.8.1_linux_amd64.tar.gz -C /root/.local/share/helm/plugins/helm-push
[root@server1 ~]# cd /root/.local/share/helm/plugins/helm-push
[root@server1 helm-push]# ls
bin  LICENSE  plugin.yaml
[root@server1 helm-push]# helm push --help		#測試插件是否安裝成功

現在可以進行push:

[root@server1 helm-push]# cd /root/helm/
[root@server1 helm]# helm push mychart-0.1.0.tgz mychart -u admin -p Harbor12345
Pushing mychart-0.1.0.tgz to mychart...
Done.

push成功,其中的用戶名和密碼爲harbor倉庫的用戶和密碼。

現在在harbor倉庫可以看到上傳的chart:
在這裏插入圖片描述在這裏插入圖片描述在本地還需要更新纔可以查找到:

[root@server1 helm]# helm repo update 
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "mychart" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete.Happy Helming![root@server1 helm]# 
[root@server1 helm]# helm search repo mychart
NAME           	CHART VERSION	APP VERSION	DESCRIPTION                
mychart/mychart	0.1.0        	1.16.0     	A Helm chart for Kubernetes

四、部署應用

部署mychart應用到k8s集羣

查看部署參數:

[root@server1 helm]# helm  show values  mychart/mychart
affinity: {}
autoscaling:
  enabled: false
  maxReplicas: 100
  minReplicas: 1
  targetCPUUtilizationPercentage: 80
fullnameOverride: ""
image:
  pullPolicy: IfNotPresent
  repository: myapp
  tag: v1
imagePullSecrets: []
ingress:
  annotations: {}
  enabled: false
  hosts:
  - host: chart-example.local
    paths: []
  tls: []
nameOverride: ""
nodeSelector: {}
podAnnotations: {}
podSecurityContext: {}
replicaCount: 1
resources: {}
securityContext: {}
service:
  port: 80
  type: ClusterIP
serviceAccount:
  annotations: {}
  create: true
  name: ""
tolerations: []

部署:

[root@server1 helm]# helm install test mychart/mychart 

在這裏插入圖片描述
其中test爲名稱,mychart/mychart 爲倉庫名稱,也可以加--dry-run表示做調試,--debug表示輸出部署過程。

部署完成後查看:

[root@server1 helm]# helm list 
NAME	NAMESPACE	REVISION	UPDATED                                	STATUS  	CHART        	APP VERSION
test	default  	1       	2020-05-12 23:07:15.122064081 +0800 CST	deployed	mychart-0.1.0	1.16.0     

更新版本

更新之前查看:

[root@server1 helm]# kubectl get pod
NAME                                      READY   STATUS    RESTARTS   AGE
nfs-client-provisioner-6b66ddf664-4htcz   1/1     Running   0          41m
test-mychart-7d7557d49b-vx7zw             1/1     Running   0          2m16s
[root@server1 helm]# kubectl get pod -o wide
NAME                                      READY   STATUS    RESTARTS   AGE     IP             NODE      NOMINATED NODE   READINESS GATES
nfs-client-provisioner-6b66ddf664-4htcz   1/1     Running   0          41m     10.244.2.112   server3   <none>           <none>
test-mychart-7d7557d49b-vx7zw             1/1     Running   0          2m20s   10.244.1.130   server2   <none>           <none>
[root@server1 helm]# 
[root@server1 helm]# curl 10.244.1.130
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

可以看出myapp的版本是v1

更改Chart.yaml文件更改版本號爲0.2.0:

[root@server1 helm]# vim mychart/Chart.yaml

在這裏插入圖片描述更改變量文件values.yaml 更改鏡像版本爲v2:

[root@server1 helm]# vim mychart/values.yaml 

在這裏插入圖片描述打包:

[root@server1 helm]# helm package mychart
Successfully packaged chart and saved it to: /root/helm/mychart-0.2.0.tgz

[root@server1 helm]# ls
mychart  mychart-0.1.0.tgz  mychart-0.2.0.tgz  redis-ha

可以看出自動根據版本文件中的信息打包了0.2.0的壓縮包,接下來進行push:

[root@server1 helm]# helm push mychart-0.2.0.tgz mychart -u admin -p Harbor12345
Pushing mychart-0.2.0.tgz to mychart...
Done.

查看倉庫:
在這裏插入圖片描述本地查看:

[root@server1 helm]# helm repo update 
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "mychart" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete.Happy Helming![root@server1 helm]# 
[root@server1 helm]# helm search repo mychart
NAME           	CHART VERSION	APP VERSION	DESCRIPTION                
mychart/mychart	0.2.0        	1.16.0     	A Helm chart for Kubernetes

可以看出0.2.0版本已經可以查找到了。

也可以加-l選項查看每個版本:

[root@server1 helm]# helm search repo mychart -l
NAME           	CHART VERSION	APP VERSION	DESCRIPTION                
mychart/mychart	0.2.0        	1.16.0     	A Helm chart for Kubernetes
mychart/mychart	0.1.0        	1.16.0     	A Helm chart for Kubernetes

進行更新:

[root@server1 helm]# helm upgrade test mychart/mychart 
Release "test" has been upgraded. Happy Helming!
......

查看:

[root@server1 helm]# helm list
NAME	NAMESPACE	REVISION	UPDATED                                	STATUS  	CHART        	APP VERSION
test	default  	2       	2020-05-12 23:13:14.870471994 +0800 CST	deployed	mychart-0.2.0	1.16.0   

可以看到chart已經更新到0.2.0.

可以使用以下命令查看部署歷史以便回滾:

[root@server1 helm]# helm history test 
REVISION	UPDATED                 	STATUS    	CHART        	APP VERSIONDESCRIPTION     
1       	Tue May 12 23:07:15 2020	superseded	mychart-0.1.0	1.16.0     Install complete
2       	Tue May 12 23:13:14 2020	deployed  	mychart-0.2.0	1.16.0     Upgrade complete

測試查看版本:

[root@server1 helm]# kubectl get pod -o wide
NAME                                      READY   STATUS    RESTARTS   AGE     IP             NODE      NOMINATED NODE   READINESS GATES
nfs-client-provisioner-6b66ddf664-4htcz   1/1     Running   0          49m     10.244.2.112   server3   <none>           <none>
test-mychart-c8d845c77-v4hg6              1/1     Running   0          4m26s   10.244.2.113   server3   <none>           <none>
[root@server1 helm]# 
[root@server1 helm]# 
[root@server1 helm]# curl 10.244.2.113
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>

版本回滾

使用rollback選項進行回滾:

[root@server1 helm]# helm rollback test 1
Rollback was a success! Happy Helming!
[root@server1 helm]# helm history
Error: "helm history" requires 1 argument

Usage:  helm history RELEASE_NAME [flags]
[root@server1 helm]# helm history test
REVISION	UPDATED                 	STATUS    	CHART        	APP VERSION	DESCRIPTION     
1       	Tue May 12 23:07:15 2020	superseded	mychart-0.1.0	1.16.0     	Install complete
2       	Tue May 12 23:13:14 2020	superseded	mychart-0.2.0	1.16.0     	Upgrade complete
3       	Tue May 12 23:33:48 2020	deployed  	mychart-0.1.0	1.16.0     	Rollback to 1   

查看測試頁面:

[root@server1 helm]# kubectl get pod -o wide
NAME                                      READY   STATUS    RESTARTS   AGE   IP             NODE      NOMINATED NODE   READINESS GATES
nfs-client-provisioner-6b66ddf664-4htcz   1/1     Running   0          66m   10.244.2.112   server3   <none>           <none>
test-mychart-7d7557d49b-9v2s6             1/1     Running   0          42s   10.244.1.131   server2   <none>           <none>
[root@server1 helm]# curl 10.244.1.131
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

可以看到pod的版本已經回滾到v1.

卸載應用

[root@server1 helm]# helm uninstall test 
release "test" uninstalled
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章