容器基础5-Helm 与 K8s 的关系

发布于:2025-07-04 ⋅ 阅读:(12) ⋅ 点赞:(0)
一、Helm 是什么?为什么需要它?

K8s 是强大的容器编排平台,但部署复杂应用时(如包含 Web 服务、数据库、缓存等多个组件的系统),需要编写大量 YAML 文件,管理成本高。Helm 就是为简化 K8s 应用部署而生的工具,它被称为 “K8s 的包管理器”,类似 Ubuntu 的apt或 Mac 的brew

二、Helm 如何工作?核心概念解析
  1. Chart(图表)

    • Helm 的基本单位,是一组 YAML 文件的集合,描述了一个或多个 K8s 资源(如 Deployment、Service、ConfigMap 等)。
    • 类比:一个 Chart 就像手机应用商店里的 “APP 安装包”,包含了应用运行所需的所有组件和配置。
  2. Release(发布)

    • Chart 的实例化结果。同一个 Chart 可以在集群中部署多次,每次部署都是一个 Release,就像同一 APP 可以在多部手机上安装,每个安装都是独立的。
  3. Values(配置值)

    • 用于自定义 Chart 的参数。例如,Chart 中定义了数据库密码为变量,通过 Values 可以传入实际密码,避免硬编码。
    • 类比:安装 APP 时的 “个性化设置”,如选择安装路径、是否创建桌面图标等。
三、Helm vs 直接使用 kubectl:优势在哪?
场景 直接用 kubectl 用 Helm
复杂应用部署 需要手动编写 / 管理多个 YAML 文件,易出错。 一键安装预定义的 Chart,自动处理依赖关系。
配置管理 配置硬编码在 YAML 中,难以复用和修改。 通过 Values 文件灵活配置,支持环境变量。
版本控制 手动记录 YAML 变更,回滚困难。 自动记录 Release 历史,支持一键回滚到任意版本。
依赖管理 需要手动确保组件顺序(如先部署 DB 再部署 APP) Chart 中定义依赖关系,自动按顺序部署。
四、实战案例:用 Helm 部署 WordPress

假设你想部署一个 WordPress 博客,包含 Web 服务和 MySQL 数据库:

  1. 不用 Helm:需要编写至少 4 个 YAML 文件(WordPress Deployment、Service,MySQL StatefulSet、PVC),还要处理数据库初始化、密码配置等细节。
  2. 用 Helm:只需一行命令:

    bash

    helm repo add bitnami https://charts.bitnami.com/bitnami  # 添加官方仓库
    helm install my-blog bitnami/wordpress  # 安装WordPress Chart
    

    Helm 会自动:
    • 创建 MySQL 数据库并配置持久化存储;
    • 部署 WordPress 应用并连接到数据库;
    • 生成随机密码并保存为 Secret;
    • 创建 Service 暴露 WordPress 服务。
五、Helm 的进阶能力:模板与钩子
  1. 模板引擎

    • Helm 使用 Go 模板语言,允许在 Chart 中定义动态配置。例如:
      # values.yaml
      replicas: 3
      
      # deployment.yaml
      replicas: {{ .Values.replicas }}  # 自动从values中获取值
      
    • 类比:手机 APP 安装时的 “自定义选项”,如选择安装语言、分辨率等。
  2. 钩子(Hooks)

    • 允许在特定阶段执行自定义操作,如部署前执行数据库迁移、删除前备份数据等。
    • 类比:手机 APP 安装前的 “权限申请” 或卸载前的 “数据备份提示”。

一、Helm 安装准备
1. 安装 Helm 客户端
  • macOS(使用 Homebrew):
    brew install helm
    
  • Linux(使用脚本):
    curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
    
  • Windows(使用 Chocolatey):

    choco install kubernetes-helm
    
2. 验证安装
helm version
# 输出类似:version.BuildInfo{Version:"v3.12.0", ...}
二、使用 Helm 安装应用
1. 添加官方仓库

Helm 通过 仓库(Repository) 管理 Charts,类似 npm 或 Maven 的仓库:

helm repo add bitnami https://charts.bitnami.com/bitnami  # 添加 Bitnami 官方仓库
helm repo update  # 更新仓库索引
2. 搜索可用 Charts
helm search repo wordpress  # 搜索 WordPress 相关 Charts
# 输出类似:
# NAME               CHART VERSION  APP VERSION  DESCRIPTION
# bitnami/wordpress  15.0.0         6.2.2        WordPress is the world's most popular blogging ...
3. 安装 Chart

以安装 WordPress 为例:

helm install my-blog bitnami/wordpress  # 安装名为 my-blog 的 WordPress 实例
  • 关键参数
    • --version 15.0.0:指定 Chart 版本
    • --values my-values.yaml:使用自定义配置文件
    • --set service.type=LoadBalancer:临时覆盖配置值
4. 查看安装状态
helm list  # 查看所有已安装的 Releases
helm status my-blog  # 查看特定 Release 的详细信息
kubectl get pods  # 验证 Pod 是否正常运行
三、自定义配置(Values 文件)
1. 创建自定义 Values 文件

复制默认配置并修改:

helm show values bitnami/wordpress > my-values.yaml
vi my-values.yaml  # 编辑配置,例如修改数据库密码、服务类型等
2. 使用自定义配置安装

bash

helm install my-blog bitnami/wordpress -f my-values.yaml
3. 常见配置示例
# my-values.yaml
wordpressUsername: admin
wordpressPassword: my-strong-password  # 自定义 WordPress 密码
service:
  type: NodePort  # 将服务类型改为 NodePort
persistence:
  size: 20Gi  # 增加持久化存储大小
四、升级与回滚应用
1. 升级应用
helm upgrade my-blog bitnami/wordpress --set wordpressPassword=new-password  # 升级并修改密码
2. 查看历史版本
helm history my-blog
# 输出类似:
# REVISION  UPDATED                  STATUS     CHART            APP VERSION  DESCRIPTION
# 1         Mon Jul 10 12:00:00 2023  superseded  wordpress-15.0.0  6.2.2        Install complete
# 2         Mon Jul 10 12:30:00 2023  deployed    wordpress-15.1.0  6.2.2        Upgrade complete
3. 回滚到指定版本
helm rollback my-blog 1  # 回滚到版本 1
五、管理 Helm 仓库
1. 添加自定义仓库
helm repo add my-repo https://my-company.com/charts
2. 查看已添加的仓库
helm repo list
3. 更新仓库索引
helm repo update  # 每次使用前建议更新
六、创建自己的 Chart
1. 初始化 Chart 项目
helm create my-app  # 创建名为 my-app 的 Chart 模板
2. Chart 目录结构
my-app/
├── charts/          # 依赖的子 Charts
├── templates/       # YAML 模板文件
│   ├── deployment.yaml
│   ├── service.yaml
│   └── _helpers.tpl  # 模板辅助函数
├── Chart.yaml       # Chart 元数据(名称、版本等)
└── values.yaml      # 默认配置值
3. 编写模板(示例)
# templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-app
spec:
  replicas: {{ .Values.replicas }}  # 从 values.yaml 获取副本数
  selector:
    matchLabels:
      app: {{ .Release.Name }}
  template:
    metadata:
      labels:
        app: {{ .Release.Name }}
    spec:
      containers:
      - name: {{ .Chart.Name }}
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
        ports:
        - containerPort: {{ .Values.service.port }}
4. 打包 Chart
helm package my-app  # 生成 my-app-0.1.0.tgz 包
5. 安装本地 Chart
helm install my-release ./my-app
七、常用 Helm 命令速查表
命令 作用
helm install release chart 安装 Chart 为一个 Release
helm upgrade release chart 升级 Release
helm uninstall release 卸载 Release
helm search repo keyword 在仓库中搜索 Chart
helm show values chart 查看 Chart 的默认配置值
helm dependency update chart 更新 Chart 的依赖
helm lint chart 检查 Chart 语法错误
helm template chart 渲染 Chart 模板(不安装)
八、最佳实践
  1. 使用 Values 文件:避免在命令行中使用大量 --set 参数,将配置保存在文件中便于版本控制。
  2. 命名规范:Release 名称和 Chart 名称保持语义化(如 my-prod-api)。
  3. 版本控制:将自定义 Values 文件和 Chart 代码纳入 Git 管理。
  4. 测试先行:使用 helm install --dry-run 预渲染模板,确保配置正确。
  5. 清理不再使用的 Releases:定期 helm uninstall 不再需要的应用。
总结:Helm 是 K8s 的 “应用增强器”
  • Helm 的定位简化 K8s 应用的部署、升级和管理,尤其适合复杂的分布式系统。
  • 与 K8s 的关系:K8s 提供容器编排能力,Helm 提供应用层面的封装和管理,二者结合就像 “操作系统”+“应用商店”,让用户更高效地使用 K8s。

通过 Helm,开发者可以将精力集中在业务逻辑上,而不是复杂的 K8s 配置,真正实现 “一键部署,全家无忧”!


网站公告

今日签到

点亮在社区的每一天
去签到