Helm 完全指南:从文件结构到实战应用
Helm 完全指南:从文件结构到实战应用
什么是 Helm?
Helm 是 Kubernetes 的包管理器,类似于 Ubuntu 中的 apt、CentOS 中的 yum 或 Python 中的 pip,能够快速查找、下载和安装软件包。它将一组 Kubernetes 资源打包统一管理,是查找、共享和使用为 Kubernetes 构建的软件的最佳方式。
Helm Chart 文件结构
Helm 使用的包格式称为 Chart,它是一个描述 Kubernetes 相关资源的文件集合。单个 Chart 可以用来部署简单的应用(如 memcache pod),也可以部署复杂的全栈应用(如包含 HTTP 服务器、数据库、缓存等组件的系统)。
典型的 Chart 文件结构
当你下载一个 Chart 后(使用 helm pull chartrepo/chartname 命令),会得到如下文件结构:
wordpress/ # Chart 根目录 Chart.yaml # 包含 Chart 元数据的 YAML 文件 LICENSE # 可选:包含 Chart 许可证的纯文本文件 README.md # 可选:可读的 README 文件,通常包含使用说明 values.yaml # Chart 默认的配置值 values.schema.json # 可选:values.yaml 文件的 JSON 模式定义 charts/ # 包含 Chart 依赖的其他 Chart crds/ # 自定义资源定义文件 templates/ # 模板目录,与 values 结合生成 Kubernetes 清单文件 templates/NOTES.txt # 可选:包含简要使用说明的纯文本文件
Chart 核心文件详解与使用方法
1. Chart.yaml
Chart.yaml 是 Chart 的核心文件,包含了 Chart 的元数据信息。
示例与说明:
apiVersion:v2# Chart API 版本(必需)name:wordpress# Chart 名称(必需)version:10.0.0# 语义化 2.0 版本(必需)kubeVersion:'>=1.21.0-0'# 兼容的 Kubernetes 版本(可选)description:Webpublishingplatformforbuildingblogsandwebsites.# 项目描述(可选)type:application# Chart 类型(可选)keywords:# 项目关键字列表(可选)-wordpress-cms-blog-http-web-application-phphome:https://wordpress.org/# 项目主页 URL(可选)sources:# 项目源码 URL 列表(可选)-https://github.com/bitnami/charts/tree/master/bitnami/wordpressdependencies:# Chart 依赖列表(可选)-name:nginx# 依赖的 Chart 名称version:13.2.23# 依赖的 Chart 版本repository:https://charts.bitnami.com/bitnami# 依赖的 Chart 仓库 URLcondition:nginx.enabled# 启用/禁用依赖的条件-name:mariadbversion:11.4.0repository:https://charts.bitnami.com/bitnamicondition:mariadb.enabledtags:-wordpress-databasemaintainers:# 维护者信息(可选)-name:Bitnamiemail:containers@bitnami.comurl:https://bitnami.comicon:https://bitnami.com/assets/stacks/wordpress/img/wordpress-stack-220x234.png# 图标 URL(可选)appVersion:6.4.3# 包含的应用版本(可选)deprecated:false# 是否为废弃的 Chart(可选,布尔值)annotations:# 注释列表(可选)category:CMS
使用方法:
-
创建 Chart 时,首先需要编写 Chart.yaml文件,定义 Chart 的基本信息 -
当你需要更新 Chart 版本或依赖时,修改此文件 -
Helm 命令会根据此文件中的信息验证和处理 Chart
2. values.yaml
values.yaml 文件包含了 Chart 的默认配置值,这些值可以在安装或升级时被覆盖。
示例与说明:
# 全局配置global:postgresql:auth:username:bn_wordpressdatabase:bitnami_wordpress# WordPress 配置wordpress:username:userpassword:passwordemail:user@example.comfirstName:FirstNamelastName:LastNameblogName:User'sBlog!scheme:httphost:localhostexternalPort:80# 数据库配置mariadb:enabled:trueauth:rootPassword:passwordusername:bn_wordpresspassword:passworddatabase:bitnami_wordpress# Nginx 配置nginx:enabled:trueservice:port:http:80
使用方法:
-
安装 Chart 时,可以使用 --set参数覆盖默认值:helm install my-release bitnami/wordpress --set wordpress.username=admin -
也可以创建自定义 values 文件,使用 -f参数指定:helm install my-release bitnami/wordpress -f custom-values.yaml -
在模板文件中,使用 {{ .Values.key }}引用这些值
3. templates 目录
templates 目录包含了 Kubernetes 资源的模板文件,使用 Go 模板语法编写。当 Helm 安装或升级 Chart 时,会将这些模板与 values 结合,生成实际的 Kubernetes 清单文件。
常见模板文件:
-
templates/deployment.yaml:定义应用的 Deployment -
templates/service.yaml:定义应用的 Service -
templates/ingress.yaml:定义应用的 Ingress -
templates/configmap.yaml:定义应用的 ConfigMap -
templates/secrets.yaml:定义应用的 Secrets -
templates/_helpers.tpl:包含可重用的模板片段
模板使用示例:
# templates/deployment.yaml 示例apiVersion:apps/v1kind:Deploymentmetadata:name:{{include"wordpress.fullname".}}labels:{{-include"wordpress.labels".|nindent4}}spec:replicas:{{.Values.replicaCount}}selector:matchLabels:{{-include"wordpress.selectorLabels".|nindent6}}template:metadata:{{-with.Values.podAnnotations}}annotations:{{-toYaml.|nindent8}}{{-end}}labels:{{-include"wordpress.selectorLabels".|nindent8}}spec:containers:-name:{{.Chart.Name}}image:"{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"ports:-name:httpcontainerPort:80protocol:TCP
使用方法:
-
编写模板时,使用 Go 模板语法和 Helm 内置函数 -
使用 {{ include "template-name" . }}引用_helpers.tpl中的模板片段 -
使用 {{ toYaml .Values.someValue }}将值转换为 YAML 格式 -
使用 {{ nindent 4 }}控制缩进
4. charts 目录
charts 目录包含了当前 Chart 依赖的其他 Chart。当你使用 helm dependency update 命令时,Helm 会下载这些依赖到 charts 目录。
使用方法:
-
在 Chart.yaml中定义依赖 -
运行 helm dependency update下载依赖 -
依赖的 Chart 会被打包到最终的 Chart 中
5. crds 目录
crds 目录包含了自定义资源定义(Custom Resource Definitions)文件。当你安装 Chart 时,Helm 会先创建这些自定义资源定义。
使用方法:
-
将自定义资源定义文件放在 crds目录中 -
Helm 会自动处理这些 CRD 的创建和更新
6. templates/NOTES.txt
NOTES.txt 文件包含了安装后的使用说明,当你安装或升级 Chart 后,Helm 会显示这些说明。
示例:
1. Get the WordPress URL by running:{{- if .Values.nginx.enabled }} {{- if .Values.nginx.service.type }} {{- if eq .Values.nginx.service.type "LoadBalancer" }} NOTE: It may take a few minutes for the LoadBalancer IP to be available. Watch the status with: 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ include "wordpress.nginx.fullname" . }}' export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "wordpress.nginx.fullname" . }} --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}") {{- else if eq .Values.nginx.service.type "ClusterIP" }} export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "wordpress.nginx.fullname" . }} --template "{{ .spec.clusterIP }}") {{- else if eq .Values.nginx.service.type "NodePort" }} export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "wordpress.nginx.fullname" . }}) export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") export SERVICE_IP="http://$NODE_IP:$NODE_PORT" {{- end }}{{- else }} {{- if .Values.service.type }} {{- if eq .Values.service.type "LoadBalancer" }} NOTE: It may take a few minutes for the LoadBalancer IP to be available. Watch the status with: 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ include "wordpress.fullname" . }}' export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "wordpress.fullname" . }} --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}") {{- else if eq .Values.service.type "ClusterIP" }} export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "wordpress.fullname" . }} --template "{{ .spec.clusterIP }}") {{- else if eq .Values.service.type "NodePort" }} export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "wordpress.fullname" . }}) export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") export SERVICE_IP="http://$NODE_IP:$NODE_PORT" {{- end }}{{- end }}echo "WordPress URL: http://$SERVICE_IP/"echo "WordPress Admin URL: http://$SERVICE_IP/admin/"2. Login with the following credentials to see your blog: echo Username: user echo Password: $(kubectl get secret --namespace {{ .Release.Namespace }} {{ include "wordpress.fullname" . }} -o jsonpath="{.data.wordpress-password}" | base64 --decode)
使用方法:
-
安装 Chart 后,Helm 会自动显示这些说明 -
可以在说明中包含动态内容,使用模板语法引用 values
Helm 实战操作示例
1. 创建新的 Chart
helm create my-chart
这会创建一个名为 my-chart 的目录,包含基本的 Chart 文件结构。
2. 安装 Chart
# 从仓库安装helm install my-release bitnami/wordpress# 从本地目录安装helm install my-release ./my-chart# 指定自定义 valueshelm install my-release bitnami/wordpress -f custom-values.yaml# 使用 --set 覆盖值helm install my-release bitnami/wordpress --set wordpress.username=admin --set wordpress.password=secret
3. 升级 Chart
# 升级已安装的 Releasehelm upgrade my-release bitnami/wordpress# 升级时指定新的 valueshelm upgrade my-release bitnami/wordpress -f new-values.yaml
4. 查看已安装的 Releases
helm list
5. 卸载 Release
helm uninstall my-release
示例 1:自定义部署 Nginx 服务
步骤 1:创建自定义 Chart
helm create my-nginxcd my-nginx
步骤 2:修改 values.yaml 文件
replicaCount:2image:repository:nginxpullPolicy:IfNotPresenttag:"1.21.6"service:type:NodePortport:80nodePort:30080ingress:enabled:trueclassName:""annotations:kubernetes.io/ingress.class:nginxhosts:-host:nginx.example.compaths:-path:/pathType:ImplementationSpecificresources:limits:cpu:100mmemory:128Mirequests:cpu:100mmemory:128Mi
步骤 3:修改 templates/deployment.yaml 文件
apiVersion:apps/v1kind:Deploymentmetadata:name:{{include"my-nginx.fullname".}}labels:{{-include"my-nginx.labels".|nindent4}}spec:replicas:{{.Values.replicaCount}}selector:matchLabels:{{-include"my-nginx.selectorLabels".|nindent6}}template:metadata:{{-with.Values.podAnnotations}}annotations:{{-toYaml.|nindent8}}{{-end}}labels:{{-include"my-nginx.selectorLabels".|nindent8}}spec:{{-with.Values.imagePullSecrets}}imagePullSecrets:{{-toYaml.|nindent8}}{{-end}}containers:-name:{{.Chart.Name}}image:"{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"imagePullPolicy:{{.Values.image.pullPolicy}}ports:-name:httpcontainerPort:80protocol:TCPlivenessProbe:httpGet:path:/port:httpreadinessProbe:httpGet:path:/port:httpresources:{{-toYaml.Values.resources|nindent12}}
步骤 4:安装自定义 Chart
helm install my-nginx ./my-nginx
步骤 5:验证部署
kubectl get podskubectl get svckubectl get ingress
示例 2:部署带有持久化存储的 MySQL
步骤 1:创建自定义 Chart
helm create my-mysqlcd my-mysql
步骤 2:修改 values.yaml 文件
image:repository:mysqltag:8.0.28pullPolicy:IfNotPresentmysql:rootPassword:"root-secret"user:"app-user"password:"app-secret"database:"app-db"persistence:enabled:truesize:10GistorageClass:"standard"service:port:3306
步骤 3:修改 templates/deployment.yaml 文件
apiVersion:apps/v1kind:Deploymentmetadata:name:{{include"my-mysql.fullname".}}labels:{{-include"my-mysql.labels".|nindent4}}spec:replicas:1selector:matchLabels:{{-include"my-mysql.selectorLabels".|nindent6}}template:metadata:{{-with.Values.podAnnotations}}annotations:{{-toYaml.|nindent8}}{{-end}}labels:{{-include"my-mysql.selectorLabels".|nindent8}}spec:containers:-name:{{.Chart.Name}}image:"{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"imagePullPolicy:{{.Values.image.pullPolicy}}env:-name:MYSQL_ROOT_PASSWORDvalue:{{.Values.mysql.rootPassword}}-name:MYSQL_USERvalue:{{.Values.mysql.user}}-name:MYSQL_PASSWORDvalue:{{.Values.mysql.password}}-name:MYSQL_DATABASEvalue:{{.Values.mysql.database}}ports:-name:mysqlcontainerPort:3306protocol:TCPvolumeMounts:-name:mysql-datamountPath:/var/lib/mysqlresources:{{-toYaml.Values.resources|nindent12}}volumes:-name:mysql-datapersistentVolumeClaim:claimName:{{include"my-mysql.fullname".}}-pvc
步骤 4:添加 templates/pvc.yaml 文件
apiVersion:v1kind:PersistentVolumeClaimmetadata:name:{{include"my-mysql.fullname".}}-pvclabels:{{-include"my-mysql.labels".|nindent4}}spec:accessModes:-ReadWriteOnceresources:requests:storage:{{.Values.persistence.size}}storageClassName:{{.Values.persistence.storageClass}}
步骤 5:安装自定义 Chart
helm install my-mysql ./my-mysql
步骤 6:验证部署
kubectl get podskubectl get svckubectl get pvc
示例 3:使用 Helm 管理多环境部署
步骤 1:创建环境特定的 values 文件
# 开发环境cat > values-dev.yaml << EOFreplicaCount: 1image: tag: "dev"env: name: "development"EOF# 生产环境cat > values-prod.yaml << EOFreplicaCount: 3image: tag: "prod"env: name: "production"EOF
步骤 2:安装到不同环境
# 安装到开发环境helm install my-app-dev ./my-app -f values-dev.yaml -n dev# 安装到生产环境helm install my-app-prod ./my-app -f values-prod.yaml -n prod
步骤 3:管理环境差异
通过不同的 values 文件,可以轻松管理不同环境的配置差异,而无需修改 Chart 本身。
总结
Helm 通过标准化的 Chart 结构和强大的模板系统,大大简化了 Kubernetes 应用的管理。掌握 Helm Chart 的文件结构和使用方法,能够帮助你:
-
更高效地打包和部署 Kubernetes 应用 -
实现应用配置的标准化和版本控制 -
简化应用的升级和回滚操作 -
方便地共享和重用 Kubernetes 应用配置 -
轻松管理多环境部署
如果你对 Helm 有任何疑问或想了解更多高级用法,欢迎在评论区留言讨论。
CSDN 账号:https://blog.csdn.net/qq_39965541
夜雨聆风
