溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

k8s原生微服務(wù)管理工具helm-v3的使用初探實踐(1)

發(fā)布時間:2020-09-12 17:14:03 來源:網(wǎng)絡(luò) 閱讀:1562 作者:wx5c1cfd6e22842 欄目:系統(tǒng)運維

Helm-v3應(yīng)用包管理器

3.1 為什么需要Helm?
K8S上的應(yīng)用對象,都是由特定的資源描述組成,包括deployment、service等。都保存各自文件中或者集中寫到一個配置文件。然后kubectl apply –f 部署。

為什么使用helm?
在k8s中,當(dāng)我們?nèi)ゲ渴饝?yīng)用的時候,一般都是使用yaml文件去管理我們的應(yīng)用的發(fā)布,比如像微服務(wù),其中包括deployment,service,configmap,ingress,但是如果我們有上百個微服務(wù)的話,每次的修改涉及也都會比較多,感覺就是不太靈活了,再去管理可能就覺得力不從心了,這只是一個問題,其實k8s缺少一個更高級的應(yīng)用級別的管理,如果我們將這些yaml文件放在一個地方,基于一個應(yīng)用層面的管理,那可能會更好了。

使用這些yaml文件面臨著一個什么樣的問題?
且由于缺少對發(fā)布過的應(yīng)用版本管理和控制,使Kubernetes上的應(yīng)用維護和更新等面臨諸多的挑戰(zhàn),主要面臨以下問題:
如何將這些服務(wù)作為一個整體管理,其實我們每次部署也針對這些yaml,然后apply 一下,然后也缺乏了怎么統(tǒng)一的管理
這些資源文件如何高效復(fù)用,其實我們在部署的時候,模版的很多的類型都是一樣的,我們怎么去使用一套模版來發(fā)布多個應(yīng)用呢,發(fā)布的時候只需要簡單修改一下
不支持應(yīng)用級別的版本管理,那么這里有很多的yaml,怎么可能可以去管理應(yīng)用級別的呢,為了解決這個問題,helm也就應(yīng)運而生了。

3.2 Helm 介紹
Helm是一個Kubernetes的包管理工具,就像Linux下的包管理器,如yum/apt等,可以很方便的將之前打包好的yaml文件部署到kubernetes上。
比如像yum ,它主要解決一個依賴的問題,安裝yum的可能會有很多的yum去執(zhí)行,這個helm就相當(dāng)于一個yum的包管理器,它將直接按應(yīng)用去安裝,這個helm也一樣。

Helm有三個重要概念:
helm:一個命令行客戶端工具,主要用于Kubernetes應(yīng)用chart的創(chuàng)建、打包、發(fā)布和管理。
Chart:應(yīng)用描述,一系列用于描述 k8s 資源相關(guān)文件的集合。
Release:基于Chart的部署實體,一個 chart 被 Helm 運行后將會生成對應(yīng)的一個 release;將在k8s中創(chuàng)建出真實運行的資源對象。

3.3 Helm v3 變化
2019年11月13日, Helm團隊發(fā)布 Helm v3的第一個穩(wěn)定版本。
該版本主要變化如下:

1、 架構(gòu)變化
最明顯的變化是,簡單了很多,第一個變化就是,也是最明顯的,它把tiller之前作為一個pod集群中部署的它作為一個服務(wù)端存在的,它主要接收helm客戶端發(fā)來的請求,發(fā)給API里面,然后api去轉(zhuǎn)發(fā),tiller還得需要單獨部署,并且還要授權(quán),它能操作集群的哪些命名空間,擁有哪些權(quán)限給刪除了。

kubeconfig連接集群的配置文件直接連接apiserver,之前呢是直接連接的API,由它做一個轉(zhuǎn)發(fā),現(xiàn)在呢直接使用kubeconfig,kubectl都是使用kubeconfig來連接集群的,所以helm直接連接kubeconfig,再連接apiserver,然后部署chart的包,那簡化了很多,然后v2版本部署一個Helm,還需要tiller還能正常的工作,現(xiàn)在v3版本就不需要了,只需要下載一個helm的客戶端工具就可以了,首先這個部署已經(jīng)簡化了很多,是更合理的,之前的權(quán)限管理也是很麻煩的,也是需要tiller去做權(quán)限管理,所以這個授權(quán)也是比較麻煩,感覺加這個tiller也是多余的東西,也是當(dāng)時設(shè)計的原因,附加了這么一個tiller,這個也是一個可有可無的東西,有了kubeconfig,就可以直接通過原生的kubeconfig去完成了,所以也沒必要搞一個組件單獨去做這件事,比如授權(quán),連接API,有一部分可以再helm的客戶端去實現(xiàn)了,那這么一來的話用helm就很簡單了,這也就是社區(qū)一個認識的轉(zhuǎn)變,真正的讓helm作為一個好用的工具存在。

k8s原生微服務(wù)管理工具helm-v3的使用初探實踐(1)
2、Release名稱可以在不同命名空間重用,之前這個都是tiller去維護的,比如部署一個web產(chǎn)生一個發(fā)行版,這個發(fā)行版這個名稱,不能跨命名空間去使用,只能用一個名字,比如default使用了一個web的名稱,在kube-system的命名空間下就不能用,主要是全局管理,在一個命名空間下存儲這個信息的,所以說是每個命名空間下維護的信息,這個命名空間里面不要重復(fù)。
3、支持將 Chart 推送至 Docker 鏡像倉庫中 ,也就是chart可以推送到harbor倉庫上了,之前是有專門的存儲工具,也就是這個支持,可以只用一個倉庫來存儲多個類型,比如通過harbor放我們的鏡像還能存放我們的chart的包管理工具
4、使用JSONSchema驗證chart values ,主要去驗證你使用values這個格式的變量的文件
5、其他
1)為了更好地協(xié)調(diào)其他包管理者的措辭 Helm CLI個別更名
helm delete更名為helm uninstall
helm inspect更名為helm show
helm fetch更名為helm pull
但以上舊的命令當(dāng)前仍能使用。
2)移除了用于本地臨時搭建 Chart Repository的 helm serve 命令。
3)自動創(chuàng)建名稱空間
在不存在的命名空間中創(chuàng)建發(fā)行版時,Helm 2創(chuàng)建了命名空間。Helm 3遵循其他Kubernetes對象的行為,如果命名空間不存在則返回錯誤。
4) 不再需要requirements.yaml, 依賴關(guān)系是直接在chart.yaml中定義。
基本上就是v3版本的helm就是代碼基本上算是重構(gòu)了

3.4 Helm客戶端
1、部署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/
2、Helm常用命令
k8s原生微服務(wù)管理工具helm-v3的使用初探實踐(1)
3、配置國內(nèi)Chart倉庫
準(zhǔn)備好客戶端工具之后,就要配置一下這個Chart的倉庫,chart就是一個應(yīng)用的包
微軟倉庫(http://mirror.azure.cn/kubernetes/charts/)這個倉庫推薦使用,基本上官網(wǎng)有的chart這里都有。
阿里云倉庫(https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts )
官方倉庫(https://hub.kubeapps.com/charts/incubator)官方chart倉庫,國內(nèi)有點不好使。
添加存儲庫:

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   回滾

1、使用chart部署一個應(yīng)用
查找chart:

helm search repo
helm search repo mysql

為什么mariadb也在列表中?因為他和mysql有關(guān)。
查看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:

查看發(fā)布狀態(tài):

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的部署狀態(tài)

[root@k8s-master1 ~]# kubectl get pod
NAME                                      READY   STATUS    RESTARTS   AGE
db-1-mysql-765759d7d8-n65x6               0/1     Pending   0          3m47s

查看事件,這里出現(xiàn)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

我們給它去創(chuàng)建一個pv,來讓它自動去綁定,這里我還是用的nfs做的網(wǎng)絡(luò)存儲,創(chuàng)建好之后,查看pvc,會顯示綁定成功,查看pod的狀態(tài)

[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查看部署的應(yīng)用

[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)

這里說通過這個命令去連接數(shù)據(jù)庫

Connect using the mysql cli, then provide your password:
    $ mysql -h db-1-mysql -p

先進入這個容器里面,然后將它告訴的我們?nèi)ミB接一下,測試并創(chuàng)建一個數(shù)據(jù)庫

[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)

現(xiàn)在還有個問題,本身就有這個NFS自動供給,現(xiàn)在我想用自己的pv自動供給怎么去實現(xiàn)?
所以就要去修改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

這個存儲類之前我是創(chuàng)建好的,這里不做演示,在values-yaml中去指定我們的存儲類

[root@k8s-master1 ~]# kubectl get storageclass
NAME                  PROVISIONER      AGE
managed-nfs-storage   fuseim.pri/ifs   3d23h

我們再創(chuàng)建一個數(shù)據(jù)庫根據(jù)我們的values現(xiàn)在可以直接綁定我們的存儲類,直接創(chuàng)建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

現(xiàn)在測試一下我們的數(shù)據(jù)庫,我們的密碼也是在values去中定義的,所以直接登錄,并可以查看到我們創(chuàng)建的數(shù)據(jù)庫

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)

查看用戶,已經(jīng)創(chuàng)建k8s用戶

mysql> select user from mysql.user;
+---------------+
| user          |
+---------------+
| k8s           |
| root          |
| mysql.session |
| mysql.sys     |
| root          |
+---------------+
5 rows in set (0.04 sec)

2、安裝前自定義chart配置選項

如果想對官方的chart進行使用就直接使用install了,有些必須依賴的也是提前去準(zhǔn)備的,比如剛才的pv
有兩種方式,保留一些修改的文件,然后引用這些配置文件,或者使用--set,在命令行進行替換變量
配置文件寫的也都可以在命令行去使用,然后也都運行了。
--values(或-f):指定帶有覆蓋的YAML文件。這可以多次指定,最右邊的文件優(yōu)先
--set:在命令行上指定替代。如果兩者都用,--set優(yōu)先級高

[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                                  4h23m
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          4h23m
db-2-mysql-69dc64b75f-b2cxb               1/1     Running   0          179m
db-3-mysql-679888dd7b-9m5cm               1/1     Running   0          85s

或者你想關(guān)心這個官方的chart是怎么寫的,你可以直接pull下來,查看詳細信息
[root@k8s-master1 ~]# helm pull azure/mysql --untar

這個拉下來是一個壓縮包,也可以拉的時候直接解壓, --untar
這里面values.yaml,剛才我們重定向出來的就是這個yaml,其他的保持不變,在templates下就是部署mysql的所需的yaml,這樣你會發(fā)現(xiàn)部署一個chart的簡單了很多,而且我還可以快速的啟動多套,部署多個這樣的pod,來動態(tài)的傳入?yún)?shù),還能分生產(chǎn)環(huán)境,測試環(huán)境,只要你在values下面定義不同的命名空間,區(qū)分不同的生產(chǎn)環(huán)境和測試環(huán)境。

[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的地址

3、構(gòu)建一個Helm Chart
一個chart是怎么組成的 create + 自定義名稱(目錄結(jié)構(gòu))

[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是一個什么服務(wù),這個默認的就是官方的一個模版,在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 

看一下這個文件的目錄結(jié)構(gòu)

[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、列出缺省的設(shè)置等。
_helpers.tpl:放置模板助手的地方,可以在整個 chart 中重復(fù)使用

現(xiàn)在我們自己制作一個chart的模版,發(fā)布簡單的微服務(wù)類型的發(fā)布

[root@k8s-master1 chart]# tree .
.
├── charts
├── Chart.yaml
├── templates
└── values.yaml

創(chuàng)建一個新的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的變量賦值的渲染,然后發(fā)布兩個微服務(wù),使用nginx的鏡像做一個小實例,后續(xù)將一個完整的微服務(wù)(dubbo,spring cloud的應(yīng)用進行發(fā)布)

[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 }}

當(dāng)我們?nèi)グl(fā)布一個微服務(wù)的時候,它會去調(diào)用我們上層values的模版的變量進行對我們發(fā)布應(yīng)用的yaml進行渲染,helm的好處就在這里,在k8s原生的yaml中去發(fā)布一個服務(wù),yaml本身的格式不支持變量的注入,所以helm也就應(yīng)運而生了,主要就是解決這個問題,而且我們?nèi)グl(fā)布多個任務(wù)直接通過這個模版將一些變動的值都寫進去,發(fā)布任務(wù)也會很快,節(jié)省我們的時間。

[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

查看我們渲染之后的效果是什么樣的,我們的變量已經(jīng)賦值到我們的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

4、升級、回滾和刪除
發(fā)布新版本的chart時,或者當(dāng)您要更改發(fā)布的配置時,可以使用該helm upgrade 命令

比如將我們的base-user-common這個服務(wù)的鏡像換成其他的鏡像,因為我們的微服務(wù)其實在發(fā)布的過程中,由于開發(fā)的代碼的修改都會進行重新的構(gòu)建,通過dockerfile,那么其實這里的道理也是一樣的,當(dāng)我們?nèi)グl(fā)布一個新的服務(wù)就需要去替換我們舊代碼的鏡像,這里其實舊可以去指定為我們新的鏡像。
[root@k8s-master1 test-helm]# vim chart/values.yaml
進行對鏡像修改為1.15,然后進行更新,使用upgrade指定我們微服務(wù)的名稱這個名稱根據(jù)項目去定義,微服務(wù)本身就是一個拆分的一個機構(gòu)的組成的分子,這個就按自己去定義,然后指定這個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

測試查看已經(jīng)將鏡像成功替換為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

例如將應(yīng)用回滾到第一個版本,現(xiàn)在又回到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
卸載發(fā)行版使用helm uninstall或者helm delete,這樣的話也會將pod也會刪除

[root@k8s-master1 test-helm]# helm uninstall base-user-common
release "base-user-common" uninstalled
向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI