1. 概述

随着容器化应用的规模和复杂度增长,通过手动管理每个 YAML 清单文件来部署 Kubernetes 应用变得越来越困难。同时,跨环境部署时配置管理也变得愈发复杂。

Helm 通过将应用的多个组件打包成一个名为 Chart 的单一对象,解决了这些问题。这使得 Kubernetes 应用的分发和部署变得更加简单。此外,Helm 提供了模板功能,便于在不同环境中统一管理部署配置。

在本教程中,我们将介绍 Helm 部署的基础知识。我们会讲解 Helm 的工作原理、Helm Chart 的组成部分以及 Helm Release 的概念。最后,我们会演示如何列出与特定 Helm 部署关联的 Kubernetes 资源。

2. Helm 是什么?

Helm 是 Kubernetes 的包管理器。它通过将一个应用所需的所有 Kubernetes 资源(如 Deployment、Service、ConfigMap 等)打包成一个名为 Chart 的包,简化了 Kubernetes 上的应用部署。 我们可以通过一个命令完成这些组件的部署。

Helm 还能自动管理依赖关系。如果部署的 Chart 依赖于其他 Chart,Helm 会自动安装这些依赖项。

我们可以将 Helm 类比为操作系统中的包管理工具(如 apt、yum),它们都通过一个命令来安装、升级或卸载软件,背后的复杂细节由包管理器处理。Helm 只是将这种机制应用到了 Kubernetes 上。

安装 Helm 最简单的方法是使用官方提供的安装脚本:

$ curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

该命令会下载并执行 Helm 的安装脚本。

安装完成后,我们可以通过以下命令查看 Helm 的版本:

$ helm version
version.BuildInfo{Version:"v3.16.3", GitCommit:"cfd07493f46efc9debd9cc1b02a0961186df7fdf", GitTreeState:"clean", GoVersion:"go1.22.7"}

从输出可以看到 Helm 已成功安装,版本为 3.16.3

3. Helm Chart 的组成部分

Helm Chart 是一个具有特定目录结构的文件集合。 每个文件在结构中都有其特定用途,用于在 Kubernetes 上部署应用。我们来看一个典型的 Helm Chart 目录结构:

$ ls
Chart.lock          README.md           files               values.schema.json
Chart.yaml          charts              templates           values.yaml

下面我们介绍其中几个关键文件。

3.1. Chart.yaml 文件

Chart.yaml 是描述 Chart 信息的元数据文件。 它包括 Chart 名称、版本、类型、依赖项、API 版本、应用版本等信息。

我们来看一个示例:

$ cat Chart.yaml
apiVersion: v2
name: apache
appVersion: 2.4.62
dependencies:
- name: common
  repository: oci://registry-1.docker.io/bitnamicharts
  tags:
  - bitnami-common
  version: 2.x.x
description: Apache HTTP Server is an open-source HTTP server. The goal of this project
  is to provide a secure, efficient and extensible server that provides HTTP services
  in sync with the current HTTP standards.
-------------------- OUTPUT TRIMMED ----------------------

在这个例子中,Chart.yaml 表明这是一个用于部署 Apache 服务器的 Chart,其应用版本为 2.4.62,并依赖于 Bitnami 的 common Chart。

3.2. templates 目录

templates 目录中存放的是 Kubernetes 的资源模板文件。 这些文件定义了应用所需的 Kubernetes 对象,如 Deployment、Service、Ingress 等。

$ cd templates/
$ ls
NOTES.txt              deployment.yaml        metrics-svc.yaml       serviceaccount.yaml
_helpers.tpl           extra-list.yaml        networkpolicy.yaml     servicemonitor.yaml
configmap-vhosts.yaml  hpa.yaml               pdb.yaml               svc.yaml
configmap.yaml         ingress.yaml           prometheusrules.yaml   tls-secrets.yaml

这些文件不是完整的 Kubernetes 清单,而是带有占位符的模板,可以在部署时动态注入配置值。

例如,我们来看 deployment.yaml 文件:

$ cat deployment.yaml
apiVersion: {{ include "common.capabilities.deployment.apiVersion" . }}
kind: Deployment
metadata:
  name: {{ include "common.names.fullname" . }}
  namespace: {{ .Release.Namespace | quote }}
  labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }}
spec:
  replicas: {{ .Values.replicaCount }}
--------------- OUTPUT TRIMMED -------------

这里的 {{ .Values.replicaCount }} 是 Helm 的模板语法,表示该字段的值将在部署时由外部配置注入。

3.3. values.yaml 文件

values.yaml 是 Helm Chart 的默认配置文件。 它是一个标准的 YAML 文件,定义了用于替换模板中占位符的变量。

我们来看一个示例:

$ cat values.yaml
image:
  registry: docker.io
  repository: bitnami/apache
  tag: 2.4.62-debian-12-r12
replicaCount: 1
-------------------- OUTPUT TRIMMED -------------------

这个文件中的 replicaCount 就会在模板中被替换为 1,从而生成最终的 Kubernetes 清单。

4. Helm Release

简单来说,Release 就是 Chart 的一个部署实例。 当我们将一个 Chart 部署到 Kubernetes 集群后,它就成为一个 Release。

我们可以通过多次部署同一个 Chart 创建多个 Release,每个 Release 也可以有多个版本(当我们对 Chart 做出更改并重新部署时)。

下面,我们来部署一个 Chart:

$ helm install my-apache-app .
NAME: my-apache-app
LAST DEPLOYED: Tue Dec  3 12:13:06 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: apache
CHART VERSION: 11.2.22
APP VERSION: 2.4.62

说明:

  • install:表示执行部署操作。其他操作包括 upgrade(升级)和 rollback(回滚)。
  • my-apache-app:是我们为这个 Release 设置的名称。
  • .:表示当前目录下存在 Chart。

部署完成后,我们可以使用以下命令查看集群中的 Helm Release:

$ helm ls
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART            APP VERSION
my-apache-app   default         1               2024-12-03 12:42:15.695762661 +0000 UTC deployed        apache-11.2.22   2.4.62 

输出表明我们的 Release 已成功部署。

5. 查看与 Release 关联的 Kubernetes 资源

有时我们需要知道某个 Helm Release 创建了哪些 Kubernetes 资源。例如,它可能创建了 Deployment、Service、ConfigMap 等对象。我们需要将这些资源归类,以了解应用的组成。

Helm 默认会在创建的资源上添加一组标签,我们可以利用这些标签进行筛选。

常用的标签包括:

  • app.kubernetes.io/managed-by=Helm:表示该资源由 Helm 创建
  • app.kubernetes.io/instance=<release-name>:表示该资源属于哪个 Release

我们可以通过 kubectl get all 并使用标签筛选来列出这些资源:

$ kubectl get all -l='app.kubernetes.io/managed-by=Helm,app.kubernetes.io/instance=my-apache-app'
NAME                                READY   STATUS    RESTARTS   AGE
pod/my-apache-app-98dbc4946-h5k4d   1/1     Running   0          36m

NAME                    TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
service/my-apache-app   LoadBalancer   10.43.251.153   <pending>     80:31928/TCP,443:31148/TCP   36m

NAME                            READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/my-apache-app   1/1     1            1           36m

NAME                                      DESIRED   CURRENT   READY   AGE
replicaset.apps/my-apache-app-98dbc4946   1         1         1       36m

✅ 上面的命令使用了 -l 参数进行标签筛选,只显示与 my-apache-app 这个 Helm Release 关联的资源。

6. 总结

在本文中,我们介绍了 Helm 的基本概念,并演示了如何识别与特定 Helm 部署关联的 Kubernetes 资源。

我们讲解了 Helm 作为 Kubernetes 包管理器的优势,以及 Helm Chart 的主要组成部分。同时,我们展示了如何创建一个 Helm Release,以及如何利用 Helm 自动添加的标签来过滤出该 Release 所创建的资源。

使用 Helm 可以显著提升我们在 Kubernetes 上部署和管理应用的效率,特别是在处理多环境部署和依赖管理时。


原始标题:Listing Kubernetes Resources Linked to a Helm Deployment