helm chart應用使用示例


有兩種方法
一是按照正常流程直接用yaml文件的形式發布應用到k8s集群上
二是把生成好的yaml文件發布到kubeapps應用商店,在應用商店中操作發布應用到k8s集群中

這里采用第二種方式的變種方式:使用Helm chart 的方式把應用直接部署到k8s集群中

參考文章:https://www.hi-linux.com/posts/21466.html

  • 構建一個 Helm Chart
# 創建一個名為 mychart 的 Chart
helm create mychart

目錄結構:
mychart/
├── charts
├── Chart.yaml # 描述這個 Chart的相關信息,包括名字、描述信息以及版本等
├── templates # YAML 文件的模板
│   ├── deployment.yaml
│   ├── _helpers.tpl
│   ├── ingress.yaml
│   ├── NOTES.txt # 介紹 Chart 部署后的一些信息,例如:如何使用這個 Chart、列出缺省的設置等。
│   └── service.yaml
└── values.yaml # 存儲 templates 目錄中模板文件中用到變量的值

Templates 目錄下 YAML 文件模板的值默認都是在 values.yaml 里定義的,比如在 deployment.yaml 中定義的容器鏡像。
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"

其中的 .Values.image.repository 的值就是在 values.yaml 里定義的 nginx,.Values.image.tag 的值就是 stable。
$ cat mychart/values.yaml|grep repository
repository: nginx

$ cat mychart/values.yaml|grep tag
tag: stable

以上兩個變量值是在 create chart 的時候就自動生成的默認值,你可以根據實際情況進行修改。

# 編寫應用的介紹信息
$ cat mychart/Chart.yaml
apiVersion: v1
appVersion: "1.0"
description: A Helm chart for Kubernetes
name: mychart
version: 0.1.0

# 編寫應用具體部署信息
編輯 values.yaml,它默認會在 Kubernetes 部署一個 busybox。下面是 mychart 應用的 values.yaml 文件的內容:
# 這里采用的是harbor倉庫中的鏡像
image:
  repository: www.harbor.mobi/myrepo/busybox
  tag: 0.1
  pullPolicy: IfNotPresent

# 檢查依賴和模板配置是否正確,如果文件格式錯誤,可以根據提示進行修改
$ helm lint mychart/
==> Linting .
[INFO] Chart.yaml: icon is recommended

1 chart(s) linted, no failures

# 將應用打包,mychart 目錄會被打包為一個 mychart-0.1.0.tgz 格式的壓縮包,該壓縮包會被放到當前目錄下,並同時被保存到了 Helm 的本地缺省倉庫目錄中。如果你想看到更詳細的輸出,可以加上 --debug 參數來查看打包的輸出
helm package mychart
Successfully packaged chart and saved it to: /tmp/mychart-0.1.0.tgz

# 將應用發布到 Repository,這一步稍微有些變化

######## 正常流程 #################
# 雖然我們已經打包了 Chart 並發布到了 Helm 的本地目錄中,但通過 helm search 命令查找,並不能找不到剛才生成的 mychart包。

helm search mychart
No results found

# 這是因為 Repository 目錄中的 Chart 包還沒有被 Helm 管理。通過 helm repo list 命令可以看到目前 Helm 中已配置的 Repository 的信息。

helm repo list
NAME    URL
stable  https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

# 注:新版本中執行 helm init 命令后默認會配置一個名為 local 的本地倉庫。

# 我們可以在本地啟動一個 Repository Server,並將其加入到 Helm Repo 列表中。Helm Repository 必須以 Web 服務的方式提供,這里我們就使用 helm serve 命令啟動一個 Repository Server,該 Server 缺省使用 $HOME/.helm/repository/local 目錄作為 Chart 存儲,並在 8879 端口上提供服務。

helm serve &
Now serving you on 127.0.0.1:8879

# 默認情況下該服務只監聽 127.0.0.1,如果你要綁定到其它網絡接口,可使用以下命令:

helm serve --address 192.168.100.211:8879 &

# 如果你想使用指定目錄來做為 Helm Repository 的存儲目錄,可以加上 --repo-path 參數

helm serve --address 192.168.100.211:8879 --repo-path /data/helm/repository/ --url http://192.168.100.211:8879/charts/

# 通過 helm repo index 命令將 Chart 的 Metadata 記錄更新在 index.yaml 文件中

# 更新 Helm Repository 的索引文件
$ cd /home/k8s/.helm/repository/local
$ helm repo index --url=http://192.168.100.211:8879 .

# 完成啟動本地 Helm Repository Server 后,就可以將本地 Repository 加入 Helm 的 Repo 列表。

helm repo add local http://127.0.0.1:8879
"local" has been added to your repositories


# 現在再次查找 mychart 包,就可以搜索到了。

$ helm repo update
$ helm search mychart
NAME         	CHART VERSION	APP VERSION	DESCRIPTION
local/mychart	0.1.0        	1.0        	A Helm chart for Kubernetes

############ 變種操作 ################
# 因為采用的是其他部署方式,默認已經有local倉庫了,同時也能夠搜索出來

helm search mychart
NAME            CHART VERSION   APP VERSION     DESCRIPTION                
local/mychart   0.1.0           1.0             A Helm chart for Kubernetes

# 唯一的問題是,無法從該倉庫中獲取這個應用,報錯信息如下
helm install --dry-run --debug local/mychart --name mike-test
[debug] Created tunnel using local port: '45398'

[debug] SERVER: "127.0.0.1:45398"

[debug] Original chart version: ""
Error: Get http://127.0.0.1:8879/charts/mychart-0.1.0.tgz: dial tcp 127.0.0.1:8879: connect: connection refused

# 解決辦法
# local倉庫已經添加了,也能找到這個應用,唯一需要做的步驟就是后台啟動這個倉庫
helm serve &
[1] 96756
[root@ks-allinone tmp]# Regenerating index. This may take a moment.
Now serving you on 127.0.0.1:8879

# 此時就能正常操作了

  • 在 Kubernetes 中部署應用
# Chart 被發布到倉儲后,就可以通過 helm install 命令部署該 Chart。
# 當使用 helm install 命令部署應用時,實際上就是將 templates 目錄下的模板文件渲染成 Kubernetes 能夠識別的 YAML 格式。
# 在部署前我們可以使用 helm install --dry-run --debug <chart_dir> --name <release_name>命令來驗證 Chart 的配置。該輸出中包含了模板的變量配置與最終渲染的 YAML 文件。
# 注:local/mychart表示從local倉庫獲取mychart應用,--name 表示的是部署后的應用名稱
helm install --dry-run --debug local/mychart --name mike-test

# 驗證完成沒有問題后,我們就可以使用以下命令將其部署到 Kubernetes 上了。
# 部署時需指定 Chart 名及 Release(部署的實例)名。
# 注:helm install 默認會用到 socat,需要在所有節點上安裝 socat 軟件包。

helm install local/mychart --name mike-test

NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace default -l "app=mychart,release=mike-test" -o jsonpath="{.items[0].metadata.name}")
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl port-forward $POD_NAME 8080:80
# 最后顯示的這個是說明如何操作才能訪問這個應用的
# 在這里不采用這種方式,而是在KubeSphere中管理這個應用

# 使用下面的命令列出的所有已部署的 Release 以及其對應的 Chart。

helm list

# 還可以使用 helm status 查詢一個特定的 Release 的狀態。

helm status mike-test

# 升級和回退一個應用
# 從上面 helm list 輸出的結果中我們可以看到有一個 Revision(更改歷史)字段,該字段用於表示某一個 Release 被更新的次數,我們可以用該特性對已部署的 Release 進行回滾。
# 將版本號從 0.1.0 修改為 0.2.0, 然后使用 helm package 命令打包並發布到本地倉庫。

cat mychart/Chart.yaml 

apiVersion: v1
appVersion: "1.0"
description: A Helm chart for Kubernetes
name: mychart
version: 0.2.0

helm package mychart
Successfully packaged chart and saved it to: /tmp/mychart-0.2.0.tgz

# 查詢本地倉庫中的 Chart 信息,可以看到在本地倉庫中 mychart 有兩個版本。
helm search mychart -l
NAME            CHART VERSION   APP VERSION     DESCRIPTION                
local/mychart   0.2.0           1.0             A Helm chart for Kubernetes
local/mychart   0.1.0           1.0             A Helm chart for Kubernetes

# 現在用 helm upgrade 命令將已部署的 mike-test 升級到新版本。你可以通過 --version 參數指定需要升級的版本號,如果沒有指定版本號,則缺省使用最新版本。

helm upgrade mike-test local/mychart
Release "mike-test" has been upgraded.
LAST DEPLOYED: Wed Nov 20 02:27:05 2019
NAMESPACE: test
STATUS: DEPLOYED

RESOURCES:
==> v1/Deployment
NAME               READY  UP-TO-DATE  AVAILABLE  AGE
mike-test-mychart  0/1    1           0          104m

==> v1/Pod(related)
NAME                                READY  STATUS     RESTARTS  AGE
mike-test-mychart-69b44c75bf-7rxqt  0/1    Completed  25        104m

==> v1/Service
NAME               TYPE       CLUSTER-IP     EXTERNAL-IP  PORT(S)  AGE
mike-test-mychart  ClusterIP  10.233.41.226  <none>       80/TCP   104m


NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace test -l "app.kubernetes.io/name=mychart,app.kubernetes.io/instance=mike-test" -o jsonpath="{.items[0].metadata.name}")
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl port-forward $POD_NAME 8080:80


helm list | grep mychart

mike-test       2               Wed Nov 20 02:27:05 2019        DEPLOYED        mychart-0.2.0           1.0                             test

# 如果更新后的程序由於某些原因運行有問題,需要回退到舊版本的應用。
# 首先我們可以使用 helm history 命令查看一個 Release 的所有變更記錄。
helm history mike-test
REVISION        UPDATED                         STATUS          CHART           DESCRIPTION     
1               Wed Nov 20 00:42:38 2019        SUPERSEDED      mychart-0.1.0   Install complete
2               Wed Nov 20 02:27:05 2019        DEPLOYED        mychart-0.2.0   Upgrade complete

# 其次,我們可以使用下面的命令對指定的應用進行回退。
helm rollback mike-test 1
Rollback was a success.

# 注:其中的參數 1 是 helm history 查看到 Release 的歷史記錄中 REVISION 對應的值。

# 最后,我們使用 helm list 和 helm history 命令都可以看到 mychart 的版本已經回退到 0.1.0 版本。

helm history mike-test   
REVISION        UPDATED                         STATUS          CHART           DESCRIPTION     
1               Wed Nov 20 00:42:38 2019        SUPERSEDED      mychart-0.1.0   Install complete
2               Wed Nov 20 02:27:05 2019        SUPERSEDED      mychart-0.2.0   Upgrade complete
3               Wed Nov 20 02:34:42 2019        DEPLOYED        mychart-0.1.0   Rollback to 1   
# 刪除一個應用
# 如果需要刪除一個已部署的 Release,可以利用 helm delete 命令來完成刪除。
helm delete mike-test
release "mike-test" deleted

# 確認應用是否刪除,該應用已被標記為 DELETED 狀態。
helm ls -a mike-test
NAME     	REVISION	UPDATED                 	STATUS 	CHART        	NAMESPACE
mike-test	3       	Mon Jul 23 10:53:42 2018	DELETED	mychart-0.1.0	default


# 也可以使用 --deleted 參數來列出已經刪除的 Release
helm ls --deleted
NAME     	REVISION	UPDATED                 	STATUS 	CHART        	NAMESPACE
mike-test	3       	Mon Jul 23 10:53:42 2018	DELETED	mychart-0.1.0	default

# 默認情況下已經刪除的 Release 只是將狀態標識為 DELETED 了 ,但該 Release 的歷史信息還是繼續被保存的。

# 如果要移除指定 Release 所有相關的 Kubernetes 資源和 Release 的歷史記錄,可以用如下命令
 helm delete --purge mike-test
release "mike-test" deleted

# 再次查看已刪除的 Release,已經無法找到相關信息
$ helm hist mike-test
Error: release: "mike-test" not found

# helm ls 命令也已均無查詢記錄。
$ helm ls --deleted
$ helm ls -a mike-test


  • 總結
    以上這些都是使用helm命令進行操作管理的,但是我們這想要的效果是通過Kubeapps應用商店進行管理。
    在創建chart目錄並做相應的修改后,不是直接把應用打包成tgz文件,然后直接安裝到k8s集群中,而是直接把chart目錄給推送到Harbor倉庫的Helm Charts中。
    若harbor是http訪問的,如下這些操作沒什么問題:
  1. helm添加harbor 的repo應用倉庫
  2. 推送helm chart到harbor的Helm Charts,並查看
  3. 在Kubeapps中查看的到Harbor里的Helm Charts。

有問題的是,使用docker login 命令登陸harbor倉庫時報錯,這個也有辦法解決,但是docker並不是單獨安裝的,而是基於KubeSphere安裝的,解決這個問題極容易導致Harbor所使用的相關容器無法使用等

若harbor是https訪問的,

  1. helm添加harbor 的repo應用倉庫 (需要加上自簽名證書),這一步沒問題
  2. 推送helm chart到harbor的Helm Charts,(需要加上自簽名證書和賬號信息等),這一步也沒問題。但是在Harbor中查看Helm Charts的話會報錯:HELM_CHART.NO_DETAIL
    還有一個問題時無法在Kubeapps中查看Harbor里的Helm Charts。報錯信息如下:{"code":404,"message":"could not find chart"}

如上這倆問題還需要進一步解決


免責聲明!

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



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