1. Helm基础概念与部署准备
1.1 Helm在Kubernetes生态中的定位
Helm是Kubernetes生态中的包管理工具,相当于Linux系统中的yum或apt。它通过Chart(软件包定义)和Release(Chart的运行实例)的概念,解决了Kubernetes应用管理的三大痛点:
- 模板化部署:将复杂的K8s资源清单(Deployment/Service/Ingress等)打包成可复用的Chart
- 版本控制:支持应用版本的升级、回滚和历史记录查询
- 依赖管理:可以声明式管理应用依赖的其他组件
在本次实践中,我们使用Ubuntu 22.04系统上的二进制Kubernetes集群作为运行环境。选择二进制部署方式可以避免特定发行版的限制,更适合生产环境。
1.2 环境准备要点
在开始前需要确认:
- Kubernetes集群已就绪(通过
kubectl get nodes验证) - 拥有cluster-admin权限的kubeconfig文件
- 各节点间网络互通(特别是控制平面与工作节点)
- 足够的系统资源(建议至少2核CPU/4GB内存)
提示:生产环境中建议为Helm使用的serviceaccount绑定最小必要权限,而非直接使用cluster-admin
2. Helm客户端安装与配置
2.1 下载与安装
获取最新稳定版Helm(当前为v3.19.4):
bash复制wget https://get.helm.sh/helm-v3.19.4-linux-amd64.tar.gz
解压到系统PATH目录:
bash复制tar xf helm-v3.19.4-linux-amd64.tar.gz -C /usr/local/bin/ linux-amd64/helm --strip-components=1
验证安装:
bash复制helm version
正常应显示版本信息:
code复制version.BuildInfo{
Version:"v3.19.4",
GitCommit:"7cfb6e486dac026202556836bb910c37d847793e",
GitTreeState:"clean",
GoVersion:"go1.24.11"
}
2.2 配置自动补全
启用bash自动补全功能:
bash复制helm completion bash > /etc/bash_completion.d/helm
echo 'source /etc/bash_completion.d/helm' >> ~/.bashrc
source ~/.bashrc
技巧:对于zsh用户,只需将上述命令中的bash替换为zsh即可
3. Chart基础管理实战
3.1 创建第一个Chart
建立工作目录并创建Chart:
bash复制mkdir -pv /opt/k8s/add-ons/helm-charts
cd /opt/k8s/add-ons/helm-charts
helm create whelm-linux
生成的目录结构解析:
code复制whelm-linux
├── Chart.yaml # Chart元数据(名称、版本、依赖等)
├── charts # 子Chart目录(用于本地依赖)
├── templates # 核心模板目录
│ ├── NOTES.txt # 部署后显示的使用说明
│ ├── _helpers.tpl # 模板辅助函数
│ ├── deployment.yaml # Deployment资源模板
│ ├── hpa.yaml # 水平自动扩展模板
│ ├── ingress.yaml # Ingress资源模板
│ ├── service.yaml # Service资源模板
│ └── tests # 测试用例
│ └── test-connection.yaml
└── values.yaml # 默认配置参数
3.2 定制化Chart配置
修改values.yaml关键参数:
bash复制sed -i "/repository\:/s#nginx#testgame#" whelm-linux/values.yaml
sed -ri '/tag\:/s#tag: ""#tag: v0.1#' whelm-linux/values.yaml
主要修改项说明:
yaml复制replicaCount: 2 # Pod副本数
image:
repository: testgame # 镜像仓库
tag: v0.1 # 镜像标签
service:
port: 8090 # 服务暴露端口
targetPort: 8090 # 容器监听端口
注意:生产环境中建议使用明确的镜像tag而非latest,确保部署一致性
4. Release生命周期管理
4.1 安装Release
在kube-public命名空间部署应用:
bash复制helm -n kube-public install hgame whelm-linux
验证部署状态:
bash复制helm list -n kube-public
kubectl get deploy,pod,svc -n kube-public -o wide
4.2 访问测试
通过ClusterIP访问服务:
bash复制curl <ClusterIP>:8090
预期返回HTML格式的游戏界面
4.3 卸载Release
完整卸载应用:
bash复制helm -n kube-public uninstall hgame
kubectl get all -n kube-public # 确认资源已清理
5. 高级部署策略
5.1 基于配置文件的升级
修改values.yaml后执行升级:
bash复制sed -i '/replicaCount/s#2#3#' whelm-linux/values.yaml
sed -i "/tag:/s#v0.1#v0.2#" whelm-linux/values.yaml
helm -n kube-public upgrade hgame -f whelm-linux/values.yaml whelm-linux
5.2 命令行参数覆盖升级
动态修改参数(优先级高于配置文件):
bash复制helm -n kube-public upgrade hgame --set replicaCount=2,image.tag=v0.1 whelm-linux
经验:生产环境推荐使用配置文件升级,便于版本控制;临时调整可使用--set
6. 版本回滚管理
6.1 查看发布历史
bash复制helm -n kube-public history hgame
输出示例:
code复制REVISION UPDATED STATUS CHART APP VERSION
1 Sun Jan 25 21:18:43 2026 superseded whelm-linux-0.1.0 1.16.0
2 Sun Jan 25 21:24:35 2026 superseded whelm-linux-0.1.0 1.16.0
3 Sun Jan 25 21:30:16 2026 deployed whelm-linux-0.1.0 1.16.0
6.2 执行回滚操作
回滚到上一个版本:
bash复制helm -n kube-public rollback hgame
回滚到指定版本:
bash复制helm -n kube-public rollback hgame 2
验证回滚结果:
bash复制kubectl get deploy -n kube-public -o jsonpath='{.spec.replicas}'
kubectl get deploy -n kube-public -o jsonpath='{.spec.template.spec.containers[0].image}'
7. 公有仓库管理
7.1 添加国内镜像源
bash复制helm repo add azure https://mirror.azure.cn/kubernetes/charts/
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
7.2 仓库常用操作
更新仓库索引:
bash复制helm repo update
搜索Chart:
bash复制helm search repo mysql
查看Chart详情:
bash复制helm show chart aliyun/mysql
拉取Chart到本地:
bash复制helm pull aliyun/mysql --version 1.6.2
7.3 仓库维护
删除仓库:
bash复制helm repo remove aliyun
8. 生产环境最佳实践
8.1 目录结构规范
推荐的项目结构:
code复制/opt/k8s/
├── add-ons/ # 附加组件
│ ├── helm-charts/ # 自定义Chart
│ └── third-party/ # 第三方Chart
├── environments/ # 环境配置
│ ├── dev/
│ ├── staging/
│ └── prod/
└── scripts/ # 部署脚本
8.2 版本控制策略
- Chart版本遵循SemVer规范(MAJOR.MINOR.PATCH)
- 每次变更提交到Git仓库并打Tag
- 使用helm package打包成.tgz文件归档
- 重要版本推送到私有Chart仓库
8.3 安全建议
- 使用helm lint检查Chart语法
- 使用--dry-run参数预演部署
- 限制tiller-serviceaccount权限(Helm 2需要)
- 定期清理失败的Release(helm list --failed)
9. 常见问题排查
9.1 部署失败排查步骤
-
检查Release状态:
bash复制
helm status <release-name> -n <namespace> -
查看Kubernetes事件:
bash复制kubectl get events -n <namespace> --sort-by='.lastTimestamp' -
检查Pod日志:
bash复制
kubectl logs <pod-name> -n <namespace>
9.2 典型错误解决方案
问题1:Error: rendered manifests contain a resource that already exists
- 原因:资源命名冲突
- 解决:卸载原有Release或修改Chart中的资源名称
问题2:Error: timed out waiting for the condition
- 原因:部署超时
- 解决:
bash复制helm upgrade --install --timeout 5m <release> <chart>
问题3:Error: unable to build kubernetes objects from release manifest
- 原因:模板渲染错误
- 解决:
bash复制
helm template --debug <chart>
10. 性能优化技巧
10.1 模板优化
- 使用命名模板(_helpers.tpl)避免重复代码
- 合理使用with和range控制作用域
- 将大模板拆分为多个文件
10.2 部署优化
- 使用--atomic参数确保原子性操作
- 对大型Chart分组件部署
- 设置合理的资源requests/limits
10.3 仓库加速
配置本地仓库镜像:
bash复制helm repo add local-mirror http://internal-helm-repo/
helm repo update
对于高频使用的Chart,可以定期同步到内网仓库