【k8s学习】Kubernetes打包工具Helm介绍

【本文目标】

  • Helm以及Helm Chart介绍
  • Helm Version 2和3的区别

【前置文章】

  • 【k8s学习】Kubernetes学习——核心组件和架构
  • 【k8s学习】minikube、kubectl、yaml配置文件的介绍
  • 【k8s学习】在minikube上布署MongoDB和MongoExpress
  • 【k8s学习】kubernetes namespace介绍
  • 【k8s学习】Kubernetes Ingress介绍

1. Helm介绍

官网:https://helm.sh/

1.1 Package Manager for Kubernetes

Helm是k8s上的包管理工具。类似apt, yum, homebrew。

举个例子,如果我们要往Kubernetes集群中部署myapp项目,那么可能需要:

  • Stateful Set:如db数据库。
  • ConfigMap
  • Secret
  • K8s Users
  • Service
  • ...

也许这些配置别人也同样做过,所以我们的目标是能复用这些yaml以达到减少自己写yaml的目标。而这些bundle yaml(yaml的集合),即为Helm Charts

我们可以创建自己的Helm Charts,然后push到Helm的Repository上。也可以下载别人的Helm Chart,如一些db配置(MongoDB, MySQL, Elasticsearch...),或是监控类配置(Promotheus),诸如此类复杂的Chart配置,在Repository上都已经有了。

Sharing Helm Charts——这种分享的方式,也让Helm成为热门项目的原因之一。

如何搜索:

  • 通过命令`helm search
  • Helm Hub UI,search

除了Public Repository,有些公司会有自己的Private Helm Repository。

1.2 Templating Engine

如果有多个micro-service,每个micro-service都有自己的Pod yaml定义(大多数时候这个yaml定义都长的差不多,只有少部分field不一样),Helm的做法是把这些定义抽象成一个模版,那些不一样的field可以参数化。
模版定义例如:

apiVersion: v1
kind: Pod
metadata:
  name: {{ .Values.name }}
spec:
  containers:
  - name: {{ .Values.container.name }}
    image: {{ . Values.container.image }}
    port: {{ .Value.container.port }}

上述的{{ .Values... }}来自于另外的文件,叫values.yaml,在这个文件中我们传入的是真实的值:

name: my-app
container:
  name: my-app-container
  image: my-app-image
  port: 9001

使用模版驱动的配置对CI/CD比较有好处,在build的时候替换真实的values。

1.3 不同环境下的配置可以使用Helm

当我们的项目部署在不同环境下(如Dev,Test,Prod等),配置可能都长的差不多,这时候也可以使用Helm Chart来打包。

2. Helm Chart学习

一般来说Helm Chart的目录结构会是:
mychart/:mychart文件夹,以chart的名字命令,在这个文件夹下面,会有以下文件或是文件夹:

  • Chart.yaml:mychart metadata相关的信息,比如name, version,dependencies等
  • values.yaml:templates模块需要被替换的真实的值,这里一般存放的是默认值,可以被重写掉的。
  • charts/:这个文件夹放的是charts的一些依赖,比如当前的chart依赖于别的chart,那么别的chart就可以安装在这里面。
  • templates/:文件夹用来存放模版。
  • ...:其它的一些文件,例如readme.txt或是licence文件等。

当使用命令helm install 来安装上述chart时,模版文件中的yaml模版里的参数将会被values.yaml替换掉,进而生成Kubernetes认识的yaml。

在mychart文件夹中的values.yaml,是默认的values.yaml,可以被重写掉,那么怎么进行重写呢?

  • 方式1是在安装的时候传入value文件名,如:helm install --values=my-values.yaml
  • 方式2可以在安装的时候直接传入值,如helm install --set version=2.0.0 ,这里的version就是template中的field名字。

3. Release Management

Helm Version 2 vs. 3

Helm Version 2有两部分:Client(helm CLI)和Server(Tiller)
Server是运行在Kubernetes集群中的,当我们在客户端使用命令helm install 进行安装的时候,请求会被发送到Server端的Tiller中。Tiller收到后会开始在Kubernetes集群中创建工作,如创建Pod,Service等。

Helm Version2的这个功能,可以帮助我们进行Release管理。
在Server端的Tiller会保存着helm的执行记录。

Tiller在Kubernetes集群中能干很多事,如创建、修改删除组件,正因为此,Tiller太过强大可能会导致一些安全问题,所以在Helm3中将Tiller移除了。


参考:
https://www.youtube.com/watch?v=X48VuDVv0do

你可能感兴趣的:(【k8s学习】Kubernetes打包工具Helm介绍)