Helm包管理工具
Helm是Kubernetes的包管理器,类似于php的composer,centos的yum,主要用来管理Charts, Chart是用来封装Kubernetes原生应用程序的一系列YAML文件。 在使用Helm之前,需要先安装一个Kubernetes集群,和一个本地的 kubectl。
Helm的三个概念
- Chart 代表着 Helm 包,它包含着k8s集群内部运行应用程序或服务所需的所有资源定义。
- Repository(仓库) 是用来存放和共享 charts 的地方。
- Release 是运行在 Kubernetes 集群中的 chart 的实例,一个 chart 通常可以在同一个集群中安装多次。每一次安装都会创建一个新的 release。
helm几种安装方式
- brew install heml 下载二进制Helm client安装包
- curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash https://github.com/helm/helm/releases
- git clone https://github.com/helm/helm.git && cd helm && make
从使用者和发布者的角度来看helm
- 应用发布者,可以通过Helm打包应用、管理应用依赖关系、管理应用版本并发布应用到软件仓库。
- 应用使用者,使用Helm后不用需要编写复杂的应用部署文件,可以用简单的方式在k8s上查找、安装、升级、回滚、卸载应用程序
helm客户端直接与 Kubernetes API 服务器交互,流程如下图
Helm可以用来从两种来源中进行搜索Charts
- helm search hub 是从Artifact Hub中查找并列出 helm charts。Artifact Hub是很多仓库的聚合搜索。
- helm search repo 从你添加(使用 helm repo add)到本地 helm 客户端中的仓库中进行查找。该命令基于本地数据进行搜索,无需连网。
添加常用的chart源
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add stable https://kubernetes-charts.storage.googleapis.com
helm repo add incubator https://kubernetes-charts-incubator.storage.googleapis.com
helm repo add aliyuncs https://apphub.aliyuncs.com
helm常用命令
helm repo list #查看chart列表
helm search repo nginx #搜索nginx,从添加的仓库中查找 chart 的名字
helm install bitnami/mysql --generate-name #安装mysql
helm status happy-panda # 来追踪展示 release 的当前状态
helm show values bitnami/wordpress # 查看 chart 中的可配置选项
helm uninstall happy-panda # 从集群中卸载一个 release
helm list # 看到当前部署的所有 release
helm pull bitnami/wordpress # 下载和查看一个发布的 chart
helm pull bitnami/wordpress --untar # 下载并解压一个发布的 chart
helm upgrade # 升级 release 版本
helm rollback # 恢复 release 版本
helm install -f values.yaml bitnami/wordpress --generate-name
helm get manifest gozero # 查看生成的完整的YAML
helm package mychart # 它打包成一个chart存档
helm lint mychart # 您找到chart的格式或信息
helm get manifest mychart # 检索这个版本并看到实际的版本已经加载
Chart 目录结构
wordpress/
Chart.yaml # 包含了chart信息的YAML文件
LICENSE # 可选: 包含chart许可证的纯文本文件
README.md # 可选: 可读的README文件
values.yaml # chart 默认的配置值
values.schema.json # 可选: 一个使用JSON结构的values.yaml文件
charts/ # 包含chart依赖的其他chart
crds/ # 自定义资源的定义
templates/ # 模板目录, 当和values 结合时,这个目录中的大多数文件被视为包含Kubernetes清单
templates/NOTES.txt # 可选: 包含简要使用说明的纯文本文件
mychart/templates/ 目录中的一些文件:
NOTES.txt: chart的"帮助文本"。这会在你的用户执行helm install时展示给他们。
deployment.yaml: 创建Kubernetes 工作负载的基本清单
service.yaml: 为你的工作负载创建一个 service终端基本清单。
_helpers.tpl: 放置可以通过chart复用的模板辅助对象
Chart.yaml 文件
Chart.yaml文件是chart必需的。包含了以下字段
apiVersion: chart API 版本 (必需)
name: chart名称 (必需)
version: 语义化2 版本(必需)
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的tag
import-values: # (可选)
- ImportValue 保存源值到导入父键的映射。每项可以是字符串或者一对子/父列表项
alias: (可选) chart中使用的别名。当你要多次添加相同的chart时会很有用
maintainers: # (可选)
- name: 维护者名字 (每个维护者都需要)
email: 维护者邮箱 (每个维护者可选)
url: 维护者URL (每个维护者可选)
icon: 用做icon的SVG或PNG图片URL (可选)
appVersion: 包含的应用版本(可选)。不需要是语义化,建议使用引号
deprecated: 不被推荐的chart (可选,布尔值)
annotations:
example: 按名称输入的批注列表 (可选).
从零开始编写chart
helm create mychart # 会初始化一个chart skeleton
helm install --dry-run --debug bjy ./mychart
configmap.yaml # mychart/templates/configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ .Release.Name }}-configmap
data:
myvalue: "Hello World"
drink: {{ .Values.favorite.drink }}
template文件中可以使用模板变量,这些模板是 Go模板语言
模板命令要括在 {{ 和 }} 之间,用点(.)分隔每个命名空间的元素
内置对象,Release和Files
<https://helm.sh/zh/docs/chart_template_guide/builtin_objects/>
模板函数和流水线
Helm 有超过60个可用函数,其中有些通过 Go模板语言本身定义
<https://helm.sh/zh/docs/chart_template_guide/functions_and_pipelines/>
检测chart文件,查看渲染模板之后的yaml文件
helm lint --strict my-hello-world
helm template .
测试模板渲染,使用--dry-run 测试yaml代码
helm install --debug --dry-run goodly-guppy ./mychart
helm install solid-vulture ./mychart --dry-run --debug --set favoriteDrink=coffee
helm install --dry-run --disable-openapi-validation measly-whippet ./mychart # 可以用--disable-openapi-validation 参数查看渲染了什么
Chart测试
一般测试以下内容:
1、验证你values.yaml文件中的配置可以正确注入。
2、判断你的服务只启动的并且正确地负载均衡
运行测试
helm test your-release
编写测试文件
test在helm chart的 templates/目录中
一个test一般指定了容器和给定命令的任务。如果测试通过,容器应该成功退出 (exit 0)
Helm按照以下顺序安装资源:
Namespace
NetworkPolicy
ResourceQuota
LimitRange
PodSecurityPolicy
PodDisruptionBudget
ServiceAccount
Secret
SecretList
ConfigMap
StorageClass
PersistentVolume
PersistentVolumeClaim
CustomResourceDefinition
ClusterRole
ClusterRoleList
ClusterRoleBinding
ClusterRoleBindingList
Role
RoleList
RoleBinding
RoleBindingList
Service
DaemonSet
Pod
ReplicationController
ReplicaSet
Deployment
HorizontalPodAutoscaler
StatefulSet
Job
CronJob
Ingress
APIService
参考地址