乐于分享
好东西不私藏

Helm 完全指南:从文件结构到实战应用

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

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » Helm 完全指南:从文件结构到实战应用

评论 抢沙发

6 + 3 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮