目录

一、Helm 核心概念

1. 核心定义

2. 三大核心概念

3. Helm3 与 Helm2 核心区别

二、Helm 部署与基础使用

1. 安装 Helm 客户端

2. 仓库管理(Chart 来源配置)

3. Chart 部署与 Release 管理

三、Helm 自定义 Chart 与部署

1. Chart 目录结构

2. 自定义 Chart 步骤

(1)创建基础 Chart

(2)修改 Chart 配置

(3)验证与打包 Chart

(4)部署自定义 Chart

3. Release 升级与回滚

四、扩展:Helm 私有仓库(Harbor)

1. 准备工作

2. 配置 Harbor 仓库并推送 Chart


一、Helm 核心概念

Helm 是 Kubernetes 官方提供的包管理器,类比 Linux 系统的 YUM/Apt,核心作用是简化 K8s 应用的部署、版本管理和生命周期维护。在无 Helm 时,需手动依次部署 Deployment、Service 等资源,步骤繁琐且难以规模化管理;Helm 通过打包机制将 K8s 资源配置动态化,支持版本控制,大幅降低复杂应用(尤其是微服务)的部署难度。

1. 核心定义

Helm 本质是 K8s 应用管理的 “流程封装工具”,通过模板化方式动态生成 Deployment.yaml、Service.yaml 等资源清单,再自动调用 Kubectl 执行部署,实现应用配置的可复用与可配置。

2. 三大核心概念

概念说明
ChartHelm 的软件包(TAR 格式),包含一组 K8s 资源 YAML 模板及配置文件,类比 RPM/DEB 包
RepositoryHelm 软件仓库(Web 服务器),存储各类 Chart 包及清单文件,支持多仓库同时管理
ReleaseChart 部署到 K8s 集群后的实例,一个 Chart 可多次安装生成多个 Release(如两个 MySQL 实例对应两个 Release)

3. Helm3 与 Helm2 核心区别

  • Helm2:C/S 架构,包含客户端(helm)和服务端(Tiller,部署在 kube-system 命名空间),Tiller 通常拥有集群全权限,存在安全风险。
  • Helm3:移除 Tiller,客户端直接读取本地 kubeconfig 文件,基于预定义权限操作 K8s 资源,更安全且架构更简洁。

官方网站:https://helm.sh/

二、Helm 部署与基础使用

1. 安装 Helm 客户端

# 1. 下载二进制包(从 https://github.com/helm/helm/tags 选择对应版本)
tar -zxvf helm-v3.6.0-linux-amd64.tar.gz
# 2. 移动二进制文件到系统路径
mv linux-amd64/helm /usr/local/bin/
# 3. 验证安装
helm version
# 4. 启用命令补全(可选)
source <(helm completion bash)

2. 仓库管理(Chart 来源配置)

# 1. 添加常用公开仓库
helm repo add bitnami https://charts.bitnami.com/bitnami  # 常用应用仓库
helm repo add stable http://mirror.azure.cn/kubernetes/charts  # 稳定版仓库
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts  # 阿里云仓库
helm repo add incubator https://charts.helm.sh/incubator  # 孵化版仓库

# 2. 更新仓库索引(获取最新 Chart 列表)
helm repo update
# 3. 查看已添加仓库
helm repo list
# 4. 搜索仓库中的 Chart(如搜索 stable 仓库的 Chart)
helm search repo stable
# 5. 删除无用仓库(如删除 incubator)
helm repo remove incubator

3. Chart 部署与 Release 管理

# 1. 查看 Chart 详情(如查看 stable/mysql 的信息)
helm show chart stable/mysql  # 查看基本信息
helm show all stable/mysql    # 查看完整信息(含配置、模板)

# 2. 安装 Chart(创建 Release)
helm install my-redis bitnami/redis -n default  # 指定 Release 名:my-redis,部署到 default 命名空间
helm install bitnami/redis --generate-name      # 不指定名称,随机生成 Release 名

helm install my-redis bitnami/redis -n default --version 18.19.3   #直接指定版本

# 3. 查看 Release 列表
helm ls  # 或 helm list
# 4. 查看指定 Release 状态
helm status my-redis
# 5. 卸载 Release(删除对应 K8s 资源)
helm uninstall my-redis
helm install my-redis bitnami/redis -n default --version 18.19.3 --set persistence.nabled=false --set master.persistence.enabled=false --set replica.persistence.enabled=false --set master.resources.requests.cpu=10m --set master.resources.requests.memory=64Mi --set replica.resources.requests.cpu=10m --set replica.resources.requests.memory=64Mi --set master.tolerations[0].key=node-role.kubernetes.io/master --set master.tolerations[0].operator=Exists --set master.tolerations[0].effect=NoSchedule --set replica.tolerations[0].key=node-role.kubernetes.io/master --set replica.tolerations[0].operator=Exists --set replica.tolerations[0].effect=NoSchedule

这段命令是使用 ‌Helm‌ 在 Kubernetes 集群中安装 ‌Bitnami Redis‌ Chart 的完整配置,通过多个参数自定义了 Redis 的部署方式。以下是逐部分解析:

‌1. 基础命令与核心参数‌

helm install my-redis bitnami/redis -n default --version 18.19.3
helm install:Helm 的安装命令,用于将 Chart 部署到 Kubernetes。
my-redis:自定义的 ‌Release 名称‌(部署实例的唯一标识)。
bitnami/redis:指定安装的 Chart 来源(Bitnami 仓库中的 Redis Chart)。
-n default:指定部署的 ‌Kubernetes 命名空间‌(此处为 default 命名空间)。
--version 18.19.3:指定 Chart 的 ‌版本号‌(确保部署的 Redis 版本固定,避免自动升级)。
‌2. 持久化存储配置(禁用持久卷)‌

--set persistence.enabled=false \
--set master.persistence.enabled=false \
--set replica.persistence.enabled=false
‌禁用持久化‌:默认情况下,Redis 会使用持久卷(PersistentVolume)存储数据,确保重启后数据不丢失。
此处通过 persistence.enabled=false 全局禁用持久化,同时显式禁用 master(主节点)和 replica(从节点)的持久化配置,适用于 ‌测试环境‌(无需长期保存数据,节省存储资源)。
‌3. 资源请求限制(资源配额)‌

--set master.resources.requests.cpu=10m \
--set master.resources.requests.memory=64Mi \
--set replica.resources.requests.cpu=10m \
--set replica.resources.requests.memory=64Mi
‌资源请求(Requests)‌:为 Redis 主从节点设置最低资源需求,避免节点资源不足时被驱逐:
cpu=10m:请求 0.01 核心 CPU(1 CPU = 1000m)。
memory=64Mi:请求 64 MB 内存。
适用于 ‌资源受限的环境‌(如开发/测试集群),避免 Redis 占用过多资源。
‌4. 容忍污点(Tolerations)配置‌

--set master.tolerations[0].key=node-role.kubernetes.io/master \
--set master.tolerations[0].operator=Exists \
--set master.tolerations[0].effect=NoSchedule \
--set replica.tolerations[0].key=node-role.kubernetes.io/master \
--set replica.tolerations[0].operator=Exists \
--set replica.tolerations[0].effect=NoSchedule
‌容忍 Master 节点污点‌:Kubernetes 集群中,master 节点默认带有 node-role.kubernetes.io/master 污点(Taint),阻止普通 Pod 调度到该节点(避免影响控制平面)。
此处通过 tolerations 配置让 Redis 的 ‌主节点和从节点‌ 能够容忍该污点,允许调度到 master 节点上(适用于 ‌单节点集群‌ 或资源紧张的环境)。
key=node-role.kubernetes.io/master:匹配污点的键。
operator=Exists:只要污点存在即容忍(无需检查值)。
effect=NoSchedule:容忍 "禁止调度" 类型的污点。
‌总结:整体作用‌
这条命令的最终效果是:
在 Kubernetes 的 default 命名空间中,以 ‌非持久化、低资源占用‌ 的方式部署 ‌Bitnami Redis 18.19.3 版本‌,并允许 Redis 主从节点调度到集群的 master 节点上。
‌适用场景‌:开发、测试环境的临时 Redis 实例,无需数据持久化,且集群资源有限(需利用 master 节点资源)。

三、Helm 自定义 Chart 与部署

除了使用仓库中的 Chart,可自定义 Chart 适配业务需求,核心是通过 values.yaml 配置模板变量,实现资源动态生成。

1. Chart 目录结构

一个标准 Chart 包含以下核心文件 / 目录(以 MySQL 为例):

mysql/
├── Chart.yaml        # Chart 元信息(名称、版本、应用版本等,必填)
├── values.yaml       # 模板变量默认值(核心配置文件)
├── templates/        # K8s 资源模板目录
│   ├── deployment.yaml   # Deployment 模板
│   ├── service.yaml      # Service 模板
│   ├── ingress.yaml      # Ingress 模板(可选)
│   ├── _helpers.tpl      # 模板助手(可复用语法片段)
│   ├── NOTES.txt         # 安装后提示信息
│   └── tests/            # 测试模板(可选)
└── README.md         # 说明文档(可选)

2. 自定义 Chart 步骤

(1)创建基础 Chart
# 创建名为 nginx 的 Chart
helm create nginx
# 查看目录结构
tree nginx
(2)修改 Chart 配置
  • 修改元信息(Chart.yaml)

    apiVersion: v2
    name: nginx               # Chart 名称
    description: 自定义 Nginx Chart
    type: application         # 类型:application(应用)或 library(库)
    version: 0.1.0            # Chart 版本(需遵循语义化版本)
    appVersion: 1.16.0        # 应用版本(如 Nginx 版本)
    
  • 修改配置变量(values.yaml):核心配置文件,模板中的变量默认读取此处值,示例配置:

    replicaCount: 1          # 副本数
    image:
      repository: nginx      # 镜像仓库
      pullPolicy: IfNotPresent  # 镜像拉取策略
      tag: "latest"          # 镜像标签
    service:
      type: ClusterIP        # 服务类型(后续可改为 NodePort)
      port: 80               # 服务端口
    ingress:
      enabled: true          # 启用 Ingress
      hosts:
        - host: www.app.com  # 自定义域名
          paths:
            - path: /
              pathType: Prefix  # 路径匹配类型
    resources:               # 资源限制
      limits:
        cpu: 100m
        memory: 128Mi
      requests:
        cpu: 100m
        memory: 128Mi
    
  • 修改模板文件(可选):若需自定义资源细节(如 Service 新增 NodePort),可修改 templates/service.yaml

    apiVersion: v1
    kind: Service
    metadata:
      name: {{ include "nginx.fullname" . }}  # 引用模板助手生成名称
    spec:
      type: {{ .Values.service.type }}
      ports:
        - port: {{ .Values.service.port }}
          targetPort: http
          protocol: TCP
          name: http
          nodePort: {{ .Values.service.nodePort }}  # 新增 NodePort 配置(需在 values.yaml 中定义)
      selector:
        {{- include "nginx.selectorLabels" . | nindent 4 }}
    
(3)验证与打包 Chart

bash

# 1. 检查 Chart 配置合法性(依赖、模板语法)
helm lint nginx
# 2. 打包 Chart(生成 TAR 包:nginx-0.1.0.tgz)
helm package nginx
(4)部署自定义 Chart
# 1. 模拟部署(验证配置,不实际创建资源)
helm install nginx ./nginx --dry-run --debug
# 2. 实际部署(部署到 default 命名空间)
helm install nginx ./nginx -n default
# 或通过打包后的 TAR 包部署
helm install nginx ./nginx-0.1.0.tgz
# 3. 自定义配置部署(通过 -f 指定自定义 values 文件,覆盖默认配置)
helm install nginx ./nginx -f ./nginx/values-prod.yaml

3. Release 升级与回滚

# 1. 升级 Release(修改配置后执行,如修改 Service 为 NodePort)
helm upgrade nginx nginx  # 格式:helm upgrade <Release名> <Chart路径>
# 2. 命令行临时指定参数升级(覆盖 values.yaml 中的值,如修改镜像标签)
helm upgrade nginx nginx --set image.tag='1.15'
# 3. 查看 Release 历史版本
helm history nginx
# 4. 回滚到指定版本(如回滚到版本 1)
helm rollback nginx 1

四、扩展:Helm 私有仓库(Harbor)

可通过 Harbor 搭建 Helm 私有仓库,存储自定义 Chart 供团队共享使用。

1. 准备工作

  • 安装 Harbor(需启用 Chart 仓库功能),配置 Harbor 地址、管理员密码(如 192.168.10.19,密码 Harbor12345)。
  • 安装 Helm Push 插件(用于推送 Chart 到 Harbor):
    # 在线安装
    helm plugin install https://github.com/chartmuseum/helm-push
    # 离线安装(下载插件包后解压)
    mkdir ~/.local/share/helm/plugins/helm-push
    tar -zxvf helm-push_0.8.1_linux_amd64.tar.gz -C ~/.local/share/helm/plugins/helm-push
    

2. 配置 Harbor 仓库并推送 Chart

# 1. 登录 Harbor Web 界面,创建公开项目(如 chart_repo)
# 2. 添加 Harbor 作为 Helm 仓库(格式:http://<Harbor地址>/chartrepo/<项目名>)
helm repo add harbor http://192.168.10.19/chartrepo/chart_repo --username=admin --password=Harbor12345
# 3. 推送自定义 Chart 到 Harbor
helm push nginx harbor  # 格式:helm push <Chart路径> <仓库名>
# 4. 验证推送结果(通过 Harbor Web 界面查看 chart_repo 项目中的 Chart)

更多推荐