首页
学习
活动
专区
圈层
工具
发布

打造企业级自动化运维平台系列(十五):kubernetes 包管理工具 Helm 详解

为什么要引入 Helm

Helm 的应用场景

在以往的应用部署过程当中,我们需要先编写一个 yaml 文件,然后该文件中包含 deployment、Service、Ingress等等。

如果说需要部署的是单一、少数服务的应用,那么完全可以使用 yaml 文件的方式,这样会很简单。但是在实际的项目当中,微服务的数量基本不可能是一个,可能是几十个,如果说再用 yaml 文件的部署方式,那就意味着需要编写几十个 yaml 文件,这就会导致 数量多维护难 等诸多问题。

使用 Helm 可以解决哪些问题

针对上述问题,Helm 的引入使用则可以将所有的 yaml 文件进行一个整体的管理,而且它能够实现 yaml 文件的高效复用。

高效复用:yaml 文件的格式和结果基本相同,一般只是属性值有所变化。使用 helm 后,针对格式和结构基本相同的 yaml 文件就不需要一遍一遍的进行重复编写了,直接复用即可。

除此之外,Helm 还可以进行应用级别的版本管理,包括版本更新、回退等等。

Helm 概述

helm通过打包的方式,支持发布的版本管理和控制,很大程度上简化了Kubernetes应用的部署和管理。

Helm本质就是让k8s的应用管理(Deployment、Service等)可配置,能动态生成。通过动态生成K8S资源清单文件(deployment.yaml、service.yaml)。然后kubectl自动调用K8S资源部署。

对于K8s来说,应用资源配置可以定义为K8s API对象,包括Deployment,Namespace,Service, PV(Persistent Volumes)和PVC(PersistentVolumeClaims)等等。通常一个应用的部署会涉及很多资源的共同协作,用户会定义这些API对象到一系列Yaml文件中,然后通过kubectl来逐一进行部署。

那么问题来了,假如我没接触过K8s, 只想部署个应用了解下,不会写Yaml一个个配这些资源对象怎么破?需要去结合K8s文档学习Yaml语法。过了几天我终于学会了,一个个配好了这些资源对象的Yaml文件,并逐一部署在这台机器上。后面想在这台机器上再重复部署几套,另外还有十台环境要配成和这台一样,怎么办?拷贝过去再一一部署出来?这配置管理也太麻烦了,不好用,直接劝退!

先别急!幸好已经有Helm,避免了我们去完成这些繁琐配置和维护过程。它能够把这些零零散散的应用资源文件放在一起进行统一配置,极大方便了开发人员对K8s集群应用的管理。

Helm 组件及相关术语

Helm是官方提供类似于YUM的包管理,是部署环境的流程封装,Helm有三个重要的概念:chart、release和Repository。

  • Helm:Helm 是一个命令行下的客户端工具。主要用于 Kubernetes 应用程序 Chart 的创建、打包、发布以及创建和管理本地和远程的 Chart 仓库。
  • Tiller:Tiller 是 Helm 的服务端,部署在 Kubernetes 集群中。Tiller 用于接收 Helm 的请求,并根据 Chart 生成 Kubernetes 的部署文件( Helm 称为 Release ),然后提交给 Kubernetes 创建应用。Tiller 还提供了 Release 的升级、删除、回滚等一系列功能。
  • Chart:Helm 的软件包,采用 TAR 格式。类似于 APT 的 DEB 包或者 YUM 的 RPM 包,其包含了一组定义 Kubernetes 资源相关的 YAML 文件。Chart有特定的文件目录结构,如果开发者想自定义一个新的 Chart,只需要使用Helm create命令生成一个目录结构即可进行开发。
  • Repoistory:Helm 的软件仓库,Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository, 官方仓库的地址是:https://hub.helm.sh。
  • Release:使用 helm install 命令在 Kubernetes 集群中部署的 Chart 称为 Release。

Helm工作原理

Chart Install 过程

  • Helm从指定的目录或者tgz文件中解析出Chart结构信息
  • Helm将指定的Chart结构和Values信息通过gRPC传递给Tiller
  • Tiller根据Chart和Values生成一个Release
  • Tiller将Release发送给Kubernetes用于生成Release

Chart Update过程

  • Helm从指定的目录或者tgz文件中解析出Chart结构信息
  • Helm将要更新的Release的名称和Chart结构,Values信息传递给Tiller
  • Tiller生成Release并更新指定名称的Release的History
  • Tiller将Release发送给Kubernetes用于更新Release

Chart Rollback过程

  • Helm将要回滚的Release的名称传递给Tiller
  • Tiller根据Release的名称查找History
  • Tiller从History中获取上一个Release
  • Tiller将上一个Release发送给Kubernetes用于替换当前Release

Helm 安装与配置(v3)

安装 Helm v3

第一步:前往 Helm 官网 https://helm.sh/下载压缩文件;

第二步:将压缩文件上传至我们的 Linux 系统;

第三步:解压 helm 压缩文件;

代码语言:javascript
复制
#解压文件
tar -zxvf helm-v3.0.0-linux-amd64.tar.gz

解压后会有一个 linux-arm64 目录,这其中就包含了我们需要的 helm文件;

第四步:将解压之后的 helm 目录复制或者移动到 /usr/local/bin 目录下;

代码语言:javascript
复制
#移动文件
mv helm /usr/local/bin

完成此四步的操作之后就可以直接在 Linux 系统中使用 helm 命令进行相关操作了,如果使用 helm 命令不报错,则说明 helm 安装成功。

配置 Helm 仓库

添加仓库语法如下;

代码语言:javascript
复制
#语法
helm repo add 仓库名称 仓库地址

#eg:
#添加微软仓库
helm repo add stable http://mirror.azure.cn/kubernetes/charts
#添加阿里云仓库
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

仓库成功添加之后可以使用 helm repo list 命令查看已有仓库;

使用 Helm 快速部署应用

在这里我们以部署可视化工具 weave 为例。

第一步:使用命令搜索应用 weave;

代码语言:javascript
复制
helm search repo weave

第二步:根据搜索到的内容选择安装;

代码语言:javascript
复制
#安装 
helm install ui stable/weave-scope

这里选择的是微软源的 weave-scope 进行安装,如果在安装过程中报错那就换一个源;

安装成功就可以使用命令 helm list 查看了;

接下来使用 kubectl get podskubectl get svc 就可以看到我们安装的 weave 相关内容和对外暴露端口;

第三步:可以看到此时并未对外暴露端口,所以我们需要修改 service 中的 yaml 文件,将 type 值改为 NodePort,使用命令 kubectl edit svc ui-weave-scope

修改过后再次查看 svc,此时已有端口暴露;

自定义 Chart 部署应用

我们在这里以部署自定义应用 myweb1 为例。

第一步:创建一个chart;

代码语言:javascript
复制
helm create mychart

创建成功会自动生成一个 mychart 目录(其实也就是一个模板);

在生成的目录中有以下几部分:

第二步:进入 templates 目录,创建 deployment. yaml 文件;

代码语言:javascript
复制
[root@master mychart]# cd templates/
[root@master templates]# kubectl create deployment myweb1 --image=nginx --dry-run -o yaml > deployment.yaml
W0906 10:18:15.827722  113157 helpers.go:535] --dry-run is deprecated and can be replaced with --dry-run=client.
[root@master templates]# ls
deployment.yaml  ingress.yaml  serviceaccount.yaml  tests
_helpers.tpl     NOTES.txt     service.yaml

查看 deployment.yaml 文件;

第四步:设置对外暴露端口,创建 service.yaml 文件;

代码语言:javascript
复制
[root@master templates]# kubectl expose deployment myweb1 --port=80 --target-port=80  --type=NodePort --dry-run -o yaml > service.yaml
W0906 10:37:13.004600  126020 helpers.go:535] --dry-run is deprecated and can be replaced with --dry-run=client.
[root@master templates]# ls
deployment.yaml  ingress.yaml  serviceaccount.yaml  tests
_helpers.tpl     NOTES.txt     service.yaml
  • 如果这里无法导出,我们就先创建一次镜像:kubectl create deployment myweb1 --image=nginx
  • 导出 service 后再删除此镜像:kubectl delete deployment myweb1

查看 service.yaml 文件;

此时在 templates 目录中已有创建的两个 yaml 文件;

第五步:回到 mychart 父级目录,开始安装;

代码语言:javascript
复制
[root@master linux-amd64]# helm install myweb1 mychart/

安装成功后查看应用内容,应用节点与对外端口均创建成功;

myweb1 应用部署完成,此时就完成了 chart 的自定义及部署应用操作。

第六步:应用升级,每次修改 yaml 文件内容之后,我们均需对应用进行升级操作,使用如下命令。

代码语言:javascript
复制
#格式
helm upgrade 自定义应用名称 目录
#eg:
helm upgrade myweb1 mychart/

Helm 实现 yaml 文件高效复用

高效复用:如果若干 yaml 文件的格式和结果基本相同,只是属性值有所变化时。在使用 Helm 后,针对格式和结构基本相同的 yaml 文件就不需要一遍一遍的进行重复编写了,直接复用即可。其主要实现原理就是通过动态传递参数、动态渲染模板、动态传入参数生成 yaml 文件内容。

创建 chart 之后,目录下有一个 values.yaml 文件,基于此进行操作;

第一步:在 values.yaml 文件中定义全局变量和值;

第二步:在具体的 yaml 文件中获取定义的变量值。

原理就是以表达式的形式获取全局变量,格式为:**{{ .Values.变量名称}}**

此处以修改 deployment.yaml 文件为例:

修改后如下:

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: myweb1
  name: {{ .Release.Name}}-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: {{ .Values.label}}
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: {{ .Values.label}}
    spec:
      containers:
      - image: {{ .Values.image}}
        name: nginx
        resources: {}
status: {}

Helm 的常用操作命令汇总

代码语言:javascript
复制
#查看仓库
helm repo list

#更新仓库
helm repo update

#删除仓库
helm repo remove 仓库名称

#搜索应用
helm search repo 名称

#安装应用
helm install 自定义应用名称 搜索出的结果名

#查看安装后的应用
helm list
helm status 应用名称 

#创建chart
helm create chart名称

参考来源:https://majinjian.blog.csdn.net/article /details/126693667 https://blog.csdn.net/m0_636 74789/article/details/130196207

下一篇
举报
领券