- 概念
- 安装
- https://mirrors.huaweicloud.com/helm/v3.6.0/helm-v3.6.0-linux-amd64.tar.gz
$ tar -zxf helm-v3.6.0-linux-amd64.tar.gz
$ cd linux-amd64/
$ mv helm /usr/sbin/">安装
$ wget https://mirrors.huaweicloud.com/helm/v3.6.0/helm-v3.6.0-linux-amd64.tar.gz
$ tar -zxf helm-v3.6.0-linux-amd64.tar.gz
$ cd linux-amd64/
$ mv helm /usr/sbin/ - 验证
$ helm version
version.BuildInfo{Version:”v3.6.0”, GitCommit:”7f2df6467771a75f5646b7f12afb408590ed1755”, GitTreeState:”clean”, GoVersion:”go1.16.3”} - http://mirror.azure.cn/kubernetes/charts/
$ helm repo update">同步最新charts信息到本地(因官方的 charts 仓库地址需要科学上网)
$ helm repo add stable http://mirror.azure.cn/kubernetes/charts/
$ helm repo update - 查看仓库列表
$ helm repo list - 从仓库中把chart包下载到本地
$ helm pull stable/mysql
$ tar -axvf mysql-1.6.9.tgz
$ tree mysql
mysql
├── Chart.yaml
├── README.md
├── templates
│ ├── configurationFiles-configmap.yaml
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── initializationFiles-configmap.yaml
│ ├── NOTES.txt
│ ├── pvc.yaml
│ ├── secrets.yaml
│ ├── serviceaccount.yaml
│ ├── servicemonitor.yaml
│ ├── svc.yaml
│ └── tests
│ ├── test-configmap.yaml
│ └── test.yaml
└── values.yaml - 命令查看 chart 包所有可配置参数选项
- 查看
概念
Helm是什么?
- 对于应用发布者而言,可以通过Helm打包应用,管理应用依赖关系,管理应用版本并发布应用到软件仓库。
- 对于使用者而言,使用Helm后不用需要了解Kubernetes的Yaml语法并编写应用部署文件,可以通过Helm下载并在kubernetes上安装需要的应用。
Helm还提供了kubernetes上的软件部署,删除,升级,回滚应用的功能。Helm 对于 Kubernetes 来说就相当于 yum 对于 Centos 。
重要概念
- Chart,应用的信息集合,包括各种对象的配置模板、参数定义、依赖关系、文档说明等。
- Repoistory,chart仓库,存储chart的地方,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository。
- Release, 当 chart 被安装到 kubernetes 集群,就生成了一个 release ,是 chart 的运行实例,代表了一个正在运行的应用。
kubernetes 管理的对象叫做资源(比如 pod)。helm 将互相关联的多个资源统一打包成一个整体,交给 Kubernetes 去运行。这个被打包的整体叫做 chart 。
安装
基于一个可用的 Kubernetes 集群,然后在使用 Helm 的节点上已经配置好可通过 kubectl 访问集群,因为 Helm 是读取 kubeconfig 文件来访问集群。
安装
$ wget https://mirrors.huaweicloud.com/helm/v3.6.0/helm-v3.6.0-linux-amd64.tar.gz
$ tar -zxf helm-v3.6.0-linux-amd64.tar.gz
$ cd linux-amd64/
$ mv helm /usr/sbin/
验证
$ helm version
version.BuildInfo{Version:”v3.6.0”, GitCommit:”7f2df6467771a75f5646b7f12afb408590ed1755”, GitTreeState:”clean”, GoVersion:”go1.16.3”}
同步最新charts信息到本地(因官方的 charts 仓库地址需要科学上网)
$ helm repo add stable http://mirror.azure.cn/kubernetes/charts/
$ helm repo update
查看仓库列表
$ helm repo list
从仓库中把chart包下载到本地
$ helm pull stable/mysql
$ tar -axvf mysql-1.6.9.tgz
$ tree mysql
mysql
├── Chart.yaml
├── README.md
├── templates
│ ├── configurationFiles-configmap.yaml
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── initializationFiles-configmap.yaml
│ ├── NOTES.txt
│ ├── pvc.yaml
│ ├── secrets.yaml
│ ├── serviceaccount.yaml
│ ├── servicemonitor.yaml
│ ├── svc.yaml
│ └── tests
│ ├── test-configmap.yaml
│ └── test.yaml
└── values.yaml
2 directories, 15 files
示例
使用 helm 安装应用
# helm 搜索chart包$ helm search repo mysql# 从仓库安装$ helm install mysql stable/mysql# 查看$ helm lsNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSIONmysql default 1 2021-12-01 14:50:19.636178449 +0800 CST deployed mysql-1.6.9 5.7.30# 根据标签筛选$ kubectl get all -l release=mysqlNAME READY STATUS RESTARTS AGEpod/mysql-54bbdd8f86-x9nhw 0/1 Pending 0 2m43sNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/mysql ClusterIP 10.97.148.99 <none> 3306/TCP 2m43sNAME READY UP-TO-DATE AVAILABLE AGEdeployment.apps/mysql 0/1 1 0 2m43sNAME DESIRED CURRENT READY AGEreplicaset.apps/mysql-54bbdd8f86 1 1 0 2m43s# 查看chart包(mysql)特性$ helm show chart stable/mysqlapiVersion: v1appVersion: 5.7.30deprecated: truedescription: DEPRECATED - Fast, reliable, scalable, and easy to use open-source relationaldatabase system.home: https://www.mysql.com/icon: https://www.mysql.com/common/logos/logo-mysql-170x115.pngkeywords:- mysql- database- sqlname: mysqlsources:- https://github.com/kubernetes/charts- https://github.com/docker-library/mysqlversion: 1.6.9# 查看更多信息$ helm show all stable/mysql# 删除$ helm uninstall mysql$ helm status mysqlError: release: not found# uninstall 命令会从 Kubernetes 中删除与 release 相关的所有 Kubernetes 资源以及 release 历史记录。# 在删除的时候使用 --keep-history 参数,则会保留 release 的历史记录$ helm uninstall mysql --keep-history$ helm status mysqlNAME: mysqlLAST DEPLOYED: Wed Dec 1 16:53:45 2021NAMESPACE: defaultSTATUS: uninstalledREVISION: 1...$ helm ls -aNAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSIONmysql default 1 2021-12-01 16:53:45.300748666 +0800 CST uninstalled mysql-1.6.9 5.7.30
使用 helm 按需配置应用
使用 helm install 命令安装的 chart 包,只会使用 chart 的默认配置选项。根据自己需求定制 chart 包配置参数也是一种使用场景。
命令查看 chart 包所有可配置参数选项
$ helm pull stable/mysql$ helm show values stable/mysql## mysql image version## ref: https://hub.docker.com/r/library/mysql/tags/##image: "mysql"imageTag: "5.7.30"......## Create a database user### mysqlUser:## Default: random 10 character string# mysqlPassword:## Allow unauthenticated access, uncomment to enable### mysqlAllowEmptyPassword: true## Create a database### mysqlDatabase:......## Persist data to a persistent volumepersistence:enabled: true## database data Persistent Volume Storage Class## If defined, storageClassName: <storageClass>...
#所有参数都可以覆盖,通过 YAML 格式文件传递
# 将 values 可配置参数通过文件传入,原文件默认注释$ cat config.yamlmysqlUser: user0mysqlPassword: user0pwdmysqlDatabase: user0dbpersistence:enabled: false$ helm install -f config.yaml stable/mysql --generate-nameWARNING: This chart is deprecatedNAME: mysql-1638349802LAST DEPLOYED: Wed Dec 1 17:10:04 2021NAMESPACE: defaultSTATUS: deployed...
查看
$ kubectl get podNAME READY STATUS RESTARTS AGEmysql-1638349802-76b958c-d7cw9 1/1 Running 0 83s$ kubectl get pod -l release=mysql-1638349802NAME READY STATUS RESTARTS AGEmysql-1638349802-76b958c-d7cw9 1/1 Running 0 93s$ kubectl describe pod mysql-1638349802-76b958c-d7cw9...Environment:MYSQL_ROOT_PASSWORD: <set to the key 'mysql-root-password' in secret 'mysql-1638349802'> Optional: falseMYSQL_PASSWORD: <set to the key 'mysql-password' in secret 'mysql-1638349802'> Optional: falseMYSQL_USER: user0MYSQL_DATABASE: user0db...
在安装过程中,有两种方法可以传递配置数据:
- —values(或者 -f):指定一个 YAML 文件来覆盖 values 值,可以指定多个值,最后边的文件优先
- —set:在命令行上指定覆盖的配置。
--set 选项接收零个或多个 name/value 对,最简单的用法就是 --set name=value,相当于 YAML 文件中的:name: value多个值之间用字符串“,”隔开,用法就是 --set a=b,c=d,相当于 YAML 文件中的:a: bc: d也支持更加复杂的表达式,例如 --set outer.inner=value,对应 YAML:outer:inner: value对于列表数组可以用 {} 来包裹,比如 --set name={a, b, c},对应 YAML:name:- a- b- c数组索引语法访问列表中某个项,比如 --set servers[0].port=80,对应的 YAML 为:servers:- port: 80也可以设置多个值,比如 --set servers[0].port=80,servers[0].host=example,对应的 YAML 为:servers- port: 80host: example特殊字符用反斜杠来转义字符,比如 --set name=value1,value2,对应的 YAML 为:name: "value1,value2"
使用 helm 创建定制应用
定制流程
执行命令 helm create myapp 创建模板
修改对应内容,验证charts格式 cd myapp && helm lint
查看charts文件内容 helm inspect chart myapp
查看value文件内容 helm inspect values myapp
查看charts模板渲染后生成的kubernetes yaml资源内容 helm template myapp
chart
# helm create myapp# tree myapp/myapp/ # chart 包目录名Chart.yaml # 包含了chart信息的YAML文件LICENSE # 可选: 包含chart许可证的纯文本文件README.md # 可选: 可读的README文件values.yaml # chart 默认的配置值values.schema.json # 可选: 一个使用JSON结构的values.yaml文件charts/ # 包含chart依赖的其他chartcrds/ # 自定义资源的定义templates/ # 模板目录, 当和values 结合时,可生成有效的Kubernetes manifest文件templates/NOTES.txt # 可选: 包含简要使用说明的纯文本文件
在 Kubernetes 中部署一个应用,通常需要编写deployment、service、ingress三个配置文件,通过 helm create 命令会默认创建。
Chart.yaml 文件是 chart 必需的,包含字段:
apiVersion: chart API 版本 (必需)name: chart名称 (必需)version: 版本(必需)kubeVersion: 兼容Kubernetes版本的语义化版本(可选)description: 一句话对这个项目的描述(可选)type: chart类型 (可选)keywords:- 关于项目的一组关键字(可选)home: 项目home页面的URL (可选)sources:- 项目源码的URL列表(可选)dependencies: # chart 必要条件列表 (可选)- name: chart名称 (nginx)version: chart版本 ("1.2.3")repository: 仓库URL ("https://example.com/charts") 或别名 ("@repo-name")condition: (可选) 解析为布尔值的yaml路径,用于启用/禁用chart (e.g. subchart1.enabled )tags: # (可选)- 用于一次启用/禁用 一组chart的tagenabled: (可选) 决定是否加载chart的布尔值import-values: # (可选)- ImportValue 保存源值到导入父键的映射。每项可以是字符串或者一对子/父列表项alias: (可选) chart中使用的别名。当你要多次添加相同的chart时会很有用maintainers: # (可选)- name: 维护者名字 (每个维护者都需要)email: 维护者邮箱 (每个维护者可选)url: 维护者URL (每个维护者可选)icon: 用做icon的SVG或PNG图片URL (可选)appVersion: 包含的应用版本(可选)。不需要是语义化的deprecated: 不被推荐的chart (可选,布尔值)annotations:example: 按名称输入的批注列表 (可选).
values
Values 对象是为 Chart 模板提供值,此对象的值有4个来源,后面的可以覆盖前面的。
- chart 包中的 values.yaml 文件
- 父 chart 包的 values.yaml 文件
- 通过 helm install 或者 helm upgrade 的 -f 传入的自定义 yaml 文件
- 通过 —set 参数传入的值
在模板文件中,通过 {{.Values}} 对象来访问设置的值。
