K8s当中部署应用都是特定的资源组成的,这些资源可以独立于某个文件或者写到一个文件当中

为什么需要Helm


由于Kubernetes缺少对发布的应用版本管理和控制,使得部署的应用维护和更新等面临诸多的挑战,主要面临以下问题:

• 如何将这些服务作为一个整体管理?

• 这些资源文件如何高效复用?

• 不支持应用级别的版本管理

上面这种部署方式适用于服务比较少,数量比较少,不是很复杂的应用。

如何将这些服务作为一个整体管理?


K8s缺少对应用级别的管理和控制,现在做任何事情都是基于单个yml,比如修改service就打开一个文件对里面的内容进行修改。修改deployment也一样。

我们要怎么统一的管理,配置,更新这些分散的yml文件,例如怎么一键式的部署应用,上线,升级,回滚,下线。

下面是对deploy的回滚,但是这种命令是针对单个deploy完成的,不支持整个应用的回滚,这里的应用可以理解为这里涉及的所有的yml,回滚只是对deploy回滚,并不会对service等资源回滚。

Helm是一个Kubernetes的包管理工具,就像Linux下的包管理器,如yum/apt等,可以很方便的将之前打包好的yaml文件部署到kubernetes上。(就像一个模板一样,改变不同应用差异化的地方,通过传参的形式,动态的去覆盖它就可以适配多个应用的部署)

Helm有3个重要概念:

• helm:一个命令行客户端工具,主要用于Kubernetes应用chart的创建、打包、发布和管理。

• Chart:应用描述,一系列用于描述 k8s 资源相关文件的集合。(将yml组织起来)

• Release:基于Chart的部署实体,一个 chart 被 Helm 运行后将会生成对应的一个 release,将在k8s中创建出真实运行的资源对象

简而言之的好处是一个应用包可以在多个地方部署,可以部署多个应用就像一个模板一样.,只需要修改有差异的地方就行,通过传参数的形式动态修改。

Helm介绍


Helm目前有两个大版本:v2和v3

2019年11月Helm团队发布v3版本,相比v2版本最大变化是将Tiller删除,并大部分代码重构。

v2 写chart使用helm客户端部署,通过GRPC调用连接到tiller这个服务,这个服务又去连接k8s的api,然后完成相关yml的部署(需要配置rbac的权限,主要是在heml这块)

v3 和kubectl命令行一样,直接走的是kubeconfig的配置文件,直接连到apiserver去部署

使用helm很简单,你只需要下载一个二进制客户端包即可,会通过kubeconfig配置(通常$HOME/.kube/config)来连接Kubernetes。

下载Helm客户端:

wget https://get.helm.sh/helm-v3.2.4-linux-amd64.tar.gz
tar zxvf helm-v3.2.4-linux-amd64.tar.gz
mv linux-amd64/helm /usr/bin/[root@k8s-master ~]# tar xf helm-v3.2.4-linux-amd64.tar.gz
[root@k8s-master ~]# mv linux-amd64/helm /usr/bin/

Helm客户端


Helm管理应用生命周期


• helm create 制作Chart

• helm install 部署

• helm upgrade 更新

• helm rollback 回滚

• helm uninstall 卸载

Helm通过chart抽象的概念就将这些yml组织在一起了,包括后面所有的操作都是基于chart去完成的,不再只是单独的文件

Helm基本使用:制作Chart


创建chart:helm create mychart  会生成chart模板的目录结构,在上面完善修改

打包chart:helm package mychart

• Chart.yaml:用于描述这个 Chart的基本信息,包括名字、描述信息以及版本等。

[root@node1 nginxchart]# cat Chart.yaml
apiVersion: v2
name: nginxchart
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: 1.16.0

• values.yaml :用于存储 templates 目录中模板文件中用到变量的值。(变量文件)

• charts:目录里存放这个chart依赖的所有子chart。

Templates: 目录里面存放所有yaml模板文件。

• NOTES.txt :用于介绍Chart帮助信息, helm install 部署后展示给用户。

例如:如何使用这个 Chart、列出缺省的设置等。

• _helpers.tpl:放置模板的地方,可以在整个 chart 中重复使用。

[root@k8s-master ~]# helm create mychart
Creating mychart
[root@k8s-master mychart]# ls
charts  Chart.yaml  templates  values.yaml
这是默认的几个目录

部署应用

[root@k8s-master ~]# helm install web  mychart/
NAME: web
LAST DEPLOYED: Wed Mar 10 15:22:40 2021
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=mychart,app.kubernetes.io/instance=web" -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这些输出就是这个文件的输出
[root@k8s-master ~]# cat mychart/templates/NOTES.txt 

查看发布的状态

[root@k8s-master ~]# helm list
NAME    NAMESPACE   REVISION    UPDATED                                 STATUS      CHART           APP VERSION
web     default     1           2020-12-10 22:50:12.791974185 +0800 CST    deployed    mychart-0.1.0   1.16.0  

应用卸载

[root@k8s-master ~]# helm uninstall web
release "web" uninstalled
[root@k8s-master ~]# helm list
NAME    NAMESPACE   REVISION    UPDATED STATUS  CHART   APP VERSION

获取详细的信息

[root@k8s-master ~]# helm status web
NAME: web
LAST DEPLOYED: Wed Jan 20 16:04:07 2021
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=mychart,app.kubernetes.io/instance=web" -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

使用Chart升级应用有两种方法


• --values,-f:指定YAML文件覆盖值

• --set:在命令行上指定覆盖值

注:如果一起使用,--set优先级高

--values的方式就是要覆盖values.yml里面的内容

这里面只需要写需要覆盖的字段,这个文件可以放在任意目录下,升级需要指定release的名称,这个意思就是将values里面的值覆盖mychat里面values里面的值

-set:在命令行上指定覆盖值

[root@k8s-master ~]# vim values.yml
[root@k8s-master ~]# cat values.yml
image:repository: nginxtag: "1.17"
[root@k8s-master ~]# helm upgrade -f values.yml web mychart/
Release "web" has been upgraded. Happy Helming!
NAME: web
LAST DEPLOYED: Thu Jan 21 23:10:15 2021
NAMESPACE: default
STATUS: deployed
REVISION: 2
NOTES:
1. Get the application URL by running these commands:export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=mychart,app.kubernetes.io/instance=web" -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
[root@k8s-master ~]# helm list
NAME    NAMESPACE   REVISION    UPDATED                                 STATUS     CHART            APP VERSION
web     default     2           2021-01-21 23:10:15.847583253 +0800 CST    deployed   mychart-0.1.0    1.16.0  [root@k8s-master ~]# kubectl get rs
NAME                     DESIRED   CURRENT   READY   AGE
web-mychart-5b58c47cd6   0         0         0       16m
web-mychart-84d9764bd5   1         1         1       6m31s

这里看到是2,因为每次升级都会加1,这里就相当于发布版本号,可以针对其版本号去回滚

上面是对镜像的升级,其他参数的升级也是一样,可以看到升级成功

这就是通过-f指定一个文件去覆盖里面已有的变量的值从而做到升级

--values,-f:指定YAML文件覆盖值

第二种方式是在命令行指定--set对版本去进行升级,这个要参照values的值去写,而不是乱写,可以看到是有层级关系,层级关系使用的话就是使用set以点的方式去引用

[root@k8s-master mychart]# cat values.yaml
image:repository: nginxpullPolicy: IfNotPresent# Overrides the image tag whose default is the chart appVersion.tag: ""
image.repository去改镜像名称
Image.tag 修改版本
[root@k8s-master ~]# helm upgrade --set image.tag=1.18 web mychart/
Release "web" has been upgraded. Happy Helming!
NAME: web
LAST DEPLOYED: Thu Jan 21 23:30:59 2021
NAMESPACE: default
STATUS: deployed
REVISION: 3
NOTES:
1. Get the application URL by running these commands:export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=mychart,app.kubernetes.io/instance=web" -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

上面下来你可以看到:

  • Helm命令行是对相关应用的部署的操作,操作对象就是我们创建的chart包,不管是安装还是升级都要带着chart包,这是helm和chart的关系
  • Chart包里面是有其目录组织的关系,在目录里面通过类似于变量引用的方式
  • 内置的机制就是通过变量引用渲染这个模板,渲染之后在k8s去运行
[root@k8s-master mychart]# ls
charts  Chart.yaml  templates  values.yaml

变量通过两种方式去更新,也就是覆盖,覆盖的目的是可以将部署多个应用差异化的地方,通过变量的方式去配置。

到后面就可以部署多个应用差异化的时候去完成默认值的覆盖,从而实现部署多个应用,其实可以对其里面的任意参数进行升级。

假如你的应用出问题了需要对其回滚,那么可以使用rollback进行回滚

默认就是帮你回滚到了上一个版本

[root@k8s-master ~]# helm list
NAME    NAMESPACE   REVISION    UPDATED                                 STATUS      CHART           APP VERSION
web     default     3           2021-01-21 23:30:59.144427304 +0800 CST    deployed    mychart-0.1.0   1.16.0
[root@k8s-master ~]# helm rollback web
Rollback was a success! Happy Helming![root@k8s-master ~]# helm history web
REVISION    UPDATED                     STATUS      CHART           APP VERSION DESCRIPTION
1           Wed Jan 20 16:04:07 2021    superseded  mychart-0.1.0   1.16.0      Install complete
2           Thu Jan 21 23:10:15 2021    superseded  mychart-0.1.0   1.16.0      Upgrade complete
3           Thu Jan 21 23:30:59 2021    superseded  mychart-0.1.0   1.16.0      Upgrade complete
4           Thu Jan 21 23:48:25 2021    deployed    mychart-0.1.0   1.16.0      Rollback to 2  

如果你想要查看之前版本部署的信息

[root@k8s-master ~]# helm get all web --revision 1

指定回滚到指定版本

[root@k8s-master ~]# helm rollback web 1

安装local-static-provisioner


* 安装`local-static-provisioner`#下载git clone https://github.com/kubernetes-sigs/sig-storage-local-static-provisioner.gitcd sig-storage-local-static-provisioner#修改以下配置vi helm/provisioner/values.yaml66 classes:67 - name: fast-disks70   hostDir: /data/pgdata76   volumeMode: Filesystem81   fsType: xfs116   image: quay.io/external_storage/local-volume-provisioner:v2.4.0#安装helm install localprovi . -n kube-system#检查pod及pv状态kubectl get po -n kube-system -l app.kubernetes.io/name=provisionerNAME                           READY   STATUS    RESTARTS   AGElocalprovi-provisioner-h4sc4   1/1     Running   0          5h39mlocalprovi-provisioner-mkl2t   1/1     Running   0          5h39mlocalprovi-provisioner-vf274   1/1     Running   0          5h39m```

Chart模板的复用


[root@k8s-master ~]# helm install web2 mychart
NAME: web2
LAST DEPLOYED: Fri Jan 22 00:00:49 2021
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=mychart,app.kubernetes.io/instance=web2" -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
[root@k8s-master ~]# helm list
NAME    NAMESPACE   REVISION    UPDATED                                 STATUS      CHART           APP VERSION
web     default     4           2021-01-21 23:48:25.024165124 +0800 CST    deployed    mychart-0.1.0   1.16.0
web2    default     1           2021-01-22 00:00:49.666441668 +0800 CST    deployed    mychart-0.1.0   1.16.0 

这个相当于使用一个镜像启动多个容器一样

[root@k8s-master ~]# helm install web3 --set image.repository=httpd --set image.tag=latest  mychart
NAME: web3
LAST DEPLOYED: Fri Jan 22 00:05:22 2021
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=mychart,app.kubernetes.io/instance=web3" -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
[root@k8s-master ~]# helm list
NAME    NAMESPACE   REVISION    UPDATED                                 STATUS      CHART           APP VERSION
web     default     4           2021-01-21 23:48:25.024165124 +0800 CST    deployed    mychart-0.1.0   1.16.0
web2    default     1           2021-01-22 00:00:49.666441668 +0800 CST    deployed    mychart-0.1.0   1.16.0
web3    default     1           2021-01-22 00:05:22.335360998 +0800 CST    deployed    mychart-0.1.0   1.16.0

可以看到一个模板部署多个应用,通过变量的方式去覆盖

[root@k8s-master ~]# helm uninstall web
release "web" uninstalled[root@k8s-master ~]# helm uninstall web2
release "web2" uninstalled[root@k8s-master ~]# helm uninstall web3
release "web3" uninstalled[root@k8s-master ~]# helm list
NAME    NAMESPACE   REVISION    UPDATED STATUS  CHART   APP VERSION

当使用helm的时候就会将里面的yml清单与values里面的值做一个整合,整合之后就相当于动态渲染之后的结果,动态差异化的地方写到values里面。

Kubernetes 应用包管理器 Helm 对应用进行管理相关推荐

  1. Android布局管理器-使用TableLayout表格布局管理器实现简单的用户登录页面

    场景 Android布局管理器-使用FrameLayout帧布局管理器显示层叠的正方形以及前景照片: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article ...

  2. java中布局管理器flowlayout_JAVA基础:FlowLayout布局管理器

    在前面的例子中,使用到了FlowLayout布局管理器.FlowLayout型布局管理器对容器中组件进行布局的方式是将组件逐个地安放在容器中的一行上.一行放满后就另起一个新行. FlowLayout有 ...

  3. 云原生之深入解析Kubernetes应用包管理器Helm的保姆级教程和实战

    一.Helm 简介 ① 什么是 Helm? 我们可以将 Helm 看作 Kubernetes 下的 apt-get/yum,Helm 是 kubernetes 的包管理器,Helm 仓库里面只有配置清 ...

  4. Linux软件管理器(如何使用软件管理器来管理软件)

    我们的Linux系统大部分都是某个Linux厂商的系统,所以这些厂商可以编译好一些软件来提供用户下载,用户下载完了之后就可以直接安装,从而省去了编译源码及其过程中的各种问题.这时我们就可以使用相应的软 ...

  5. mt管理器java版下载_MT管理器2.7app下载-MT管理器2.7下载v2.7.0 稳定清爽版-西西软件下载...

    为大家带来MT管理器2.7.0最新版下载!这是一款非常强大的安卓文件管理器软件,新版本增加了可以让用户在线安装和更新插件的插件中心,增加了安装包提取功能,同时还优化文件名排序算法并修复云备份遗漏了文本 ...

  6. java的线程管理器,QuickThread - Java线程池管理器

    QuickThread 特性 任务扩展:支持延迟任务以及异步回调任务; 回调通知:当任务启动时与任务运行完毕后,有分别的生命周期作为通知; 线程切换:可制定是否回调主线程; 使用安全:当线程出现异常. ...

  7. Android布局管理器-使用FrameLayout帧布局管理器显示层叠的正方形以及前景照片

    场景 Android布局管理器-使用LinearLayout实现简单的登录窗口布局: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details ...

  8. android fragment 管理器,Android Fragment 與 Fragment管理器

    Android Fragment 與 Fragment管理器 首先談談Fragement的需求 過去開發人員認為界面之間的跳轉只需要使用多個activity組成就行了: 例如下圖中,在Activity ...

  9. 黑莓桌面管理器4.2_虚拟桌面管理器行业现状调研分析及发展趋势预测报告(2020)...

    QYResearch预测:2020-2026全球与中国虚拟桌面管理器市场现状及未来发展趋势 [纸版价格]:RMB 18000 [电子版(PDF)价格]:RMB 18000 [报告篇幅]:101 [报告 ...

最新文章

  1. 电商法重整网购对话经济和信息化-李玉庭:微商谋定法治
  2. 周五话分析 | 共享单车起航,数据分析跟上
  3. Linux内核defconfig在哪,Linux内核根目录中的配置文件.config中包含了许多宏定义,...
  4. Cocos2d-x 手游开发群:296733909
  5. CodeForces - 1529F It‘s a bird! No, it‘s a plane! No, it‘s AaParsa!(最短路+思维建图)
  6. 自定义路由匹配和生成
  7. 包+类导入+静态导入+类放入包中+包作用域
  8. 迭代器的简单应用实践
  9. Notepad++插件Base64编解码
  10. Flutter布局常用widgets
  11. 我的2017:从工作再到学生
  12. 全是90后!这所211大学,拟聘任10名清华北大博士!
  13. 用数据库表填充下拉列表框
  14. RDP报表设置Tomcat服务自动启动详细教程
  15. vgg19-dcbb9e9d.pth文件网盘下载
  16. c均值聚类matlab,实现代码 - 模糊C均值聚类算法(原理+Matlab代码)
  17. 森林防火应急指挥GIS系统森林防火监测预警系统
  18. greasemonkey_询问操作方法:Chrome中的Greasemonkey,为Media Center布线和自定义Windows 7跳转列表...
  19. 今日头条广告投放技巧干货:落地页分析工具
  20. 0-1背包算法python实现

热门文章

  1. 报错及解决 ‘gbk‘ codec can‘t decode byte 0x80 和raise ImportError(‘Failed to initialize: {0}‘.format(exc)
  2. Windows XP Professional产品密钥
  3. 唐婉《钗头凤》和陆游《钗头凤》
  4. Bert-P/HSum
  5. PCL:激光点云车道线检测及最小二乘法拟合
  6. 〖Python零基础入门篇㊲〗- 类的继承、多态与多重继承
  7. leetcode 1386.安排电影院座位
  8. 头歌:第1关:程序填空
  9. 一文带你了解“经典TRIZ”中的“技术系统演化模式”
  10. C4D无法找到libmmd.dll解决办法