从入门到精通:Helm Charts 创建初学者指南

简介


Kubernetes 彻底革新了容器编排,Helm Chart 已成为管理 Kubernetes 应用程序的事实上的标准。如果您是 Helm 新手,本指南将指导您从零开始创建自己的 Helm Chart,助您从零开始成为大师!

什么是 Helm Chart?


Helm Chart 是一个预配置的 Kubernetes 资源包。它包含在 Kubernetes 中部署和管理应用程序所需的一切,包括:

  • 模板:定义 Kubernetes 资源(例如部署、服务等)的 YAML 清单。
  • 值:用于自定义部署的配置选项。
  • 元数据:描述 Chart 的文件,例如其名称和版本。


先决条件

  1. Kubernetes 集群:确保您可以访问正在运行的 Kubernetes 集群。
  2. 已安装 kubectl:用于与您的集群交互。
  3. 已安装 Helm:按照官方指南安装 Helm。

步骤 1:创建 Helm Chart


首先使用 helm create 命令创建 Helm Chart:

ninjamac@ip-192-168-1-95 helm % helm create my-application
Creating my-application

这将生成一个名为 my-application 的文件夹,其结构如下:

ninjamac@ip-192-168-1-95 helm % tree -L 3
.
└── my-application
    ├── Chart.yaml
    ├── charts
    ├── templates
    │   ├── NOTES.txt
    │   ├── _helpers.tpl
    │   ├── deployment.yaml
    │   ├── hpa.yaml
    │   ├── ingress.yaml
    │   ├── service.yaml
    │   ├── serviceaccount.yaml
    │   └── tests
    └── values.yaml

5 directories, 9 files

步骤2:了解图表结构


Chart.yaml
此文件定义了图表的元数据。

apiVersion: v2
name: my-application
description: A Helm chart for Kubernetes
type: application
version: 0.1.0
appVersion: "1.16.0"

values.yaml
这是图表的默认配置文件。用户可以在部署期间覆盖这些值。

replicaCount: 1

image:
  repository: nginx
  pullPolicy: IfNotPresent
  tag: "1.20"
service:
  type: ClusterIP
  port: 80
ingress:
  enabled: false
  className: ""
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  hosts:
    - host: example.com
      paths:

templates/
此文件夹包含使用 Go 模板进行动态配置的 Kubernetes 清单。

步骤 3:自定义部署


编辑 templates/deployment.yaml 文件以定义应用程序的部署资源:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-deployment
  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: {{ .Values.service.port }}

步骤 4:部署 Helm Chart


要将 Chart 部署到 Kubernetes 集群,请使用:

ninjamac@ip-192-168-1-95 helm % helm install my-release ./my-application
NAME: my-release
LAST DEPLOYED: Wed Apr 16 15:51:05 2025
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=my-application,app.kubernetes.io/instance=my-release" -o jsonpath="{.items[0].metadata.name}")
  export CONTAINER_PORT=$(kubectl get pod --namespace default $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl --namespace default port-forward $POD_NAME 8080:$CONTAINER_PORT

检查deployment

ninjamac@ip-192-168-1-95 helm % kubectl get pod
NAME                                     READY   STATUS             RESTARTS        AGE
my-release-deployment-78b99bd958-zs79x   1/1     Running            0               71s

覆盖默认值


您可以使用 --set 参数覆盖 values.yaml 文件:helm install my-release ./my-application --set replicaCount=3

ninjamac@ip-192-168-1-95 helm % helm install my-release ./my-application --set replicaCount=3 
NAME: my-release
LAST DEPLOYED: Wed Apr 16 16:02:30 2025
NAMESPACE: default
STATUS: deployed
REVISION: 1

步骤 5:测试和调试


查看发布状态


helm status my-release

ninjamac@ip-192-168-1-95 helm % helm status my-release
NAME: my-release
LAST DEPLOYED: Wed Apr 16 16:02:30 2025
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:


dry-run


使用 --dry-run 参数模拟部署:

helm install my-release ./my-application --dry-run

ninjamac@ip-192-168-1-95 helm % helm install my-release ./my-application --dry-run
NAME: my-release
LAST DEPLOYED: Wed Apr 16 16:07:06 2025
NAMESPACE: default
STATUS: pending-install
REVISION: 1
HOOKS:
---
# Source: my-application/templates/tests/test-connection.yaml
apiVersion: v1
kind: Pod
metadata:
  name: "my-release-my-application-test-connection"
  labels:
    helm.sh/chart: my-application-0.1.0
    app.kubernetes.io/name: my-application
    app.kubernetes.io/instance: my-release
    app.kubernetes.io/version: "1.16.0"
    app.kubernetes.io/managed-by: Helm
  annotations:
    "helm.sh/hook": test
spec:
  containers:
    - name: wget
      image: busybox
      command: ['wget']
      args: ['my-release-my-application:80']
  restartPolicy: Never
MANIFEST:
---
# Source: my-application/templates/serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-release-my-application
  labels:
    helm.sh/chart: my-application-0.1.0
    app.kubernetes.io/name: my-application
    app.kubernetes.io/instance: my-release
    app.kubernetes.io/version: "1.16.0"
    app.kubernetes.io/managed-by: Helm
automountServiceAccountToken: true
---
# Source: my-application/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-release-my-application
  labels:
    helm.sh/chart: my-application-0.1.0
    app.kubernetes.io/name: my-application
    app.kubernetes.io/instance: my-release
    app.kubernetes.io/version: "1.16.0"
    app.kubernetes.io/managed-by: Helm
spec:
  type: ClusterIP
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
      name: http
  selector:
    app.kubernetes.io/name: my-application
    app.kubernetes.io/instance: my-release
---
# Source: my-application/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-release-deployment
  labels:
    app: my-application
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-application
  template:
    metadata:
      labels:
        app: my-application
    spec:
      containers:
        - name: my-application
          image: "nginx:1.20"
          imagePullPolicy: IfNotPresent
          ports:
            - name: http
              containerPort: 80
              protocol: TCP


升级发布版本


更新 chart 并应用更改:

helm upgrade my-release ./my-application

ninjamac@ip-192-168-1-95 helm % helm upgrade my-release ./my-application 
Release "my-release" has been upgraded. Happy Helming!
NAME: my-release
LAST DEPLOYED: Wed Apr 16 16:08:40 2025
NAMESPACE: default
STATUS: deployed
REVISION: 2

回滚到上一个版本

helm rollback my-release ./my-application

ninjamac@ip-192-168-1-95 helm % helm rollback my-release
Rollback was a success! Happy Helming!

 

步骤 6:打包并共享


打包 Chart


要将您的 Chart 打包为 .tgz 文件,请执行以下操作:

helm package ./my-application

ninjamac@ip-192-168-1-95 helm % helm package ./my-application 
Successfully packaged chart and saved it to: /Users/ninjamac/Desktop/Rock/helm/my-application-0.1.0.tgz
ninjamac@ip-192-168-1-95 helm % ls -al
total 8
drwxr-xr-x   4 ninjamac  staff   128  4 16 16:12 .
drwxr-xr-x@ 75 ninjamac  staff  2400  4 16 15:15 ..
drwxr-xr-x   7 ninjamac  staff   224  4 16 15:32 my-application
-rw-r--r--   1 ninjamac  staff  3811  4 16 16:12 my-application-0.1.0.tgz


托管您的 Chart


您可以将 Chart 托管在 Helm 仓库(例如 GitHub Pages 或 Artifact Hub)上。

Helm CLI

# General Commands
helm help                 # Display help for Helm
helm version              # Show the Helm version information

# Chart Management
helm create <name>        # Create a new Helm chart
helm lint <chart>         # Run a linter to validate a chart
helm dependency update    # Update dependencies for a chart
helm dependency build     # Rebuild dependencies for a chart
helm dependency list      # List dependencies of a chart

# Repository Management
helm repo add <name> <url>    # Add a Helm repository
helm repo list                # List all Helm repositories
helm repo update              # Update Helm repositories
helm repo remove <name>       # Remove a Helm repository
helm search hub <keyword>     # Search charts on Artifact Hub
helm search repo <keyword>    # Search charts in Helm repositories

# Release Management
helm install <name> <chart>                # Install a Helm chart
helm upgrade <release> <chart>             # Upgrade a release
helm rollback <release> <revision>         # Roll back a release to a previous revision
helm uninstall <release>                   # Uninstall a release
helm list                                  # List all Helm releases
helm status <release>                      # Show the status of a release
helm history <release>                     # View the history of a release

# Template Rendering
helm template <name> <chart> [flags]       # Render chart templates locally
helm get values <release>                  # Get the values of a release
helm get manifest <release>                # Get the manifest of a release
helm get notes <release>                   # Get the notes of a release

# Debugging and Testing
helm test <release> [flags]                # Run tests for a release
helm install --dry-run <name> <chart>      # Simulate an install without executing
helm upgrade --dry-run <release> <chart>   # Simulate an upgrade without executing
helm get hooks <release>                   # Get hooks of a release

# Chart Packaging and Publishing
helm package <chart>                       # Package a chart into a .tgz file
helm push <chart.tgz> <repository>         # Push a packaged chart to a repository (Helm plugin required)
helm show chart <chart>                    # Show detailed information about a chart
helm show values <chart>                   # Show default values for a chart
helm show all <chart>                      # Show all information about a chart

# Cleanup
helm delete <release>                      # Alias for `uninstall`
helm repo cleanup                          # Remove old cache files from repositories

# Plugin Management
helm plugin install <url>                  # Install a Helm plugin
helm plugin list                           # List installed Helm plugins
helm plugin update <name>                  # Update a Helm plugin
helm plugin uninstall <name>               # Remove a Helm plugin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云攀登者-望正茂

你的鼓你的鼓励是我前进的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值