共计 3025 个字符,预计需要花费 8 分钟才能阅读完成。
何为Helm?
Helm 就是 k8s 的包管理工具,类似于centos的yum,python的pip,node的npm一样。Helm由客户端组件 helm 和服务端组件 Tiller 组成,能够将一组k8s的资源打包统一管理,是查找,共享和使用k8s构建的最佳方式。
Helm的组件和相关术语
- Helm:命令行下的客户端工具,主要用于 k8s 应用程序 Chart 的创建,打包,发布及管理本地和远程的 Chart 仓库
- Tiller:Helm 的服务端,部署在 k8s 集群里,用于接收 helm 的请求,与k8s 的api-server交互。根据 Chart 生成 k8s 的部署文件(release),然后提交给 k8s 创建应用。Tiller 还提供了 Release 的升级、删除、回滚等一系列功能。
- Chart:Helm的打包格式叫做chart,所谓chart就是一系列文件/模板, 它描述了一组相关的 k8s 集群资源
- Repoistory:helm的软件仓库,本质上是一个Web服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该Repoistory的 Chart 清单文件供查询。Helm 可以同时管理多个不同的 Repoistory。
- Release:使用 helm install 命令在 k8s 集群中部署的 Chart 称为 Release。
工作原理
创建Release
- helm 客户端从指定的目录或本地tar文件或远程repo仓库解析出chart的结构信息
- helm 客户端指定的 chart 结构和 values 信息通过 gRPC 传递给 Tiller
- Tiller 服务端根据 chart 和 values 生成一个 release
- Tiller 将install release请求直接传递给 kube-apiserver
删除Release
- helm 客户端从指定的目录或本地tar文件或远程repo仓库解析出chart的结构信息
- helm 客户端指定的 chart 结构和 values 信息通过 gRPC 传递给 Tiller
- Tiller 服务端根据 chart 和 values 生成一个 release
- Tiller 将delete release请求直接传递给 kube-apiserver
更新Release
- Helm从指定的目录或者tgz文件中解析出Chart结构信息
- Helm将要更新的Release的名称和Chart结构,Values信息传递给Tiller
- Tiller生成Release并更新指定名称的Release的History
- Tiller将Release发送给Kubernetes用于更新Release
回滚Release
- Helm将要回滚的Release的名称传递给Tiller
- Tiller根据Release的名称查找History
- Tiller从History中获取上一个Release
- Tiller将上一个Release发送给Kubernetes用于替换当前Release
Chart 结构
使用 helm create Appname 就能生成下面的chart文件了
- charts 该目录中放置当前Chart依赖的其它Chart
- Chart.yaml 包含Chart的基本信息,包括chart版本,名称等
- templates 目录下存放应用一系列 k8s 资源的 yaml 模板
- _helpers.tpl 此文件中定义一些可重用的模板片断,此文件中的定义在任何资源定义模板中可用
- NOTES.txt 介绍chart 部署后的帮助信息,如何使用chart等
- values.yaml 包含了必要的值定义(默认值), 用于存储 templates 目录中模板文件中用到变量的值
- deployment.yaml
- ingress.yaml
- service.yaml
放几个文件例子,作为参考,双大括号包扩起来的部分是Go template语法
Chart.yaml
name: [必须] Chart的名称
version: [必须] Chart的版本号,版本号必须符合 SemVer 2:http://semver.org/
description: [可选] Chart的简要描述
keywords:
- [可选] 关键字列表
home: [可选] 项目地址
sources:
- [可选] 当前Chart的下载地址列表
maintainers: # [可选]
- name: [必须] 名字
email: [可选] 邮箱
engine: gotpl # [可选] 模版引擎,默认值是gotpl
icon: [可选] 一个SVG或PNG格式的图片地址
values.yaml
# Default values for mychart.
# This is a yaml-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
image:
repository: nginx
tag: stable
pullPolicy: IfNotPresent
service:
name: nginx
type: ClusterIP
externalPort: 80
internalPort: 80
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 100m
memory: 128Mi
deployment.yaml
# Default values for mychart.
# This is a yaml-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
image:
repository: nginx
tag: stable
pullPolicy: IfNotPresent
service:
name: nginx
type: ClusterIP
externalPort: 80
internalPort: 80
resources:
limits:
cpu: 100m
memory: 128Mi
requests:
cpu: 100m
memory: 128Mi
Chart 常用命令
# 检查配置和模板是否有效,生成最终的yaml文件
helm install --dry-run --debug <chart_dir>
# 部署到k8s
helm install <chart_dir>
# 查看部署的relaese
helm list
# 部署完应用包后,查看release提示信息
helm status mysql1
helm fetch stable/redis
查看chart官方手册,了解每个参数的含义https://docs.helm.sh/developing_charts/#charts
# 用helm生成基础chart示例性文件,myapp是chart的名字
helm create myapp
# 做语法检查
helm lint myapp
==> Linting myapp
[INFO] Chart.yaml: icon is recommended
1 chart(s) linted, no failures
# 打包
helm package myapp/
Successfully packaged chart and saved it to: /root/myapp-0.1.0.tgz
# 启动8879仓库的服务
helm serve
# 查看local仓库里面是否有我们创建的chart包
helm search myapp
# 部署我们自定义的chart
helm install --name myapp1 local/myapp
# 删除我们部署的chart
helm delete --purge myapp1
正文完
发表至: DevOps
2020-12-11