Helm 快速上手:轻松驾驭 K8s 应用部署

426 阅读15分钟

image.png 在当今的云原生时代,Kubernetes(简称 k8s)已然成为容器编排的核心力量,广泛应用于各类企业级项目,尤其是微服务架构蓬勃发展的当下,众多应用的部署管理成为了关键任务。当面对繁杂的微服务部署时,如果仅依靠传统的 kubectl apply 命令逐个执行,繁琐程度不言而喻,效率也会大打折扣。而此时,Helm 作为 k8s 生态中一款强大的工具,宛如一位得力助手闪亮登场,为我们开启便捷部署之门。

一、Helm 究竟为何方神圣

Helm 本质上是 k8s 的包管理器,类比于常见的软件包管理工具,如 Linux 系统下的 apt、yum 等,它能够将应用及其依赖项、配置等进行封装,形成一个易于部署、管理的单元。其卓越之处体现在多个维度:

  1. 简化部署流程:告别繁琐的逐条命令操作,Helm 允许通过单个简洁的命令,一次性完成应用程序的部署与后续管理,让整个部署过程如丝般顺滑。无论是初次部署还是后续的更新、维护,都能轻松搞定,极大地节省时间与精力。
  2. 高度灵活可配置:Helm Charts(Helm 包)犹如一个充满魔法的配置宝库,提供了极为丰富且可灵活调整的选项。使用者能够依据项目的具体需求,随心所欲地自定义和修改应用程序的部署细节,从资源分配到环境变量,一切尽在掌控。
  3. 精准的版本控制:在应用的迭代过程中,版本管理至关重要。Helm 充分考虑到这一点,支持对应用程序的多个版本进行精细管理,无论是版本的升级、回滚,都能精准操作,确保应用在不同阶段的稳定性与兼容性。
  4. 模板化的智慧:借助先进的 YAML 模板技术,Helm Charts 巧妙地定义了 Kubernetes 对象的配置。这种模板化的方式不仅简化了复杂的配置过程,减少人为错误,还大幅提升了配置的可重复性与可扩展性。相同的模板,稍作参数调整,即可适配多种场景,真正做到 “一变应万变”。
  5. 强大的应用程序库:Helm 构建了一个充满活力的应用程序库生态,使用者可以轻松地在其中共享、重用精心打造的 Helm Charts。这意味着,当面对多个具有相似需求的应用部署时,无需重复 “造轮子”,直接复用已有的优质资源,大大加速项目推进速度。
  6. 拓展无限的插件系统:为了满足多样化、个性化的需求,Helm 配备了一个功能强大的插件系统。开发者和运维人员可以根据项目的特殊要求,通过安装、开发插件来扩展和定制 Helm 的功能,使其完美适配各类复杂场景。

二、Helm v3 工作流程全解析

相较于早期版本,Helm v3 进行了诸多优化与改进,以更加简洁、高效、安全的架构赢得了广泛青睐。其工作流程清晰明了,犹如一条精密的生产线:

image.png

  1. 开发者的精心筹备:项目伊始,开发者承担起 “蓝图绘制” 的重任,运用专业知识与工具创建并精心编辑 chart 的配置。这一步骤涵盖了对应用所需的镜像选取、依赖关系梳理、资源分配规划等诸多关键决策,确保 chart 能够精准反映应用的需求。
  2. 打包发布,入库待发:完成配置编辑后,开发者借助特定命令将 chart 打包,转化为一个易于传输、存储的 tarball 文件,并将其发布至 Helm 的专属仓库(Repository)。这个仓库就像是一个装满各类应用 “零件” 的大型仓库,等待着被调用。
  3. 管理员的一键安装:当管理员收到部署指令,只需在终端输入 helm 安装命令,魔法就此开启。系统会自动从仓库中下载相关的依赖项,这些依赖项如同搭建大厦所需的砖块、钢筋,缺一不可。
  4. 精准部署,落地生根:在获取到所有必需的资源后,helm 依据下载的详细配置,有条不紊地将应用所需的各类资源部署至 k8s 集群。从网络策略的设定到服务的启动,每一个环节都紧密相扣,确保应用能够在集群中稳定运行。

三、Helm 核心概念深度剖析

在深入探索 Helm 的使用之前,掌握几个核心概念如同掌握开启宝藏的钥匙:

  1. Chart:可以将其想象成一个精心打包的 “应用礼盒”,里面不仅装有运行一个应用所必需的镜像文件,这些镜像如同应用的 “灵魂”,赋予其运行的能力;还包含了详细的依赖说明以及各类资源定义,例如 Kubernetes 集群中的服务定义等。类比于其他系统中的软件包格式,如 Homebrew 中的 formula、APT 的 dpkg 或者 Yum 的 rpm 文件,它是 Helm 生态中的基础构建单元。
  2. Repository:简单来说,就是存储上述 “应用礼盒”(Chart)的 “超级市场”。在这里,开发者和使用者可以方便地找到所需的各类应用包,无论是常见的数据库应用,还是特定业务需求的微服务应用,应有尽有。
  3. Release:当一个 Chart 被安装到 k8s 集群上并开始运行,它就有了一个新的身份 ——Release。就好比同一款软件,在不同的电脑上安装运行,每个安装实例都有其独特的运行状态和配置。例如,一个 MySQL Chart,如果需要在服务器上同时运行两个独立的数据库实例,那么将这个 Chart 安装两次,每次安装都会生成专属的 Release 以及对应的 Release 名称,它们可以根据各自的需求进行个性化配置,互不干扰。
  4. Value:这是 Helm Chart 中的 “魔法调料”,即参数。通过调整这些参数,使用者能够轻松定制 Kubernetes 对象的配置,以适应不同的运行环境、性能需求等。例如,在不同的开发、测试、生产阶段,可以通过修改这些参数来调整资源分配、日志级别等关键设置。
  5. Template:作为 Helm 中的 “智能生成器”,Template 使用 Go 模板语言编写。它能够依据预定义的规则和输入的参数(也就是前面提到的 Values),动态地生成 Kubernetes 对象的精确配置文件。这种自动化的生成方式不仅高效,而且极大地减少了人为错误,保证了配置的一致性。
  6. Namespace:在庞大复杂的 Kubernetes 集群中,Namespace 扮演着 “虚拟房间” 的角色,用于将不同的资源进行逻辑分区隔离。这就好比在一个大型写字楼里,不同的公司或部门租用不同的楼层或房间,各自的资源(办公设备、人员等)在自己的空间内有序运作,互不干扰,便于管理与维护。

四、Helm 实战操作指南

(一)安装 Helm:开启征程第一步

要想使用 Helm 的强大功能,首先得将其安装到本地机器或 Kubernetes 集群上。这一过程并不复杂,使用者可以前往 Helm 官方网站,根据自己的操作系统平台(如 Linux、macOS、Windows)下载对应的二进制文件,然后按照简单的安装指南进行安装。另外,对于熟悉包管理器的用户,也可以直接利用系统自带的包管理器(如 apt、yum、brew 等)来完成 Helm 的安装,详细的安装教程均可在官方网站(helm.sh)找到。

(二)创建 Chart:搭建应用 “骨架”

安装好 Helm 后,就可以着手创建属于自己的 Chart 了。使用 helm create 命令,只需指定一个心仪的名称,Helm 便会自动为你生成一个包含应用程序描述所需的各类文件和目录的基础框架。以在本地机器上创建一个名为 wordpress 的 Chart 为例,在终端输入 helm create wordpress 命令后,当前文件夹下瞬间就会出现一个名为 wordpress 的目录,里面井然有序地排列着如 Chart.yaml、values.yaml、templates 目录等关键文件和子目录,这些便是后续配置应用的基础 “积木”。

(三)创建 / 编辑 Chart 配置:注入应用 “灵魂”

  1. Chart.yaml:应用的 “名片” 与 “采购清单” :打开刚刚生成的 Chart.yaml 文件,你会发现它犹如一张精心设计的名片,记录着 Chart 的关键元数据,如必不可少的 apiVersion(指定 Chart API 版本,这是与 Helm 系统交互的重要标识)、name(Chart 的独特名称,如同应用的身份证)、version(遵循语义化 2 版本规范,清晰标识 Chart 的迭代版本)。同时,它还兼任 “采购清单” 的角色,包含诸如 kubeVersion(表明该 Chart 兼容的 Kubernetes 版本,确保运行环境的适配性)、description(对项目的简洁而精准的一句话概述,方便他人快速了解用途)、dependencies(详细列出该 Chart 所依赖的其他 Chart,包括名称、版本、获取仓库地址等信息,确保在部署时能自动获取完整依赖)等重要信息。
    例如:
apiVersion: v1
name: nginx-helm
version: 1.0.0
kubeVersion: "1.20.0"
description: "A Helm chart for deploying nginx with custom configurations"
dependencies:
  - name: some-other-chart
    version: "2.3.4"
    repository: "https://example.com/charts"
  1. values.yaml:应用的 “默认设置宝库” :深入到 values.yaml 文件,这里存储着应用程序的默认配置值,是应用运行的 “默认设置宝库”。比如,对于一个 Web 应用,它可能指定了默认的镜像仓库地址(如 repository: nginx),以及对应的镜像标签(如 tag: '1.19.8'),这些默认值确保在初次部署时,应用能够以一个相对合理、稳定的配置启动。当然,在后续的部署过程中,使用者可以根据实际需求灵活调整这些值。
  2. templates:应用的 “智能装配车间” :走进 templates 目录下的模板文件,一场神奇的 “装配” 正在上演。这里的模板文件通过引入 values.yaml 里的配置,利用 .Values 对象作为桥梁,精准地生成 Kubernetes 对象的定义文件。例如,在定义一个 Deployment 时,其名称可以动态地结合 values.yaml 中的镜像仓库名称,如 metadata: name: nginx-helm-{{.Values.image.repository }},而容器的镜像地址与标签也同样依据配置动态生成:spec: containers: - name: nginx-helm image: {{.Values.image.repository }}:{{.Values.image.tag }} ports: - containerPort: 80 protocol: TCP。这样,无论 values.yaml 中的配置如何变化,模板都能自动适应,生成符合要求的部署配置。

(四)打包 Chart:整装待发

当完成 Chart 的配置编辑后,下一步便是将其打包成一个便于传输、存储与发布的格式。使用 helm package 命令,指定对应的 Chart 目录,Helm 就会迅速将其打包为一个 tarball 文件。例如,在 wordpress 目录下执行 helm package wordpress/ 命令,瞬间就能生成一个名为 wordpress-0.1.0.tgz 的 tarball 文件,这个文件就像是一个整装待发的 “应用包裹”,准备运往 Helm 仓库。

(五)发布 Chart:上架应用 “超市”

有了打包好的 Chart 文件,接下来就是将其发布到 Helm Repository 中,让更多人能够获取并使用。首先,使用 helm repo add 命令添加目标仓库,指定一个易于识别的别名(如 myrepo)和仓库的 URL(如 https://example.com/charts)。然后,通过 helm push 命令将刚刚打包好的 Chart 文件推送到指定仓库中。例如:

helm repo add myrepo https://example.com/charts
helm push wordpress-0.1.0.tgz myrepo

这样,wordpress Chart 就成功上架到 “应用超市”,等待管理员或其他使用者来挑选安装。

(六)安装 Release:启动应用 “引擎”

当需要在 Kubernetes 集群中部署应用时,使用 helm install 命令即可轻松实现。通过指定一个独特的 Release 名称(如 mywordpress)以及对应的 Chart 路径(如 myrepo/wordpress),Helm 会迅速在集群中展开部署工作,创建一个包含应用程序及其所需资源(如 WordPress 应用程序和配套的 MySQL 数据库)的 Release。例如:

helm install mywordpress myrepo/wordpress

片刻之后,你的应用便会在 k8s 集群中 “欢快奔腾”,开始服务用户。

(七)管理 Release:运维应用 “护航舰”

  1. 查看列表,掌控全局:随着集群中运行的应用增多,了解每个应用的运行状态变得至关重要。使用 helm ls 命令,就能快速查看当前运行的 Release 列表,包括它们的名称、部署时间、状态、版本等关键信息,让你对集群中的应用部署情况一目了然。
  2. 升级应用,与时俱进:在应用需要更新迭代时,例如更新镜像版本以修复漏洞或提升性能,使用 helm upgrade 命令就能轻松搞定。通过指定要升级的 Release 名称(如 mywordpress)以及更新后的 Chart 路径(或直接指定更新参数,如 --set image.tag=5.7.3-php8.0-fpm-alpine),Helm 会自动下载最新的资源并进行无缝升级,确保应用持续保持最佳状态。
  3. 回滚版本,安全兜底:倘若在升级过程中出现意外情况,或者发现新版本存在问题,无需慌张。helm rollback 命令就是你的 “后悔药”,只需指定要回滚的 Release 名称(如 mywordpress)以及回滚到的版本号(如 1),Helm 便能迅速将应用回滚到之前稳定的版本,保障业务的连续性。

(八)更新 Chart:持续优化应用 “蓝图”

在应用的生命周期中,需求变更与功能完善是常有的事,这就需要对 Chart 进行更新。首先,在本地编辑 Chart 配置文件,调整资源分配、添加新的依赖项等;接着,使用 helm package 命令重新打包生成新的 Chart 版本;随后,将新的 Chart 版本推送到 Repository 中,别忘了使用 helm repo update 命令更新本地或远程的 Helm Repository,确保能获取到最新版本;最后,使用 helm upgrade 命令将现有 Release 升级到新的 Chart 版本。例如,要更新 WordPress 的 Chart 版本:

helm upgrade mywordpress myrepo/wordpress --version 0.2.0

如此一来,应用便能紧跟需求变化,持续优化性能。

(九)删除 Release:清理应用 “遗迹”

当某个应用不再需要时,为了释放集群资源,使用 helm uninstall 命令即可将其对应的 Release 删除。例如:

helm uninstall mywordpress

这一操作不仅会删除名为 mywordpress 的 Release,还会一并清理与之相关的 WordPress 应用程序和 MySQL 数据库,干干净净,不留痕迹。若还需要删除与 Release 相关的 PersistentVolumeClaim,只需在命令后加上 --delete-data 选项:

helm uninstall mywordpress --delete-data

五、Helm 资源安装顺序揭秘

Helm 在部署应用时,遵循一套严谨的资源安装顺序,确保应用能够稳定、有序地启动运行:

  1. 首先创建 Namespace,为应用搭建一个独立的 “运行空间”,避免资源冲突。
  2. 接着部署 NetworkPolicy,精细管控网络流量,保障网络安全与稳定。
  3. 然后设置 ResourceQuota,限定资源使用上限,防止某个应用过度占用集群资源。
  4. 引入 LimitRange,进一步细化资源分配粒度,优化资源利用效率。
  5. 部署 PodSecurityPolicy,强化 Pod 层面的安全策略,守护应用运行安全。
  6. 配置 PodDisruptionBudget,确保在集群维护等场景下,应用的可用性不受较大影响。
  7. 创建 ServiceAccount,为 Pod 中的进程提供身份标识,便于与集群 API 交互。
  8. 生成 Secret,用于存储敏感信息,如密码、密钥等,确保数据安全。
  9. 如有需要,生成 SecretList,方便管理多个 Secret。
  10. 创建 ConfigMap,存储非敏感的配置信息,实现配置与应用代码的解耦。
  11. 引入 StorageClass,定义存储资源的类别与特性,满足不同应用的存储需求。
  12. 部署 PersistentVolume,为有持久化存储需求的应用准备存储空间。
  13. 关联 PersistentVolumeClaim,让应用能够精准申请、使用所需的持久化存储资源。
  14. 注册 CustomResourceDefinition,扩展 Kubernetes API,以支持自定义资源类型。
  15. 创建 ClusterRole,定义集群级别的权限规则。
  16. 如有多个 ClusterRole,生成 ClusterRoleList 统一管理。
  17. 建立 ClusterRoleBinding,将 ClusterRole 与特定的主体(如 ServiceAccount)绑定,赋予权限。
  18. 同样,对于多个 ClusterRoleBinding,使用 ClusterRoleBindingList 管理。
  19. 在命名空间内创建 Role,定义命名空间级别的权限。
  20. 配合 RoleList 管理多个 Role。
  21. 生成 RoleBinding,将 Role 与命名空间内的主体绑定,实现精细的权限分配。
  22. 如有多个 RoleBinding,通过 RoleBindingList 统筹管理。
  23. 启动 Service,对外暴露应用的服务接口,实现与外部的交互。
  24. 部署 DaemonSet,确保在集群的每个节点上都运行特定的 Pod,常用于监控、日志收集等场景。
  25. 启动 Pod,承载应用的运行实例。
  26. 如有需要,引入 ReplicationController,早期的副本管理工具,保障 Pod 副本数量稳定。
  27. 部署 ReplicaSet,作为 ReplicationController 的升级版,更精准地控制副本集。
  28. 运用 Deployment,实现应用的滚动更新、回滚等高级部署策略。
  29. 配置 HorizontalPodAutoscaler,根据负载自动