⚙️ 掌握 Helm:跳过 CRD 安装,只提取模板!

各位Kubernetes用户大家好!👋 今天我们将探讨两个核心功能,它们能让Helm变得更加强大和灵活。它们就是跳过CRD (Custom Resource Definitions) 安装的功能,以及在不实际安装 Chart 的情况下只查看生成的Kubernetes清单 (YAML) 的功能。

您是否曾好奇这些功能为何必要,以及何时何地如何使用它们?如果您正在构建CI/CD流水线,或者希望安全地管理复杂的 Chart,那么请务必关注今天的内容!🚀


🤔 CRD,为什么要跳过安装?

Helm Chart 通常在 crds/ 目录中包含应用程序所需的 CRD。当您运行 helm install 时,Helm 会在其他模板之前将这些 CRD 安装到集群中。虽然这是一个方便的功能,但在某些情况下可能会成为问题。

  1. 权限问题 🛡️:安装影响整个集群的 CRD 需要高级权限 (Cluster-Admin)。但是,您可能希望仅使用受限的命名空间权限进行常规应用程序部署,从而实现角色和职责分离。
  2. CRD 集中管理 🏛️:多个团队或多个应用程序经常共享和使用相同的 CRD (例如:Prometheus Operator、Istio)。在这种情况下,如果每个团队在安装 Helm Chart 时都尝试安装/升级 CRD,可能会发生冲突,或者一个团队的升级可能会影响其他团队。由集群管理员集中安装和管理 CRD 一次会安全得多。
  3. 防止 CRD 升级 🛑:从 Helm 3 开始,在 helm upgrade 期间,crds/ 目录中的 CRD 绝不会被升级。这是一种安全机制,旨在防止 CRD 被意外更改或删除,但这也可能使 CRD 管理变得更加棘手。因此,有些人选择从一开始就将 CRD 与 Helm Chart 分开管理的策略。

为了解决这些问题,Helm 提供了一个非常简单的解决方案。

✅ 使用 –skip-crds 标志

顾名思义,这是一个神奇的标志,可以跳过 CRD 安装。只需在 helm install 或 helm upgrade 命令中添加 –skip-crds 标志即可。

使用示例:

# 安装 prometheus-community/kube-prometheus-stack chart,但
# 假设 CRD 已在集群中安装并跳过。

$ helm install my-prometheus prometheus-community/kube-prometheus-stack --skip-crds --namespace monitoring --create-namespace

这样,Helm 将完全忽略 crds/ 目录,只将剩余的模板 (Deployment、Service、ConfigMap 等) 安装到集群中。现在,CRD 管理留给集群管理员,应用程序开发人员可以安全地专注于自己的应用程序部署!


🧐 “会生成什么样的 YAML?” 预览渲染结果

Helm Chart 是一个“框架”,它将 values.yaml 文件与逻辑 (函数、条件语句等) 结合起来,最终生成 Kubernetes YAML 文件。但是,在实际向集群安装任何东西之前,很多时候您会希望直接查看 Helm 究竟会生成什么样的 YAML 文件。

这时,helm template 命令就非常有用。

  1. GitOps 工作流 🤖:ArgoCD 或 Flux 等 GitOps 工具将最终渲染的 YAML 文件存储在源代码仓库 (Git) 中,并与集群同步。helm template 正是生成这种“渲染后的 YAML”的核心工具。
  2. CI/CD 流水线 💡:在将更改应用到集群之前,您可以在 CI 阶段运行 helm template,以自动验证 (lint, validate) 生成的 YAML 文件在语法上是否正确,以及是否按预期进行了更改。
  3. 策略检查 (Policy Check) 👮:您可以使用 OPA (Open Policy Agent) 等工具,将“所有 Pod 都必须具有特定标签”或“不能创建 LoadBalancer 类型的 Service”等组织策略应用于渲染后的 YAML 文件,以检查合规性。
  4. 简单调试和学习 🧑‍🎓:这是查看您修改的 values.yaml 文件如何应用于模板,以及此 Chart 究竟会创建哪些资源的最快、最安全的方法。

✅ 使用 helm template

helm template 命令的使用方式与 helm install 非常相似,但它不与集群通信,而是将结果输出到终端屏幕 (stdout)。

# 输出名为 'my-chart' 的本地 chart 的模板结果。

$ helm template ./my-chart

实际应用示例 (结合各种标志):

helm install 中使用的大多数标志都可以在 helm template 中同样使用,从而几乎完美地模拟实际安装场景。

# 将发布名称指定为 'my-release',
# 假设它安装在 'production' 命名空间中,
# 使用单独的 values-prod.yaml 文件渲染模板,并且
# 将结果保存到 my-manifests.yaml 文件。

$ helm template my-release ./my-chart 
  --namespace production 
  --values ./values-prod.yaml 
  > my-manifests.yaml
  • my-release: 指定发布名称。影响 {{ .Release.Name }} 等模板变量。
  • –namespace production: 指定命名空间。影响 {{ .Release.Namespace }} 变量。
  • –values ./values-prod.yaml: 指定一个额外的配置文件来覆盖默认的 values.yaml。
  • >: 使用标准输出重定向将结果保存到文件。

✨ 总结

今天,我们了解了 Helm 的强大辅助功能:–skip-crds 和 helm template。

  • –skip-crds: 当需要权限分离和稳定的 CRD 管理时,跳过 CRD 安装,只安装其余部分。
  • helm template: 在不影响集群的情况下提前查看将要创建的资源,可用于 GitOps、CI/CD、策略检查等各种自动化。

通过充分利用这两个功能,您将能够更安全、更专业地使用 Helm。希望您的 Kubernetes 运维工作变得更加轻松!😊

标签: Helm, Kubernetes, CI/CD, GitOps, DevOps, CRD, YAML, 模板


Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注