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 技术要点总结
- 架构理解:Helm 3 采用纯客户端架构,移除了 Tiller
- 安装配置:多种安装方式,推荐使用官方脚本
- 基本操作:仓库管理、Chart 操作、Release 管理
- 版本控制:支持升级、回滚、历史查看
- 故障排除:掌握常见问题的诊断和解决方法
1.7.3 最佳实践
- 定期更新 Helm 和仓库索引
- 使用命名空间隔离不同环境
- 在生产环境前先进行 dry-run 测试
- 保持 Chart 版本和应用版本的一致性
- 建立 Release 的命名规范
1.7.4 下一章预告
下一章我们将深入学习 Chart 的结构和模板语法,包括: - Chart 目录结构详解 - Go 模板语法基础 - 内置对象和函数使用 - 条件判断和循环控制
通过下一章的学习,你将能够创建和定制自己的 Helm Charts。