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