3.1 爲何須要Helm?
K8S上的應用對象,都是由特定的資源描述組成,包括deployment、service等。都保存各自文件中或者集中寫到一個配置文件。而後kubectl apply –f 部署。html
爲何使用helm?
在k8s中,當咱們去部署應用的時候,通常都是使用yaml文件去管理咱們的應用的發佈,好比像微服務,其中包括deployment,service,configmap,ingress,可是若是咱們有上百個微服務的話,每次的修改涉及也都會比較多,感受就是不太靈活了,再去管理可能就以爲力不從心了,這只是一個問題,其實k8s缺乏一個更高級的應用級別的管理,若是咱們將這些yaml文件放在一個地方,基於一個應用層面的管理,那可能會更好了。node
使用這些yaml文件面臨着一個什麼樣的問題?
且因爲缺乏對發佈過的應用版本管理和控制,使Kubernetes上的應用維護和更新等面臨諸多的挑戰,主要面臨如下問題:
如何將這些服務做爲一個總體管理,其實咱們每次部署也針對這些yaml,而後apply 一下,而後也缺少了怎麼統一的管理
這些資源文件如何高效複用,其實咱們在部署的時候,模版的不少的類型都是同樣的,咱們怎麼去使用一套模版來發布多個應用呢,發佈的時候只須要簡單修改一下
不支持應用級別的版本管理,那麼這裏有不少的yaml,怎麼可能能夠去管理應用級別的呢,爲了解決這個問題,helm也就應運而生了。mysql
3.2 Helm 介紹
Helm是一個Kubernetes的包管理工具,就像Linux下的包管理器,如yum/apt等,能夠很方便的將以前打包好的yaml文件部署到kubernetes上。
好比像yum ,它主要解決一個依賴的問題,安裝yum的可能會有不少的yum去執行,這個helm就至關於一個yum的包管理器,它將直接按應用去安裝,這個helm也同樣。linux
Helm有三個重要概念:
helm:一個命令行客戶端工具,主要用於Kubernetes應用chart的建立、打包、發佈和管理。
Chart:應用描述,一系列用於描述 k8s 資源相關文件的集合。
Release:基於Chart的部署實體,一個 chart 被 Helm 運行後將會生成對應的一個 release;將在k8s中建立出真實運行的資源對象。nginx
3.3 Helm v3 變化
2019年11月13日, Helm團隊發佈 Helm v3的第一個穩定版本。
該版本主要變化以下:git
一、 架構變化
最明顯的變化是,簡單了不少,第一個變化就是,也是最明顯的,它把tiller以前做爲一個pod集羣中部署的它做爲一個服務端存在的,它主要接收helm客戶端發來的請求,發給API裏面,而後api去轉發,tiller還得須要單獨部署,而且還要受權,它能操做集羣的哪些命名空間,擁有哪些權限給刪除了。github
kubeconfig鏈接集羣的配置文件直接鏈接apiserver,以前呢是直接鏈接的API,由它作一個轉發,如今呢直接使用kubeconfig,kubectl都是使用kubeconfig來鏈接集羣的,因此helm直接鏈接kubeconfig,再鏈接apiserver,而後部署chart的包,那簡化了不少,而後v2版本部署一個Helm,還須要tiller還能正常的工做,如今v3版本就不須要了,只須要下載一個helm的客戶端工具就能夠了,首先這個部署已經簡化了不少,是更合理的,以前的權限管理也是很麻煩的,也是須要tiller去作權限管理,因此這個受權也是比較麻煩,感受加這個tiller也是多餘的東西,也是當時設計的緣由,附加了這麼一個tiller,這個也是一個無關緊要的東西,有了kubeconfig,就能夠直接經過原生的kubeconfig去完成了,因此也不必搞一個組件單獨去作這件事,好比受權,鏈接API,有一部分能夠再helm的客戶端去實現了,那這麼一來的話用helm就很簡單了,這也就是社區一個認識的轉變,真正的讓helm做爲一個好用的工具存在。web
二、Release名稱能夠在不一樣命名空間重用,以前這個都是tiller去維護的,好比部署一個web產生一個發行版,這個發行版這個名稱,不能跨命名空間去使用,只能用一個名字,好比default使用了一個web的名稱,在kube-system的命名空間下就不能用,主要是全局管理,在一個命名空間下存儲這個信息的,因此說是每一個命名空間下維護的信息,這個命名空間裏面不要重複。
三、支持將 Chart 推送至 Docker 鏡像倉庫中 ,也就是chart能夠推送到harbor倉庫上了,以前是有專門的存儲工具,也就是這個支持,能夠只用一個倉庫來存儲多個類型,好比經過harbor放咱們的鏡像還能存放咱們的chart的包管理工具
四、使用JSONSchema驗證chart values ,主要去驗證你使用values這個格式的變量的文件
五、其餘
1)爲了更好地協調其餘包管理者的措辭 Helm CLI個別改名
helm delete改名爲
helm uninstall
helm inspect改名爲
helm show
helm fetch改名爲
helm pull
但以上舊的命令當前仍能使用。
2)移除了用於本地臨時搭建 Chart Repository的 helm serve 命令。
3)自動建立名稱空間
在不存在的命名空間中建立發行版時,Helm 2建立了命名空間。Helm 3遵循其餘Kubernetes對象的行爲,若是命名空間不存在則返回錯誤。
4) 再也不須要requirements.yaml, 依賴關係是直接在chart.yaml中定義。
基本上就是v3版本的helm就是代碼基本上算是重構了spring
3.4 Helm客戶端
一、部署Helm客戶端
Helm客戶端下載地址:https://github.com/helm/helm/releases
解壓移動到/usr/bin/目錄便可。
wget https://get.helm.sh/helm-v3.0.0-linux-amd64.tar.gz
tar zxvf helm-v3.0.0-linux-amd64.tar.gz
mv linux-amd64/helm /usr/bin/
二、Helm經常使用命令
三、配置國內Chart倉庫
準備好客戶端工具以後,就要配置一下這個Chart的倉庫,chart就是一個應用的包
微軟倉庫(http://mirror.azure.cn/kubernetes/charts/)這個倉庫推薦使用,基本上官網有的chart這裏都有。
阿里雲倉庫(https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts )
官方倉庫(https://hub.kubeapps.com/charts/incubator)官方chart倉庫,國內有點很差使。
添加存儲庫:sql
helm repo add azure http://mirror.azure.cn/kubernetes/charts helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts helm repo update 更新
查看配置的存儲庫:
這裏也能夠添加多個倉庫,好比阿里雲,微軟的,均可以經過search會幫你列出來你倉庫全部的
[root@k8s-master1 ~]# helm repo list NAME URL stable http://mirror.azure.cn/kubernetes/charts [root@k8s-master1 ~]# helm search repo mysql
刪除存儲庫:helm repo remove aliyun
3.5 Helm基本使用
主要介紹三個命令:
chart install 安裝 chart update 升級 chart rollback 回滾
一、使用chart部署一個應用
查找chart:
helm search repo helm search repo mysql
爲何mariadb也在列表中?由於他和mysql有關。
查看chart信息:helm show chart azure/mysql
安裝包:db-1指定包的名稱(自定義)
[root@k8s-master1 ~]# helm install db-1 azure/mysql NAME: db-1 LAST DEPLOYED: Tue Dec 17 10:24:07 2019 NAMESPACE: default STATUS: deployed REVISION: 1 NOTES:
查看發佈狀態:
helm status db-1 列出release [root@k8s-master1 ~]# helm list NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION db-1 default 1 2019-12-17 10:24:07.593783822 +0800 CST deployed mysql-1.6.2 5.7.28
查看pod的部署狀態
[root@k8s-master1 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE db-1-mysql-765759d7d8-n65x6 0/1 Pending 0 3m47s
查看事件,這裏出現pending,檢測pod沒法運行的緣由,查看緣由這裏的pvc沒法綁定,說明沒有pv
[root@k8s-master1 ~]# kubectl describe pod db-1-mysql-765759d7d8-n65x6 Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling <unknown> default-scheduler pod has unbound immediate PersistentVolumeClaims (repeated 3 times) Warning FailedScheduling <unknown> default-scheduler pod has unbound immediate PersistentVolumeClaims (repeated 3 times)
查看pvc,這裏是沒有綁定成功,說明一直沒有找到合適的pv來綁定,只要幫它匹配上就能運行成功
[root@k8s-master1 ~]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE db-1-mysql Pending 7m54s
咱們給它去建立一個pv,來讓它自動去綁定,這裏我仍是用的nfs作的網絡存儲,建立好以後,查看pvc,會顯示綁定成功,查看pod的狀態
[root@k8s-master1 ~]# cat pv.yaml apiVersion: v1 kind: PersistentVolume metadata: name: pv0003 spec: capacity: storage: 8Gi accessModes: - ReadWriteOnce nfs: path: /opt/k8s/db server: 10.4.7.200 [root@k8s-master1 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE db-1-mysql-765759d7d8-n65x6 1/1 Running 0 24m
經過helm list查看部署的應用
[root@k8s-master1 ~]# helm list NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION db-1 default 1 2019-12-17 10:24:07.593783822 +0800 CST deployemysql-1.6.2 5.7.28
查看詳細信息,這裏面會告訴你怎麼鏈接mysql [root@k8s-master1 ~]# helm status db-1
這裏說生成一個隨機的密碼,將裏面的值拿出來進行生成
To get your root password run: MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace default db-1-mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)
這裏說經過這個命令去鏈接數據庫
Connect using the mysql cli, then provide your password: $ mysql -h db-1-mysql -p
先進入這個容器裏面,而後將它告訴的咱們去鏈接一下,測試並建立一個數據庫
[root@k8s-master1 ~]# kubectl exec -it db-1-mysql-765759d7d8-n65x6 /bin/bash root@db-1-mysql-765759d7d8-n65x6:/# mysql -h db-1-mysql -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 73 Server version: 5.7.28 MySQL Community Server (GPL) mysql> create database db; Query OK, 1 row affected (0.07 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | db | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.02 sec)
如今還有個問題,自己就有這個NFS自動供給,如今我想用本身的pv自動供給怎麼去實現?
因此就要去修改chart的配置選項了,由於有的須要一些依賴,好比剛纔的mysql有個pv的依賴,由於它不知道咱們使用的存儲類是哪一個,說白了就是安裝chart以前自定義配置選項,有兩種方法,第一種就是直接使用--values這個yaml去覆蓋它,剛纔咱們使用的helm show values azure/mysql,這個chart的中的values的yaml
咱們先將剛纔那個values下的文件重定向一個文件中
[root@k8s-master1 ~]# helm show values azure/mysql > volues.yaml [root@k8s-master1 ~]# cat volues.yaml mysqlRootPassword: testing mysqlUser: k8s mysqlPassword: k8s123 mysqlDatabase: k8s persistence: enabled: true storageClass: "managed-nfs-storage" accessMode: ReadWriteOnce size: 8Gi
這個存儲類以前我是建立好的,這裏不作演示,在values-yaml中去指定咱們的存儲類
[root@k8s-master1 ~]# kubectl get storageclass NAME PROVISIONER AGE managed-nfs-storage fuseim.pri/ifs 3d23h
咱們再建立一個數據庫根據咱們的values如今能夠直接綁定咱們的存儲類,直接建立pod了
[root@k8s-master1 ~]# helm install db-2 -f volues.yaml azure/mysql [root@k8s-master1 ~]# helm list NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION db-1 default 1 2019-12-17 10:24:07.593783822 +0800 CST deployed mysql-1.6.2 5.7.28 db-2 default 1 2019-12-17 11:37:31.852808375 +0800 CST deployed mysql-1.6.2 5.7.28 [root@k8s-master1 ~]# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE pv0003 8Gi RWO Retain Bound default/db-1-mysql 52m pvc-0baaf69a-0a3b-4d05-adb5-515057bda753 8Gi RWO Delete Bound default/db-2-mysql managed-nfs-storage 18s pvc-16725fa9-3fe5-4e87-a2f8-f3f1e7df56b3 16Gi RWO Delete Bound kube-system/prometheus-data-prometheus-0 managed-nfs-storage 3d23h pvc-30244364-8bcd-43af-b1a9-d36e044c83c4 1Gi RWO Delete Bound kube-system/grafana-data-grafana-0 managed-nfs-storage 3d23h [root@k8s-master1 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE db-1-mysql-765759d7d8-n65x6 1/1 Running 0 74m db-2-mysql-69dc64b75f-b2cxb 1/1 Running 0 59s
如今測試一下咱們的數據庫,咱們的密碼也是在values去中定義的,因此直接登陸,並能夠查看到咱們建立的數據庫
root@db-2-mysql-69dc64b75f-b2cxb:/# echo ${MYSQL_ROOT_PASSWORD} testing root@db-2-mysql-69dc64b75f-b2cxb:/# mysql -uroot -p${MYSQL_ROOT_PASSWORD} mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 52 Server version: 5.7.28 MySQL Community Server (GPL) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | k8s | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.06 sec)
查看用戶,已經建立k8s用戶
mysql> select user from mysql.user; +---------------+ | user | +---------------+ | k8s | | root | | mysql.session | | mysql.sys | | root | +---------------+ 5 rows in set (0.04 sec)
二、安裝前自定義chart配置選項
若是想對官方的chart進行使用就直接使用install了,有些必須依賴的也是提早去準備的,好比剛纔的pv
有兩種方式,保留一些修改的文件,而後引用這些配置文件,或者使用--set,在命令行進行替換變量
配置文件寫的也均可以在命令行去使用,而後也都運行了。
--values(或-f):指定帶有覆蓋的YAML文件。這能夠屢次指定,最右邊的文件優先
--set:在命令行上指定替代。若是二者都用,--set優先級高
[root@k8s-master1 ~]# helm install db-3 --set persistence.storageClass="managed-nfs-storage" azure/mysql [root@k8s-master1 ~]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE db-1-mysql Bound pv0003 8Gi RWO 4h13m db-2-mysql Bound pvc-0baaf69a-0a3b-4d05-adb5-515057bda753 8Gi RWO managed-nfs-storage 3h db-3-mysql Bound pvc-2bf895a8-075b-43d9-ade9-fe9b7ae67b1b 8Gi RWO managed-nfs-storage [root@k8s-master1 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE db-1-mysql-765759d7d8-n65x6 1/1 Running 0 4h13m db-2-mysql-69dc64b75f-b2cxb 1/1 Running 0 179m db-3-mysql-679888dd7b-9m5cm 1/1 Running 0 85s
或者你想關心這個官方的chart是怎麼寫的,你能夠直接pull下來,查看詳細信息[root@k8s-master1 ~]# helm pull azure/mysql --untar
這個拉下來是一個壓縮包,也能夠拉的時候直接解壓, --untar
這裏面values.yaml,剛纔咱們重定向出來的就是這個yaml,其餘的保持不變,在templates下就是部署mysql的所需的yaml,這樣你會發現部署一個chart的簡單了不少,並且我還能夠快速的啓動多套,部署多個這樣的pod,來動態的傳入參數,還能分生產環境,測試環境,只要你在values下面定義不一樣的命名空間,區分不一樣的生產環境和測試環境。
[root@k8s-master1 ~]# cd mysql [root@k8s-master1 mysql]# ls Chart.yaml README.md templates values.yaml
並且該helm install命令能夠從多個來源安裝:
chart存儲庫 本地chart存檔(helm install foo-0.1.1.tgz)或者在它官方剛纔咱們拉的mysql那個包,直接用helm install mysql-1.5.0.gz chart目錄(helm install path/to/foo) 完整的URL(helm install https://example.com/charts/foo-1.2.3.tgz)或者你一個url的地址
三、構建一個Helm Chart
一個chart是怎麼組成的 create + 自定義名稱(目錄結構)
[root@k8s-master1 test-helm]# helm create chart Creating chart [root@k8s-master1 test-helm]# ls chart [root@k8s-master1 test-helm]# cd chart/ [root@k8s-master1 chart]# ls charts Chart.yaml templates values.yaml
啓動剛纔咱們的chart,而且起一下pod自定義名稱 helm install 名稱 剛纔的配置目錄下
[root@k8s-master1 test-helm]# helm install my-chart chart/ NAME: my-chart LAST DEPLOYED: Tue Dec 17 15:09:10 2019 NAMESPACE: default STATUS: deployed REVISION: 1 NOTES: 1. Get the application URL by running these commands: export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=chart,app.kubernetes.io/instance=my-chart" -o jsonpath="{.items[0].metadata.name}") echo "Visit http://127.0.0.1:8080 to use your application" kubectl --namespace default port-forward $POD_NAME 8080:80
來看一下咱們這個啓動的pod是一個什麼服務,這個默認的就是官方的一個模版,在values下面能夠看出它獲取的image是nginx
[root@k8s-master1 test-helm]# kubectl get pod -o wide my-chart-94997cb67-c2zxx 1/1 Running 0 10m 10.244.0.43 k8s-node2 <none> <none> [root@k8s-master1 chart]# curl -I 10.244.0.43 HTTP/1.1 200 OK Server: nginx/1.16.0 Date: Tue, 17 Dec 2019 07:22:57 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Tue, 23 Apr 2019 10:18:21 GMT Connection: keep-alive ETag: "5cbee66d-264" Accept-Ranges: bytes [root@k8s-master1 chart]# helm list NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION db-1 default 1 2019-12-17 10:24:07.593783822 +0800 CST deployed mysql-1.6.2 5.7.28 db-2 default 1 2019-12-17 11:37:31.852808375 +0800 CST deployed mysql-1.6.2 5.7.28 db-3 default 1 2019-12-17 14:36:00.445305589 +0800 CST deployed mysql-1.6.2 5.7.28 my-chart default 1 2019-12-17 15:09:10.164272986 +0800 CST deployed chart-0.1.0 1.16.0
看一下這個文件的目錄結構
[root@k8s-master1 test-helm]# tree . . └── chart ├── charts ├── Chart.yaml ├── templates │ ├── deployment.yaml │ ├── _helpers.tpl │ ├── ingress.yaml │ ├── NOTES.txt │ ├── serviceaccount.yaml │ ├── service.yaml │ └── tests │ └── test-connection.yaml └── values.yaml 4 directories, 9 files
Chart.yaml:用於描述這個 Chart的基本信息,包括名字、描述信息以及版本等。
values.yaml :用於存儲 templates 目錄中模板文件中用到變量的值。
Templates: 目錄裏面存放全部yaml模板文件。
charts:目錄裏存放這個chart依賴的全部子chart。
NOTES.txt :用於介紹Chart幫助信息, helm install 部署後展現給用戶。例如:如何使用這個 Chart、列出缺省的設置等。
_helpers.tpl:放置模板助手的地方,能夠在整個 chart 中重複使用
如今咱們本身製做一個chart的模版,發佈簡單的微服務類型的發佈
[root@k8s-master1 chart]# tree . . ├── charts ├── Chart.yaml ├── templates └── values.yaml
建立一個新的deployment類型的pod,鏡像爲nginx
[root@k8s-master1 templates]# kubectl create deployment app-1 --image=nginx -o yaml --dry-run > deployment.yaml [root@k8s-master1 templates]# ls deployment.yaml
將yaml中一些不須要使用的字段空值進行刪除
咱們修改一下這個yaml,先簡單的去使用values的變量賦值的渲染,而後發佈兩個微服務,使用nginx的鏡像作一個小實例,後續將一個完整的微服務(dubbo,spring cloud的應用進行發佈)
[root@k8s-master1 chart]# cat templates/deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: {{ .Values.name }} name: {{ .Values.name }} spec: replicas: {{ .Values.replicas }} selector: matchLabels: app: {{ .Values.name }} template: metadata: labels: app: {{ .Values.name }} spec: containers: - image: {{ .Values.image }}:{{ .Values.imageTag }} name: {{ .Values.image }}
當咱們去發佈一個微服務的時候,它會去調用咱們上層values的模版的變量進行對咱們發佈應用的yaml進行渲染,helm的好處就在這裏,在k8s原生的yaml中去發佈一個服務,yaml自己的格式不支持變量的注入,因此helm也就應運而生了,主要就是解決這個問題,並且咱們去發佈多個任務直接經過這個模版將一些變更的值都寫進去,發佈任務也會很快,節省咱們的時間。
[root@k8s-master1 chart]# cat .//values.yaml name: base-user-devops image: nginx imageTag: 1.15 replicas: 2 [root@k8s-master1 ~]# kubectl get pod NAME READY STATUS RESTARTS AGE base-user-common-58b7bc9c56-2nmcb 1/1 Running 0 12m base-user-common-58b7bc9c56-2tgpg 1/1 Running 0 12m base-user-devops-7cf5c99485-rr295 1/1 Running 0 10m base-user-devops-7cf5c99485-s2jbb 1/1 Running 0 10m [root@k8s-master1 test-helm]# helm list NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION base-user-common default 1 2019-12-17 16:29:01.587768045 +0800 CST deployed chart-0.1.0 1.16.0 base-user-devops default 1 2019-12-17 16:27:11.757082258 +0800 CST deployed chart-0.1.0 1
查看咱們渲染以後的效果是什麼樣的,咱們的變量已經賦值到咱們的yaml中,而後幫咱們將pod啓動起來
[root@k8s-master1 test-helm]# helm get manifest base-user-common --- Source: chart/templates/deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: labels: app: base-user-common name: base-user-common spec: replicas: 2 selector: matchLabels: app: base-user-common template: metadata: labels: app: base-user-common spec: containers: - image: nginx:1.16 name: nginx
四、升級、回滾和刪除
發佈新版本的chart時,或者當您要更改發佈的配置時,可使用該helm upgrade 命令
好比將咱們的base-user-common這個服務的鏡像換成其餘的鏡像,由於咱們的微服務其實在發佈的過程當中,因爲開發的代碼的修改都會進行從新的構建,經過dockerfile,那麼其實這裏的道理也是同樣的,當咱們去發佈一個新的服務就須要去替換咱們舊代碼的鏡像,這裏其實舊能夠去指定爲咱們新的鏡像。[root@k8s-master1 test-helm]# vim chart/values.yaml
進行對鏡像修改成1.15,而後進行更新,使用upgrade指定咱們微服務的名稱這個名稱根據項目去定義,微服務自己就是一個拆分的一個機構的組成的分子,這個就按本身去定義,而後指定這個chart模版目錄
[root@k8s-master1 test-helm]# helm upgrade base-user-common chart/ Release "base-user-common" has been upgraded. Happy Helming! NAME: base-user-common LAST DEPLOYED: Tue Dec 17 16:47:55 2019 NAMESPACE: default STATUS: deployed REVISION: 2 TEST SUITE: None
測試查看已經將鏡像成功替換爲1.15版本
[root@k8s-master1 test-helm]# curl -I 10.244.2.24 HTTP/1.1 200 OK Server: nginx/1.15.12 Date: Tue, 17 Dec 2019 08:48:34 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Tue, 16 Apr 2019 13:08:19 GMT Connection: keep-alive ETag: "5cb5d3c3-264" Accept-Ranges: bytes
例如將應用回滾到第一個版本,如今又回到1.16這個鏡像了
[root@k8s-master1 ~]# helm rollback base-user-common Rollback was a success! Happy Helming! [root@k8s-master1 ~]# curl -I 10.244.1.20 HTTP/1.1 200 OK Server: nginx/1.16.1 Date: Tue, 17 Dec 2019 09:44:44 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Tue, 13 Aug 2019 10:05:00 GMT Connection: keep-alive ETag: "5d528b4c-264" Accept-Ranges: bytes
也能夠查看歷史的版本
[root@k8s-master1 chart]# helm history base-user-common REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION 1 Tue Dec 17 16:29:01 2019 superseded chart-0.1.0 1.16.0 Install complete 2 Tue Dec 17 16:47:55 2019 superseded chart-0.1.0 1.16.0 Upgrade complete 3 Tue Dec 17 17:43:23 2019 deployed chart-0.1.0 1.16.0 Rollback to 1
也能夠打包推送的charts倉庫共享別人使用[root@k8s-master1 test-helm]# helm package chart
卸載發行版使用helm uninstall或者helm delete,這樣的話也會將pod也會刪除
[root@k8s-master1 test-helm]# helm uninstall base-user-common release "base-user-common" uninstalled