Helm
功能
包管理工具,定义一个k8s应用
- 简化部署:通过Helm,你可以使用预定义的配置文件来部署应用,而不需要手动编写和管理大量的Kubernetes YAML文件。
- 版本控制:Helm支持版本控制,你可以轻松地回滚到以前的版本。
- 依赖管理:Helm可以管理应用的依赖关系,确保所有依赖的服务都正确部署。
- 模板化:Helm使用Go模板引擎,可以根据不同的环境和需求生成动态的Kubernetes配置文件。
功能
- chart创建,chart中含有K8S的全部模板信息
- config,包含了配置信息,用于和模板结合后生成最终K8S配置
- release,chart和config结合后的运行实例
- 打包chart为tgz
- 与存储chart的仓库交互
- 安装和卸载chart
- 管理helm安装的chart的生命周期
Chart
软件包
- Chart.yaml:元数据文件,包含名称、版本和描述等信息。
- values.yaml:配置文件,用来控制部署。
- templates/:K8S资源模板文件,可以在配置项中引用values.yaml中的Key。
- deployment.yaml:定义Deployment资源的模板
- service.yaml:定义Service资源的模板
Chart:类似yum的rpm包
Repository:存放Chart的地方,包含一个或多个打包的chart,存在index.yaml的文件,包含完整的包列表,用于检索和验证元数据。helm可以使用repo添加仓库,不过helm不提供上传chart到仓库的功能。
Release:运行的chart的示例,每次install chart都会产生一个Release
helm show values
helm repo add bitnami https://charts.bitnami.com/bitnami
helm search repo bitnami
helm repo update
# 每次执行都会创建一个新的发布版本,一个chart可以被多次安装,独立管理
# helm生成名称
helm install bitnami/mysql --generate-name
# 指定名称
helm install mysql_test bitnami/mysql
# 查看发布的版本
helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
mysql-1612624192 default 1 2021-02-06 16:09:56.283059 +0100 CET deployed mysql-8.3.0 8.0.23
helm status mysql-1612624192
helm get values mysql-1612624192
helm upgrade -f x.yaml mysql-1612624192 bitnami/mysql
helm history mysql-1612624192
helm rollback mysql-1612624192 1
# 会删除所有相关资源,service,Deployment,pod,版本历史
helm uninstall mysql-1612624192
使用helm管理chart
helm create chart-a
helm package chart-a
x.tar.gz
helm install chart-a ./x.tar.gz
Chart
Chart文件结构
wordpress/
Chart.yaml # 包含了chart信息的YAML文件
LICENSE # 可选: 包含chart许可证的纯文本文件
README.md # 可选: 可读的README文件
values.yaml # chart 默认的配置值
values.schema.json # 可选: 一个使用JSON结构的values.yaml文件
charts/ # 包含chart依赖的其他chart,dependencies中定义的
crds/ # 自定义资源的定义
templates/ # 模板目录, 当和values 结合时,可生成有效的Kubernetes manifest文件
templates/NOTES.txt # 可选: 包含简要使用说明的纯文本文件
# Chart.yaml
apiVersion: chart API 版本 (必需)
name: chart名称 (必需)
version: 语义化2 版本(必需)
kubeVersion: 兼容Kubernetes版本的语义化版本(可选)
description: 一句话对这个项目的描述(可选)
type: chart类型 (可选)
keywords:
- 关于项目的一组关键字(可选)
home: 项目home页面的URL (可选)
sources:
- 项目源码的URL列表(可选)
dependencies: # chart 必要条件列表 (可选) helm dep up foochart将依赖的文件下载到charts目录
- 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含dependencies的结构
hlsjsvr/
├── Chart.yaml
├── values.yaml
├── charts/
│ └── hlsvr-base/
│ ├── Chart.yaml
│ ├── values.yaml
│ └── templates/
│ └── ...(实际的K8s资源模板)
# Chart.yaml 定义了dependencies
dependencies:
- name: hlsvr-base
repository: http://helm.bkrepo.oa.com/public-cluster/public-cluster/
version: 1.30.5
# values.yaml
hlsvr-base: # 这里的只会传递给dependencies的hlsvr-base中
replicaCount: 2
image:
tag: "1.2.3"
渲染时如果指定了外部values,会先覆盖hlsjsvr/values.yaml。发现charts中含有依赖下载依赖到charts目录,使用覆盖后的values.yaml再覆盖hlsvr-base的values.yaml,最终的values去渲染templates的内容
模板文件和values文件和values.schema.json
模板文件位于chart的templates目录中,helm渲染chart时,会遍历其中的每个文件
apiVersion: v1
kind: ReplicationController
metadata:
name: deis-database
namespace: deis
labels:
app.kubernetes.io/managed-by: deis
spec:
replicas: 1
selector:
app.kubernetes.io/name: deis-database
template:
metadata:
labels:
app.kubernetes.io/name: deis-database
spec:
serviceAccount: deis-database
containers:
- name: deis-database
image: {{ .Values.imageRegistry }}/postgres:{{ .Values.dockerTag }}
imagePullPolicy: {{ .Values.pullPolicy }}
ports:
- containerPort: 5432
env:
- name: DATABASE_STORAGE
value: {{ default "minio" .Values.storage }}
values文件可以为chart的依赖项目提供基础值。values.schema.json中可以定义Values文件字段的格式和规范
title: "My WordPress Site" # Sent to the WordPress template
# 相当于在每个chart中增加这个基础值。mysql的模板中可以使用{{.Values.global.app}}访问此内容
global:
app: MyWordPress
mysql: # charts中的MySQL可以访问这两项内容,无法访问title和Apache的内容
max_connections: 100 # Sent to MySQL
password: "secret"
apache:
port: 8080 # Passed to Apache
crd
可以声明自定义资源类型,位于crds目录中。无法使用模板,只能是普通的yaml文档。
创建出一个类似pod的资源类型,不过实际作用还是不太清楚。
crontabs/
Chart.yaml
crds/
crontab.yaml
templates/
mycrontab.yaml
# crontab.yaml
kind: CustomResourceDefinition
metadata:
name: crontabs.stable.example.com
spec:
group: stable.example.com
versions:
- name: v1
served: true
storage: true
scope: Namespaced
names:
plural: crontabs
singular: crontab
kind: CronTab
apiVersion: stable.example.com
kind: CronTab
metadata:
name: {{ .Values.name }}
spec:
crd的安装是全局的,会受到以下的限制
- 不会重现安装,helm确认crds目录已经存在的时候(忽略版本),helm不会安装或升级。
- 不会在升级或回滚中安装,只会在安装时创建crd
- 不会被删除,自动删除crd会删除集群中所有命名空间中所有的crd内容,所以helm不会删除crd
chart Hook
Helm提供了hook机制允许chart开发者在发布生命周期的某些点干预。
- 安装时在加载其他chart之前加载配置映射或者秘钥。
- 安装新chart之前执行备份数据库的任务,升级之后执行第二个任务用于存储数据
- 删除发布之前执行一个任务以便在删除服务之前退出滚动。
pre-install 在模板渲染之后,Kubernetes资源创建之前执行
post-install 在所有资源加载到Kubernetes之后执行
pre-delete 在Kubernetes删除之前,执行删除请求
post-delete 在所有的版本资源删除之后执行删除请求
pre-upgrade 在模板渲染之后,资源更新之前执行一个升级请求
post-upgrade 所有资源升级之后执行一个升级请求
pre-rollback 在模板渲染之后,资源回滚之前,执行一个回滚请求
post-rollback 在所有资源被修改之后执行一个回滚请求
test 调用Helm test子命令时执行 ( test文档)
- helm install foo
- helm库调用安装API
- 安装cards目录中的cad
- 验证后渲染foo模板
- 准备执行pre-install
- 按权重对钩子进行排序,资源种类排序,名称正序排列
- 加载最小权重的钩子(可以使用负数)
- 等到钩子READY状态,资源是JOB或者POD类型时,Helm会等到其运行完成。
- 加载资源到K8S中,设置–wait时会等到所有资源ready,且所有资源准备就绪后才会继续
- 执行post-install钩子
- 等到钩子ready状态
- 反馈发布对象到客户端
- 客户端退出
钩子
apiVersion: batch/v1
kind: Job
metadata:
name: "{{ .Release.Name }}"
labels:
app.kubernetes.io/managed-by: {{ .Release.Service | quote }}
app.kubernetes.io/instance: {{ .Release.Name | quote }}
app.kubernetes.io/version: {{ .Chart.AppVersion }}
helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
annotations: # 在这里定义模板是钩子,否则是一个普通资源
"helm.sh/hook": post-install
"helm.sh/hook-weight": "-5"
"helm.sh/hook-delete-policy": hook-succeeded # before-hook-creation:新钩子启动前删除之前的资源 (默认) hook-succeeded:钩子成功执行之后删除资源 hook-failed:如果钩子执行失败,删除资源
spec:
template:
metadata:
name: "{{ .Release.Name }}"
labels:
app.kubernetes.io/managed-by: {{ .Release.Service | quote }}
app.kubernetes.io/instance: {{ .Release.Name | quote }}
helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
spec:
restartPolicy: Never
containers:
- name: post-install-job
image: "alpine:3.3"
command: ["/bin/sleep","{{ default "10" .Values.sleepyTime }}"]
chart test
验证chart安装,帮助用户理解chart的功能
helm create demo
.
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
│ └── tests
│ └── test-connection.yaml
└── values.yaml
include的内容在_helper.tpl中定义
{{- define "demo.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- if contains $name .Release.Name }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- end }}
# test-connection.yaml
apiVersion: v1
kind: Pod
metadata:
name: "{{ include "demo.fullname" . }}-test-connection"
labels:
{{- include "demo.labels" . | nindent 4 }}
annotations:
"helm.sh/hook": test
spec:
containers:
- name: wget
image: busybox
command: ['wget']
args: ['{{ include "demo.fullname" . }}:{{ .Values.service.port }}']
restartPolicy: Never
$ sudo helm install demo demo
NAME: demo
LAST DEPLOYED: Mon May 12 16:34:29 2025
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
$ sudo helm test demo
NAME: demo
LAST DEPLOYED: Mon May 12 16:34:29 2025
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: demo-test-connection
Last Started: Mon May 12 16:34:49 2025
Last Completed: Mon May 12 16:34:55 2025
Phase: Succeeded
NOTES:
部署时会使用values和tpl来渲染test-connection.yaml。values和tpl只是提供一些内容,实际起作用的是yaml文件
库类型chart
可以定义一些tpl模板放到库中,其他chart可以引用这些库中预先定义的内容。
模板库的Chart.yaml中type为library
引用时在yaml文件中使用include,同时在chart.yaml中添加dependencies
helm来源和完整性
helm package –sign –key进行签名,helm verify进行验证
chart仓库,OCI
https://example.com/charts/index.yaml 其中包含chart的信息和下载地址
helm渲染模板和values的合成覆盖流程
- chart包中的values.yaml是默认值
- 使用-f(–values)指定外部的values文件,会覆盖默认值中的同名配置
- –set,–set-file会再覆盖前面的同名配置
- 合成的最终values用来渲染templates目录中的yaml文件
基于角色的访问控制
Helm插件
Helm可以设置一个插件目录,插件放于目录中,运行helm的插件时会自动在其中寻找。
惯例
- chart名称是小写字母和数字,单词之间使用
-分割,如nginx-hello - yaml使用双空格缩进而不是tab
- values
- 变量使用小写字母开头,单词驼峰区分。
helloWorld: true - Helm内置变量使用大写字母开头
- foo: false和foo: “false”不同。规避类型转换,最好统一使用字符串,即打引号。
- 变量使用小写字母开头,单词驼峰区分。
- 模板
常用命令
日志查询
kubectl logs riichipersonalpanel-0 -n riichi -c istio-proxy