Helm 核心概念

在深入了解 Helm 命令之前,我们先来熟悉几个关键概念:

  • Chart: Helm 的包格式,可以理解为 K8s 应用的安装包。一个 Chart 包含了一组 Kubernetes YAML 文件模板、默认配置(values)以及 Chart 的元数据。
  • Release: Chart 在 Kubernetes 集群中的一个部署实例。每次通过 Helm 安装或升级 Chart 都会创建一个新的 Release。
  • Repository (仓库): Helm Chart 的存储仓库,类似于 Docker Hub。官方仓库有 https://charts.helm.sh/stable,你也可以自定义仓库。
  • Values: Chart 的配置参数,以 values.yaml 文件形式存在。你可以通过修改 values 文件来定制 Chart 的部署行为。
  • Revision: Release 的版本号。每次 Release 升级时都会创建一个新的 Revision,用于回滚。

Helm 安装与基本配置

  1. Helm 客户端安装: 根据你的操作系统,从 Helm 官方网站下载并安装 Helm 客户端。

  2. 添加 Helm 仓库: 使用 helm repo add 命令添加 Chart 仓库:

    helm repo add <repo_name> <repo_url>
    helm repo update # 更新本地仓库索引
    

    例如:添加官方 bitnami 仓库:

    helm repo add bitnami https://charts.bitnami.com/bitnami
    helm repo update
    

Helm 常用命令详解

1. 版本查看:

  • helm version: 查看 Helm 客户端版本信息。

2. Chart 管理:

  • helm show chart <chart_path_or_repo>: 显示 Chart 的元数据信息。
  • helm show values <chart_path_or_repo>: 显示 Chart 的默认 values.yaml 文件内容。
  • helm pull <repo_name>/<chart_name> --version <version>: 下载指定版本的 Chart 包到本地。
  • helm search repo <chart_name>: 在仓库中搜索 Chart。
  • helm repo list: 列出已添加的 Helm 仓库。

3. Release 管理:

  • helm install <release_name> <chart_path_or_repo> [flags]: 安装 Chart 到 Kubernetes 集群中,创建一个 Release。
  • helm upgrade <release_name> <chart_path_or_repo> [flags]: 升级已存在的 Release。
  • helm uninstall <release_name>: 卸载 Release。
  • helm list: 列出当前命名空间下的所有 Release。
  • helm status <release_name>: 查看 Release 的状态。
  • helm history <release_name>: 查看 Release 的历史版本记录。
  • helm rollback <release_name> <revision> [flags]: 回滚 Release 到指定的版本。
  • helm get values <release_name>: 查看 Release 当前生效的 values。
  • helm get all <release_name>: 查看 Release 的所有信息 (包括 values 和 manifest)。
  • helm template <release_name> <chart_path_or_repo> [flags]: 渲染 Chart 模板,查看生成的 Kubernetes YAML 文件。

4. 自定义 Values:

  • 使用 -f/--values 指定 values 文件:

    helm install my-release my-chart -f my-values.yaml
    helm upgrade my-release my-chart --values custom-values.yaml
    
  • 使用多个 values 文件进行覆盖:

    helm install my-release my-chart -f base.yaml -f dev.yaml
    helm upgrade my-release my-chart --values base.yaml --values staging.yaml
    
  • 使用 --set 参数覆盖值:

     helm install my-release my-chart -f my-values.yaml --set replicaCount=3
     helm upgrade my-release my-chart -f my-values.yaml --set service.type=LoadBalancer
    
  • 使用 --set-string 参数覆盖字符串值:

    helm install my-release my-chart -f my-values.yaml --set-string image.tag=v2.0.0
    
  • 使用 --set-file 参数覆盖文件类型的值:

      helm install my-release my-chart -f my-values.yaml --set-file config.json=path/to/config.json
    

5. 常用 flags:

  • --dry-run: 模拟执行,不实际部署。常用于测试配置文件。
  • --debug: 输出详细的调试信息。
  • -n/--namespace: 指定命名空间。
  • --create-namespace: 如果命名空间不存在,则创建。
  • --force: 强制执行操作,包括回滚和升级(慎用)。
  • --version: 指定 Chart 版本。
  • --repo: 指定 Chart 仓库。
  • --recreate-pods: 在回滚时重新创建 Pod.

Helm 高级技巧与最佳实践

  • 充分利用 helm show values: 在部署前,先查看 Chart 的默认 values.yaml 文件,了解所有可配置的参数及其默认值。
  • 保持 values.yaml 文件整洁: 将所有需要的自定义配置都放在 values 文件中,避免过度使用 --set 参数。
  • 合理使用多个 values 文件: 使用一个基础的 values 文件,然后根据不同环境,使用额外的 values 文件进行覆盖。
  • 利用 --dry-run 模拟部署: 在实际部署前,使用 --dry-run 标志,可以确保你的配置没有问题。
  • 使用 helm template 查看最终的 Kubernetes YAML 文件: 使用 helm template 命令渲染 Chart,查看最终的 YAML 文件,确认配置和资源是否符合预期。
  • 理解 Helm Secret 的存储: Helm Release 的信息存储在 Kubernetes 的 ConfigMap 或 Secret 中。 这些 Secret 中的数据经过 Gzip 压缩和 Base64 编码,需要使用 base64 -d | gzip -d 命令解码。
  • 使用 helm registry login 进行私有仓库认证: 如果你的 chart 是从私有仓库拉取的,你需要使用 helm registry login 进行认证,并配置 registry config 文件,才能正常拉取 chart。
  • 注意 Chart 的兼容性: 定期检查 Chart 的更新,确保你的 Chart 与 Kubernetes 版本兼容。

Helm 代理配置

当你的 Helm 客户端需要通过代理访问网络时,可以通过以下方式进行配置:

  1. 环境变量: 设置 HTTP_PROXYHTTPS_PROXY 环境变量。

    export HTTP_PROXY=http://<proxy_address>:<proxy_port>
    export HTTPS_PROXY=https://<proxy_address>:<proxy_port>
    
  2. helm 命令行选项: 使用 --proxy <proxy_url> 选项。

       helm upgrade my-release my-chart --registry-config  --registry-config-path ~/.config/helm/registry/config.json --proxy http://<proxy_address>:<proxy_port>
       helm upgrade my-release my-chart --registry-config  --registry-config-path ~/.config/helm/registry/config.json --proxy https://<proxy_address>:<proxy_port>
    

总结

Helm 是一个非常强大的 Kubernetes 应用管理工具。合理地使用 Helm,可以极大地简化 K8s 应用的部署和管理,让你从繁琐的 YAML 配置中解放出来。