目录
概念
核心组件
Helm客户端
Tiller
Chart
Repository
Release
Helm安装
Helm使用
创建Helm Chart
定义Chart元数据
定义Template模板
定义values参数
打包和部署
Helm Chart 推送到远程仓库
Helm常用命令
概念
Helm 是一个 Kubernetes 的包管理工具,它被称为 Kubernetes 的 “Yum” 或 “Apt”,用于简化应用在 Kubernetes 中的部署、升级和管理。通过 Helm,你可以定义、安装和管理复杂的 Kubernetes 应用。
核心组件
Helm的运行也是依赖各种组件,我们在机器上执行一次Helm实际上也是多个组件执行的结果,Helm总共包括5个核心组件:
Helm客户端
Helm 是一个命令行下的客户端工具。主要用于 Kubernetes 应用程序 Chart 的创建、打包、发布以及创建和管理本地和远程的 Chart 仓库。
Tiller
Tiller 是 Helm 的服务端,部署在 Kubernetes 集群中。Tiller 用于接收 Helm 的请求,并根据 Chart 生成 Kubernetes 的部署文件( Helm 称为 Release ),然后提交给 Kubernetes 创建应用。Tiller 还提供了 Release 的升级、删除、回滚等一系列功能。
Chart
- Chart 是一个 Helm 包,包含 Kubernetes 应用的资源定义文件(YAML 格式)和模板文件(用于动态生成 Kubernetes 资源)。Chart 是 Helm 的基本单元,相当于一个应用模板包。
- 一个 Chart 可以用于部署多种环境,例如开发、测试和生产,只需要修改配置值。
Repository
Repository 是存放 Helm Chart 的地方,类似于 Docker 镜像仓库。官方的 Chart 仓库是 Artifact Hub,你也可以搭建私有仓库。
Release
- 每次使用一个 Chart 部署应用时,Helm 会创建一个 Release。
- Release 是 Chart 的运行实例。可以有多个 Release 运行同一个 Chart,但每个 Release 会有不同的名称和配置。
Helm安装
安装 Helm CLI
- 从 Helm 官方获取安装脚本:
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 chmod 700 get_helm.sh ./get_helm.sh
验证安装
helm version// 如果安装成功,你会看到类似以下的输出:
version.BuildInfo{Version:"v3.x.x", GitCommit:"xxxx", GitTreeState:"clean", GoVersion:"go1.x"}
Helm使用
介绍了这么多,现在用示例来看看如何使用Helm来部署kubernetes资源。
创建Helm Chart
Chart是一个项目包,也是执行Helm的基础,所有的定义都是在Chart中定义的,我们使用Helm部署一些中间件的时候,比如nginx、Kafka等这些,都是仓库中已有的Chart直接使用,这里我们直接自己自定义一个Chart定义自己的项目。
创建Chart命令:
helm create my-app
这样可以生成一个my-app项目,项目目录如下:
目录结构说明:
- Chart.yaml:Chart的元数据,定义Chart的名称和版本
- values.yaml:默认配置参数,配置Kubernetes的一些参数,配合模板使用
- templates:Kubernetes的资源模板,比如Deployment、service、pod等
- charts:存放依赖的子Chart目录,一般是已经打包成.tgz文件的chart文件
定义Chart元数据
apiVersion: v2
name: my-app
description: A Helm chart for my business app
version: 1.0.0
appVersion: 1.0.0
定义Template模板
这里我们定义一个WEB业务项目中常用的资源,有Deployment、Service、Ingress:
创建Deployment模板:
apiVersion: apps/v1
kind: Deployment
metadata:name: {{ .Release.Name }}labels:app: {{ .Chart.Name }}
spec:replicas: {{ .Values.replicaCount }}selector:matchLabels:app: {{ .Chart.Name }}template:metadata:labels:app: {{ .Chart.Name }}spec:containers:- name: {{ .Chart.Name }}image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"ports:- containerPort: 80resources:{{- toYaml .Values.resources | nindent 12 }}
创建Service模板:
apiVersion: v1
kind: Service
metadata:name: {{ .Release.Name }}labels:app: {{ .Chart.Name }}
spec:type: {{ .Values.service.type }}ports:- port: {{ .Values.service.port }}targetPort: 80selector:app: {{ .Chart.Name }}
创建Ingress:
{{- if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: {{ .Release.Name }}annotations:nginx.ingress.kubernetes.io/rewrite-target: /
spec:rules:- host: {{ .Values.ingress.host }}http:paths:- path: /pathType: Prefixbackend:service:name: {{ .Release.Name }}port:number: {{ .Values.service.port }}
{{- end }}
这样一个常规web项目就定义好了,我们定义了项目的镜像还有访问方式,可以看到和我们平时用kubernetes app -f xxx.yaml的方式不同,这里的yaml资源值都是用参数表示的,我们仅仅是定义了一个模板,参数都是动态的,可想而知如果是多个这样的web项目,我们是不是只需要这样一个模板就可以随意部署我们的项目了,是不是很方便。
定义values参数
values.yaml是配合template使用的,定义template模板中使用的默认参数:
replicaCount: 2image:repository: myregistry.com/my-apptag: "1.0.0"pullPolicy: IfNotPresentservice:type: ClusterIPport: 80ingress:enabled: truehost: my-app.example.comresources:limits:cpu: 500mmemory: 256Mirequests:cpu: 250mmemory: 128Mi
打包和部署
Chart项目的内容都定义好了,现在只需要打包成.tgz文件,然后通过Helm部署就可以了。
- 打包Chart
helm package my-app
- 部署到Kubernetes
// 命令格式 heml install {name} {chart}// 通过源文件直接部署 helm install my-app ./my-app// 通过已经打好的chart包部署 helm install my-app my-app-1.0.0.tgz
这样资源就部署好了,我们可以通过kubernetes命令进行查看,也可以通过helm list查看
上面这个部署方式用的是默认values.yaml里定义的参数,我们也可以在执行命令的时候定义参数,这样模板就动态创建不同的资源了:
- 使用set
helm install my-app ./my-app \--set replicaCount=3 \--set image.tag="2.0.0"
- 使用
--set-file
传递文件中的值
如果值较为复杂,或者需要动态加载值,可以将参数放到文件中,通过--set-file
引入。
创建一个文件override-values.yaml
:
安装命令:replicaCount: 5image:repository: custom.registry.com/my-apptag: "3.0.0"
helm install my-app ./my-app -f override-values.yaml
Helm Chart 推送到远程仓库
从上面可以看到,Chart是一个模板项目,通过不同的参数可以创建不同的资源,所以模板是共用的,可以保存在Chart的仓库中。
- 添加Helm仓库
helm repo add my-repo https://my-repo.com/charts
- 推送Chart使用插件helm-push
helm push my-app-1.0.0.tgz my-repo
Helm常用命令
命令 | 功能说明 |
---|---|
helm create <chart-name> | 创建一个新的 Chart 项目目录结构。 |
helm lint <chart-path> | 检查 Chart 的语法和结构是否正确。 |
helm install <release-name> <chart> | 安装一个 Chart 并创建一个 Release。 |
helm upgrade <release-name> <chart> | 升级指定的 Release,并应用最新的 Chart 更改。 |
helm uninstall <release-name> | 删除指定的 Release,同时清理相关的 Kubernetes 资源。 |
helm rollback <release-name> <rev> | 回滚指定 Release 到指定的版本(默认上一个版本)。 |
helm list | 列出当前 Kubernetes 集群中所有的 Helm Releases。 |
helm repo add <repo-name> <repo-url> | 添加一个 Chart 仓库到本地。 |
helm repo update | 更新本地的 Chart 仓库索引,拉取最新的仓库信息。 |
helm search repo <keyword> | 在本地添加的仓库中搜索 Chart。 |
helm search hub <keyword> | 在 Helm Hub 上搜索 Chart(需联网)。 |
helm template <chart> | 渲染 Chart 模板为 Kubernetes 资源清单文件(不执行部署)。 |
helm package <chart-path> | 将 Chart 打包成一个 .tgz 文件,用于分发和发布。 |
helm show values <chart> | 显示指定 Chart 的默认 values.yaml 配置内容。 |
helm get values <release-name> | 查看指定 Release 的实际生效配置值。 |
helm get manifest <release-name> | 查看指定 Release 渲染后的 Kubernetes 资源清单文件。 |
helm get all <release-name> | 获取指定 Release 的所有相关信息(包含配置、清单等)。 |
helm dependency update | 更新 Chart 的依赖,下载 Chart.yaml 中定义的子 Chart 到 charts/ 目录。 |
helm dependency build | 构建 Chart 的依赖,功能与 helm dependency update 类似,主要用于初始构建。 |
helm history <release-name> | 查看指定 Release 的历史版本记录。 |
helm env | 显示 Helm 的环境变量信息(例如仓库路径、缓存路径等)。 |
helm test <release-name> | 运行 Chart 定义的测试用例,用于验证部署是否成功。 |
helm pull <chart-repo> | 从远程仓库拉取 Chart 包到本地(支持版本选择)。 |
helm plugin list | 列出已安装的 Helm 插件。 |
helm version | 显示 Helm 的版本信息。 |