Kubernetes之Helm认识

Helm介绍

基本方式部署应用流程

  1. 编写或者导出资源编排文件yaml

  2. deployment部署pod

  3. service暴露服务

  4. Ingress服务实现域名到Service的路由

  • 缺陷

  • 如果我们部署的是微服务项目,可能是10多20个或者更多的服务,那么每套服务都需要一套yaml文件

  • 这样下来,我们需要维护的yaml文件就是一大堆

  • 而且如果我们升个级,那就非常不方便了

Helm有什么作用

  • 可以使用Helm把上面我们说到的微服务部署yaml作为一个整体管理

  • 还可以实现yaml的高效服用

  • 使用Helm应用级别的版本管理,对于版本升级和回滚操作相当简单了起来

Helm的简单介绍

  • Helm官网

  • Helm是Kubernetes的一个包管理工具,有点像yum可以很方便的将之前打包好的 yaml 文件部署到 kubernetes 上。

Helm的三个重要概念

  • helm

    • 是Helm的命令行客户端工具,类似于kubectl

  • Chart

    • 打包的yaml集合

  • Release

    • 基于 Chart 的部署实体 ,一个 chart 被 helm 运行后将会生成对应的一个Release,相当于就是针对Chart的版本管理

Helm的版本V2 -> V3

  • 2019年年底发布了V3版本,发生较大的变化

    • 今天我们的学习目标也是V3版本

  • 最明显的变化就是Kubernetes中Tiller的剔除

  • Release 名称可以在不同命名空间重用

  • 支持将 Chart 推送至 Docker 镜像仓库中

  • 使用 JSONSchema 验证 chart values

  • ......

Helm的安装

Helm安装

  • Helm V3 下载 [提取码:6666]

  • 解压即可:tar -zxvf helm-v3.0.0-linux-amd64.tar.gz

  • 得到解压目录并进入其内,移动一个脚本到/usr/bin/目录下即可

    • mv ./helm /usr/bin/

  • 命令行键入helm,出现helm帮助文档,安装就此完成,嘻嘻嘻嘻嘻

配置helm仓库

Helm快速部署一个应用

这儿我们就演示一下快速部署应用的基本操作流程

下载Chart

  • helm install ui stable/weave-scope

    • 下载stable/weave-scope资源包,取名为ui

    • 其实这个过程就是在下载所有关联的资源编排文件yaml,又叫下载Chart

    • 然后helm会自动给我们创建pod并部署

  • 查看所有下载的Chart

    • helm list

  • 查看某个Chart的详细信息:helm status name ,列:

    • helm status ui

pods以及service变化

  • 然后我们就可以去k8s中看看pods是否有什么变化

    • kubectl get pods

    • kubectl get service

更改service类型

  • 但是此时我们发现helm为我们创建的Service的类型是ClusterIP类型,是不对外暴露的

    • 我们需要将其修改一下:kubectl edit service serviceName,进入到这个Service的资源编排文件中,如下所示

      • kubectl edit service ui-weave-scope

  • 修改默认ClusterIP为NodePort即可

  • 我们再次查看Service,如下所示

    • 发现已经生效,这个时候我们就可以通过浏览器随意节点IP:32641访问了

使用自定义chart部署应用

helm命令初始化Chart

如果我们想自定义Chart,则需要使用helm的命令进行初始化一个基本的环境出来,如下所示

  • 创建一个自定义chart,命名为:mychart

    • helm create mychart

    • 会在当前目录生成一个mychart的目录,这个目录可以随便放置

  • 然后我们进入该目录,展示其下所有文件夹和文件:

    • charts目录

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

      • 这个我们无需理会

    • Chart.yaml

      • 用于描述这个 Chart 的基本定义信息, 包括名字、 描述信息以及版本等

    • templates目录

      • 目录里面存放所有 yaml 模板文件

      • 我们自定义的yaml,也就是放在该目录下

    • values.yaml

      • 用于存储 templates 目录中模板文件yaml用到变量的值

      • 相当于环境变量的抽取,可以在这里定义环境变量,然后在templates其下的资源编排文件中访问使用

      • helm实现资源编排yaml的高效复用的途径

自定义资源编排文件yaml

  • 我们首先进入templates目录,清空其下所有的文件夹和文件,便于操作清晰

    • rm -rf ./templates/*

  • 导出Deployment资源编排文件

    • kubectl create deployment customchartdeployment --image nginx --dry-run -o yaml > customchartdeployment.yaml

  • 导出Service的资源编排文件

    • 因为我们会为上面的customchartdeployment ,而创建Service

    • k8s不会为不存在的deployment创建Service

    • 所以我们先将customchartdeployment 给部署了才能导出Service的资源编排文件

      • kubectl create deployment customchartdeployment --image nginx

      • kubectl expose deployment customchartdeployment --port 80 --target-port 80 --type NodePort --dry-run -o yaml > customchartexpose.yaml

    • 然后我们就得到了两个资源资源编排文件

      • customchartdeployment.yaml

      • customchartexpose.yaml

    • 然后我们还得把那个因为想导出Service的资源编排文件而创建的pod删掉

      • kubectl delete deployment customchartdeployment

安装chart.

在上面的操作中,我们已经得到两个资源编排文件,下面我们可以使用helm进行安装部署了

  • 下面我们开始安装自定义chart,并自定义名称为:custonchart

    • helm install custonchart /my_helm/mychart/

查看效果

  • 由此可见,安装自定义chart已经实现服务开放

chart的版本升级

有时候我们会修改chart的某些资源信息,然后实现服务的版本升级,此时该如何操作呢

  • 之前我们有说到Release的这个概念,chart的创建就会创建一个Release

  • 当我们使用升级命令时,这个时候Release就开始迭代了

  • 使用命令:helm upgrade 所升级的chartName 所升级的chart所在目录

Values实现yaml的高效服用

我们在开篇介绍Helm的时候就介绍过Helm可以实现yaml的高效复用

  • chart中的诸多资源编排文件yaml,大部分的结构格式是相同的,只有少部分的值是不同的,比如

    • kind、label、name、selector、image、port、replicas......等等

  • 我们可以通过以下方式实现高效复用

  • 资源编排yaml,我们通过给他传递参数,进行动态的模版渲染,生成真实的资源编排文件yaml

  • 也就是通过我们上面说的自定义chart操作中生成的values.yaml实现此功能

  • 我们在values.yaml中定义文件的全局变量,template中的yaml读取访问生成yaml即可

  • 简答介绍一下Values

  • Values你可以看作是该chart的一个环境变量对象,为templates中的模版提供值

  • Values这个对象的值可以来源于四个方向

    • chart包中的values.yaml文件 (这个是默认的,无该文件,无需理会)

    • 父chart包中的Values.yaml(用户自定义Values操作点,可覆盖上面的values.yaml)

    • 通过helm install 或者help upgrade命令中,用户传的参数,实现参数封装

      • -f

      • --values

    • 通过 --set 参数传入值进行参数封装,

      • helm upgrade custonchart --set replicas=5 /my_helm/mychart/

      • 可以覆盖用户操作的Values.yaml中提供的值

vlues.yaml定义全局变量

  • vim ./values.yaml

资源编排yaml访问全局变量

  • 修改资源编排文件

    • 在环境变量中除了Values对象可以使用外,还可以使用Release对象

    • Release对象也是Helm的一个内置对象

    • release表达式release表达式含义
      {{.Release.Name}} release 名字
      {{.Release.Namespace}} release 命名空间
      {{.Release.Service}} release 服务的名称
      {{.Release.Revision}} release 修订版本号, 从 1 开始累加

试运行-调试

  • Helm 也提供了--dry-run --debug 调试参数, 帮助你验证模板正确性

  • install 时候带上这两个参数就可以把渲染的资源清单打印出来, 不会真正的去部署一个 release

  • 下面我们来调试上面修改的 chart 包

    • helm install --dry-run valuestest /my_helm/mychart/

  • 可以看看我们生成的这个资源编排文件是否正常,

    • 下面我们就开始正式安装这个chart

 

  • 首先解释一下上面我的操作步骤

    1. 直接安装我们的chart : helm install valuestest /my_helm/mychart/

      1. 发现报错,查看报错日志,某个参数是错误的,定位到参数为 --images没有赋值

    2. 编辑customchartdeployment.yaml,发现是表达式写错了,少写了一个s

      1. 修正{{.Values.image}} 为 {{.Values.images}}

      2. 再次尝试安装,发现报错名称已经被使用

    3. 再次尝试改变名字安装,成功

    4. 查看helm本地库,发现即使错误的安装也会生成chart,

    5. 查看k8s,发现pod部署成功

      1. 发现没有指定镜像的的错误helm包,没有部署pod,

    6. 查看k8s,发现service部署成功

      1. 发现没有指定镜像的的错误helm包,没有部署pod,但却部署了service

    • 最后浏览器测试发现

      • 两个端口的nginx服务都是正常开启的,迷惑操作之一???

.

 

posted @ 2021-01-30 00:57  鞋破露脚尖儿  阅读(431)  评论(0编辑  收藏  举报