K8S的Helm包管理器

一、背景

官网: https://helm.sh/

我们针对K8S环境中,部署对应的应用,无外乎就是编写一堆yaml资源清单文件. 资源清单、依赖性少的时候,可以直接手动维护。但是,随着资源清单越来越复杂,越来越多,不同的环境切换不同的资源清单配置,如果还是手动维护,那将会是一场运维灾难。

没有Helm之前的问题:

1、手动管理YAML文件:需要手动编写和维护大量YAML文件,容易出错

2、缺乏标准化:各团队有自己的部署方式,难以统一管理

3、部署流程复杂:需要按特定顺序创建资源,容易遗漏步骤

4、环境差异处理困难:不同环境的配置需要手动修改或维护多套文件

5、回滚机制不完善:需要手动记录变更并反向操作才能回滚

Helm 是 Kubernetes 的包管理工具,相当于 Linux 系统中的 apt/yum 或 macOS 中的 homebrew。它通过将 Kubernetes 应用打包成可复用的单元(称为 Chart),简化了复杂应用的部署和管理流程。

Helm的核心原理就是: 使用go template模板语法,嵌入到K8S的资源清单yaml文件中,为yaml资源清单文件提供了动态编程能力的工具,动态生成最终部署的yaml清单文件。 并且还支持了repo仓库机制生态、依赖声明等功能。

在Kubernetes生态系统中,Helm的出现主要解决了以下几个核心问题:

1、应用管理的复杂性:Kubernetes原生资源文件(YAML)在管理复杂应用时变得冗长且难以维护,特别是当应用由多个组件组成时。

2、配置管理的挑战:没有标准化的方式来管理不同环境的配置(开发、测试、生产),导致大量重复或轻微修改的YAML文件。

3、版本控制的缺失:缺乏应用级别的版本控制机制,难以回滚到特定版本。

4、共享和复用困难:没有统一的方式打包和共享Kubernetes应用模板,各团队重复造轮子。

二、Helm核心概念

1、Chart

Chart是Helm的应用打包格式,包含了一组Kubernetes资源文件的模板和配置。Chart的结构如下:

bash 复制代码
mychart/
  Chart.yaml          # Chart的元数据文件
  values.yaml         # 默认配置值
  charts/             # 依赖的子Chart
  templates/          # 模板目录
    deployment.yaml   # 部署模板
    service.yaml      # 服务模板
    ...               # 其他Kubernetes资源模板

类比docker里面的镜像image。

2、Release

Release是Chart在Kubernetes集群中的一次部署实例。同一个Chart可以多次安装到同一集群,每次安装都会创建一个新的Release。

类比docker当做的容器。 同一个namespace只能部署唯一名称的release, release名称不同,则可以部署多个不同的release。 (除非nodeport等端口冲突)

3、Repository (Repo)

Chart仓库是存放和共享Chart的地方。Helm客户端可以连接多个仓库来查找和下载Chart。

类比docker当中的镜像仓库, Chart也有自己的仓库进行存储,方便分发、拉取。

三、Helm常用命令

1. Chart相关命令

bash 复制代码
# 创建新Chart
helm create mychart

# 打包Chart
helm package mychart

# 检查Chart语法
helm lint mychart

# 查看Chart模板渲染结果(不实际部署)
helm template mychart

# 验证Chart是否安装成功(dry-run模式)
helm install --dry-run myrelease mychart

2. Repository相关命令

bash 复制代码
# 添加Chart仓库
helm repo add bitnami https://charts.bitnami.com/bitnami

# 列出已配置的仓库
helm repo list

# 更新本地仓库缓存
helm repo update

# 搜索Chart
helm search repo nginx

# 移除仓库
helm repo remove bitnami

3. Release相关命令

bash 复制代码
# 安装Release
helm install myrelease mychart

# 列出已安装的Release
helm list

# 查看Release状态
helm status myrelease

# 升级Release
helm upgrade myrelease mychart

# 回滚Release
helm rollback myrelease 1

# 卸载Release
helm uninstall myrelease

# 查看Release历史
helm history myrelease

四、实战示例

1、创建并部署一个简单的Chart

bash 复制代码
# 创建新Chart
helm create myapp

# 编辑Chart配置
cd myapp
vim values.yaml  # 修改副本数、镜像等配置

# 安装Chart
helm install myapp-release ./myapp

# 检查部署状态
kubectl get pods
helm status myapp-release

2、使用外部Chart部署应用

bash 复制代码
# 添加bitnami仓库
helm repo add bitnami https://charts.bitnami.com/bitnami

# 搜索nginx Chart
helm search repo nginx

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

# 自定义配置安装
helm install my-nginx bitnami/nginx --set service.type=LoadBalancer,replicaCount=2

3、高级配置示例

创建自定义values.yaml:

bash 复制代码
# custom-values.yaml
replicaCount: 3
image:
  repository: nginx
  tag: "1.21.0"
  pullPolicy: IfNotPresent
service:
  type: NodePort
  port: 80

然后使用自定义值安装:

bash 复制代码
helm install -f custom-values.yaml my-nginx bitnami/nginx

4、最佳实践

  1. 版本控制:将Chart和values文件纳入版本控制系统

  2. 环境分离:为不同环境(dev/staging/prod)维护不同的values文件

  3. 模板测试 :使用helm template--dry-run测试模板渲染

  4. 依赖管理:明确声明Chart依赖关系

  5. 安全实践:只使用可信的Chart仓库,审查第三方Chart

  6. 资源命名 :使用.Release.Name作为资源名前缀确保唯一性

  7. 配置默认值:为模板参数提供合理的默认值

五、总结

Helm作为Kubernetes的包管理器,极大地简化了复杂应用的部署和管理。通过模板化、版本控制和依赖管理等特性,Helm为Kubernetes应用提供了类似于Linux包管理工具的体验。掌握Helm不仅可以提高部署效率,还能实现配置的标准化和可重复性,是Kubernetes生态中不可或缺的工具。

可以方便我们直接部署和使用,也可以支持快速安装、快速回滚。

核心原理:

使用go template模板语法,嵌入到K8S的资源清单yaml文件中,为yaml资源清单文件提供了动态编程能力的工具,动态生成最终部署的yaml清单文件。 并且还支持了repo仓库机制生态、依赖声明等功能。

相关推荐
功德+n1 天前
Linux下安装与配置Docker完整详细步骤
linux·运维·服务器·开发语言·docker·centos
小敬爱吃饭1 天前
Ragflow Docker部署及问题解决方案(界面为Welcome to nginx,ragflow上传文件失败,Docker中的ragflow-cpu-1一直重启)
人工智能·python·nginx·docker·语言模型·容器·数据挖掘
木子欢儿1 天前
Docker Hub 镜像发布指南
java·spring cloud·docker·容器·eureka
coppher1 天前
Ubuntu 22.04 amd64 离线安装 Docker 完整教程
linux·docker
虚伪的空想家1 天前
k8s集群configmap和secrets备份脚本
linux·容器·kubernetes
SXJR1 天前
k8s中的Pod
云原生·容器·kubernetes
文静小土豆1 天前
K8s 滚动更新在 Java 应用中的实践与优化
java·容器·kubernetes
w6100104661 天前
CKA-2026-Ingress
云原生·容器·kubernetes·cka
bloglin999991 天前
docker logs 如何一直监听日志输出
运维·docker·容器
说实话起个名字真难啊1 天前
Docker 入门之网络基础
网络·docker·php