1.1 Helm 概述

1.1.1 什么是 Helm

Helm 是 Kubernetes 的包管理器,被称为 “Kubernetes 的 apt/yum”。它简化了 Kubernetes 应用的部署、管理和版本控制。

graph TB
    A[开发者] --> B[Helm Chart]
    B --> C[Helm CLI]
    C --> D[Kubernetes API]
    D --> E[Kubernetes 集群]
    
    B --> B1[Templates]
    B --> B2[Values]
    B --> B3[Metadata]
    
    E --> E1[Pods]
    E --> E2[Services]
    E --> E3[ConfigMaps]
    E --> E4[Secrets]

1.1.2 核心概念

Chart

  • 定义:Helm 包,包含运行应用所需的所有 Kubernetes 资源定义
  • 结构:模板文件、配置文件、元数据等的集合
  • 作用:可重用的应用部署单元

Release

  • 定义:Chart 在 Kubernetes 集群中的一个实例
  • 特点:每个 Release 都有唯一的名称和版本
  • 管理:可以升级、回滚、删除

Repository

  • 定义:存储和分享 Charts 的地方
  • 类型:公共仓库、私有仓库
  • 功能:版本管理、依赖解析

1.1.3 Helm 的优势

  • 简化部署:一条命令部署复杂应用
  • 版本管理:支持应用版本控制和回滚
  • 配置管理:灵活的配置覆盖机制
  • 依赖管理:自动处理应用间依赖关系
  • 模板化:减少重复配置,提高复用性

1.2 Helm 架构

1.2.1 Helm 3 架构

graph TB
    subgraph "客户端"
        A[Helm CLI]
    end
    
    subgraph "Kubernetes 集群"
        B[Kubernetes API Server]
        C[Release 存储]
        D[应用资源]
    end
    
    subgraph "Chart 仓库"
        E[Chart Repository]
        F[Chart 包]
    end
    
    A --> B
    A --> E
    B --> C
    B --> D
    E --> F
    
    C --> C1[Secrets]
    C --> C2[ConfigMaps]
    
    D --> D1[Deployments]
    D --> D2[Services]
    D --> D3[Ingress]

1.2.2 组件说明

Helm CLI

  • 功能:命令行客户端工具
  • 职责
    • Chart 管理(创建、打包、发布)
    • Release 管理(安装、升级、回滚、删除)
    • 仓库管理(添加、更新、搜索)

Kubernetes API Server

  • 功能:Kubernetes 集群的控制平面
  • 交互:Helm 通过 API Server 操作集群资源

Release 存储

  • 位置:Kubernetes 集群内(Secrets 或 ConfigMaps)
  • 内容:Release 元数据、历史版本信息

1.2.3 Helm 2 vs Helm 3

特性 Helm 2 Helm 3
架构 客户端-服务端 纯客户端
Tiller 需要 移除
安全性 权限问题 使用用户权限
Release 存储 Tiller Kubernetes Secrets
命名空间 全局 命名空间隔离
CRD 支持 有限 完全支持

1.3 安装 Helm

1.3.1 系统要求

  • Kubernetes:1.19+ 版本
  • kubectl:已配置并能访问集群
  • 操作系统:Linux、macOS、Windows

1.3.2 安装方法

方法一:脚本安装(推荐)

# 下载并执行安装脚本
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

# 验证安装
helm version

方法二:二进制安装

# 下载 Helm 二进制文件
wget https://get.helm.sh/helm-v3.12.0-linux-amd64.tar.gz

# 解压并安装
tar -zxvf helm-v3.12.0-linux-amd64.tar.gz
sudo mv linux-amd64/helm /usr/local/bin/helm

# 验证安装
helm version

方法三:包管理器安装

# Ubuntu/Debian
curl https://baltocdn.com/helm/signing.asc | sudo apt-key add -
sudo apt-get install apt-transport-https --yes
echo "deb https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm

# CentOS/RHEL
sudo yum install helm

# macOS
brew install helm

# Windows (Chocolatey)
choco install kubernetes-helm

1.3.3 配置验证

# 检查 Helm 版本
helm version

# 检查 Kubernetes 连接
kubectl cluster-info

# 检查当前上下文
kubectl config current-context

# 列出可用的命名空间
kubectl get namespaces

1.4 基本命令

1.4.1 仓库管理

# 添加官方稳定仓库
helm repo add stable https://charts.helm.sh/stable

# 添加 Bitnami 仓库
helm repo add bitnami https://charts.bitnami.com/bitnami

# 更新仓库索引
helm repo update

# 列出已添加的仓库
helm repo list

# 搜索 Chart
helm search repo nginx

# 搜索 Helm Hub
helm search hub wordpress

1.4.2 Chart 操作

# 创建新的 Chart
helm create my-app

# 检查 Chart 语法
helm lint my-app/

# 渲染模板(不安装)
helm template my-app my-app/

# 打包 Chart
helm package my-app/

# 查看 Chart 信息
helm show chart bitnami/nginx

# 查看 Chart 的 Values
helm show values bitnami/nginx

1.4.3 Release 管理

# 安装 Chart
helm install my-release bitnami/nginx

# 指定命名空间安装
helm install my-release bitnami/nginx -n my-namespace --create-namespace

# 使用自定义 Values 安装
helm install my-release bitnami/nginx -f custom-values.yaml

# 设置单个值
helm install my-release bitnami/nginx --set service.type=LoadBalancer

# 列出所有 Release
helm list

# 查看 Release 状态
helm status my-release

# 查看 Release 历史
helm history my-release

1.4.4 升级和回滚

# 升级 Release
helm upgrade my-release bitnami/nginx

# 升级并修改配置
helm upgrade my-release bitnami/nginx --set replicaCount=3

# 回滚到上一个版本
helm rollback my-release

# 回滚到指定版本
helm rollback my-release 1

# 卸载 Release
helm uninstall my-release

# 卸载但保留历史
helm uninstall my-release --keep-history

1.5 实践练习

1.5.1 练习1:安装 Nginx

# 1. 添加 Bitnami 仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

# 2. 搜索 Nginx Chart
helm search repo nginx

# 3. 查看 Chart 信息
helm show chart bitnami/nginx
helm show values bitnami/nginx

# 4. 安装 Nginx
helm install my-nginx bitnami/nginx

# 5. 检查部署状态
helm status my-nginx
kubectl get pods
kubectl get services

# 6. 访问服务
kubectl port-forward svc/my-nginx 8080:80
# 在浏览器中访问 http://localhost:8080

1.5.2 练习2:自定义配置

# 1. 创建自定义 Values 文件
cat > custom-values.yaml << EOF
replicaCount: 2
service:
  type: LoadBalancer
resources:
  requests:
    memory: "64Mi"
    cpu: "250m"
  limits:
    memory: "128Mi"
    cpu: "500m"
EOF

# 2. 使用自定义配置安装
helm install my-custom-nginx bitnami/nginx -f custom-values.yaml

# 3. 验证配置
kubectl get pods
kubectl describe deployment my-custom-nginx

1.5.3 练习3:升级和回滚

# 1. 升级 Release
helm upgrade my-nginx bitnami/nginx --set replicaCount=3

# 2. 查看历史版本
helm history my-nginx

# 3. 验证升级
kubectl get pods

# 4. 回滚到上一版本
helm rollback my-nginx

# 5. 验证回滚
helm history my-nginx
kubectl get pods

1.6 故障排除

1.6.1 常见问题

问题1:kubectl 未配置

# 错误信息
Error: Kubernetes cluster unreachable

# 解决方案
# 配置 kubectl
kubectl config view
kubectl config use-context <context-name>

问题2:权限不足

# 错误信息
Error: configmaps is forbidden

# 解决方案
# 检查 RBAC 权限
kubectl auth can-i create configmaps
kubectl auth can-i create secrets

问题3:Chart 不存在

# 错误信息
Error: chart "nginx" not found

# 解决方案
# 更新仓库索引
helm repo update
# 搜索正确的 Chart 名称
helm search repo nginx

1.6.2 调试技巧

# 1. 使用 --dry-run 预览
helm install my-release bitnami/nginx --dry-run

# 2. 使用 --debug 查看详细信息
helm install my-release bitnami/nginx --debug

# 3. 渲染模板查看生成的 YAML
helm template my-release bitnami/nginx

# 4. 检查 Release 状态
helm status my-release

# 5. 查看 Kubernetes 事件
kubectl get events --sort-by=.metadata.creationTimestamp

1.7 本章小结

1.7.1 核心概念回顾

  • Helm:Kubernetes 包管理器
  • Chart:应用包,包含所有必需的资源定义
  • Release:Chart 在集群中的运行实例
  • Repository:Chart 的存储和分发中心

1.7.2 技术要点总结

  1. 架构理解:Helm 3 采用纯客户端架构,移除了 Tiller
  2. 安装配置:多种安装方式,推荐使用官方脚本
  3. 基本操作:仓库管理、Chart 操作、Release 管理
  4. 版本控制:支持升级、回滚、历史查看
  5. 故障排除:掌握常见问题的诊断和解决方法

1.7.3 最佳实践

  • 定期更新 Helm 和仓库索引
  • 使用命名空间隔离不同环境
  • 在生产环境前先进行 dry-run 测试
  • 保持 Chart 版本和应用版本的一致性
  • 建立 Release 的命名规范

1.7.4 下一章预告

下一章我们将深入学习 Chart 的结构和模板语法,包括: - Chart 目录结构详解 - Go 模板语法基础 - 内置对象和函数使用 - 条件判断和循环控制

通过下一章的学习,你将能够创建和定制自己的 Helm Charts。