使用 Quarkus Helm 生成 Helm Chart Manifests

Helm 是最流行的包管理器,用于查找、共享和部署为 Kubernetes 构建的软件。要配置 Java 应用程序通过 Helm 进行分发,您需要将它们打包为 Helm Chart,包含所有必要的元数据和资源定义,这可能是一项非常繁琐的任务。好消息是,Quarkus 最近发布了新的 Quarkus Helm 扩展,它可以自动生成所有这些 Helm Chart Manifests 和资源!

Helm Chart 简介

首先,让我们介绍一下 Helm Chart 的样子。Helm Chart 是一个目录中的文件集合。以下文件是必需的:

  • Chart.yaml:Chart 元数据,例如名称、版本和开发人员。

  • values.yaml:Chart 的默认 YAML 配置值。

  • templates:一个目录,包含资源列表,这些资源与 values.yaml 结合使用,在安装 Chart 时生成应用程序。资源也用 YAML 指定。

有关 Helm Chart 的更多信息,请参阅 官方 Helm 文档

开始使用 Quarkus Helm 扩展

现在,让我们看看如何为 Quarkus 应用程序生成 Helm Chart。

在此示例中,我们将通过运行以下命令创建一个包含 Quarkus Helm 和 Quarkus Kubernetes 扩展的 Quarkus 应用程序:

mvn io.quarkus.platform:quarkus-maven-plugin:2.12.0.Final:create \
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=helm-quickstart \
    -DclassName="org.acme.quickstart.GreetingResource" \
    -Dpath="/hello" \
    -Dextensions="resteasy-reactive,kubernetes,helm"
cd helm-quickstart

如果您已经配置了 Quarkus 项目,可以通过在项目根目录下运行以下命令将 Helm 扩展添加到您的项目中:

./mvnw quarkus:add-extension -Dextensions="helm"

此命令会将以下依赖项添加到您的 pom.xml 文件中:

<dependency>
    <groupId>io.quarkiverse.helm</groupId>
    <artifactId>quarkus-helm</artifactId>
</dependency>

现在您可以使用 Maven 构建命令生成 Helm 资源:

./mvnw clean package

根据您在项目中使用的 Quarkus Kubernetes 扩展,Helm 资源将包含不同的资源。由于我们使用了 Quarkus Kubernetes 扩展,Helm Chart 资源将在 target/helm/kubernetes/<chart name>/ 目录中生成。

<chart name> 由属性 quarkus.helm.name 或 Quarkus 应用程序名称设置。

此外,Helm 资源在 target/helm/kubernetes/<chart name>/templates 目录中包含以下文件:

  • deployment.yaml

  • ingress.yaml

  • service.yaml

相反,如果我们使用 Quarkus OpenShift 扩展,Helm Chart 源码将在 target/helm/openshift/<chart name>/ 目录中生成,并将包含 buildconfig.yamldeploymentconfig.yamlservice.yamlimagestream.yaml 文件。

Helm 的使用

接下来,让我们看看如何使用之前生成的 Helm Chart。

首先,请确保您已安装 Helm 命令行界面 (CLI) 并登录到 Kubernetes 集群。

然后运行以下 Maven 命令生成 Helm 构件:

./mvnw clean package

并将生成的 Helm Chart 安装到集群中:

helm install helm-example ./target/helm/kubernetes/<chart name>

helm 命令会一直等待,直到 Chart 完全安装并且应用程序启动并运行。

您可以通过几种方式更新部署。第一种是通过 Helm CLI 的 upgrade 命令。在对项目进行更改并重新生成资源后,您可以使用以下命令升级部署:

helm upgrade helm-example ./target/helm/kubernetes/<chart name>

更新部署的第二种方法是通过 helm upgrade 命令的 --set 选项:

helm upgrade helm-example ./target/helm/kubernetes/<chart name> --set app.replicas=1

app.replicas 选项是一个参数化属性,它由 values.yaml 文件映射。我们将在下一节中详细探讨此功能。

最后,要删除部署,请输入:

helm uninstall helm-example

映射值

Helm 允许在安装 Chart 时或 Chart 安装后映射值,以设置您资源的属性。例如,假设您的 templates/deployment.yaml 文件中的部署模板如下所示:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: example
spec:
  replicas: {{ .Values.app.replicas }}

您可以使用 helm 命令在安装 Chart 时设置副本数量,如上一节所示:

helm upgrade helm-example ./target/helm/kubernetes/<chart name> --set app.replicas=1

或者,您可以在生成的 values.yaml 文件中设置副本数量,该文件位于 Chart 目录下的 target/helm/kubernetes/<chart name>/values.yaml

app:
  replicas: 1

那么,我需要手动更新 values.yaml 和模板资源来映射这些属性吗?不需要!Quarkus Helm 扩展会自动映射一些预配置的属性,例如 Kubernetes 副本数量或 ingress host。预配置属性的完整列表可以在 Quarkus Helm 官方网站文档中找到。

让我们通过一个使用 Quarkus Kubernetes quarkus.kubernetes.replicas 属性配置副本数量的示例来尝试一下。我们将看到 Quarkus Helm 扩展如何自动将其映射到生成的 Helm Chart 中。

首先,在您的 application.properties 文件中设置 3 个副本:

quarkus.kubernetes.replicas=3

现在,位于 target/helm/kubernetes/<chart name>/values.yaml 的生成的 Helm 值文件将包含副本值:

app:
  replicas: 3

此外,位于 target/helm/kubernetes/<chart name>/templates/deployment.yaml 的部署模板文件将包含对该值的引用:

但是,如果我们想映射未预配置的其他属性怎么办?例如,给定以下部署模板文件,我想映射出现在 metadata.name 属性中的值 example

apiVersion: apps/v1
kind: Deployment
metadata:
  name: example ## let's map this value!
# ...

您可以通过配置 Quarkus Helm 扩展来映射资源中存在的任何属性,使用 YAMLPath 表达式。为了继续前面的示例,您只需要将以下配置添加到您的属性中:

quarkus.helm.values[0].property=resource (1)
quarkus.helm.values[0].paths=metadata.name (2)
1 property 是将在生成的 values.yaml 中设置的属性名称。
2 paths 是标识您要使用的属性的 YAMLPath 表达式列表。

使用刚定义的属性,位于 target/helm/kubernetes/<chart name>/values.yaml 的生成的 Helm 值文件现在将包含:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Values.app.resource }} # `resource` comes from the property `quarkus.helm.values[0].property`
# ...

YAMLPath 表达式也支持更复杂的场景。您可以使用这些表达式来替换特定资源类型或描述为键值映射的属性。您可以在 此处找到所有支持的功能。

Helm Profile

默认情况下,所有属性都映射到同一个 Helm values.yaml 文件。但是,Quarkus Helm 扩展还支持生成其他 Helm 值文件。

例如,假设您有两个环境:一个用于测试,另一个用于生产。每个环境都有不同的 ingress host 来暴露您的 Kubernetes 应用程序。您可以按如下方式配置您的应用程序:

# Mapped to `values.yaml` by the preconfigured Ingress decorator
quarkus.kubernetes.ingress.host=my-host

# Overwrite the value of `quarkus.kubernetes.ingress.host` to `values-<profile-name>.yaml`:
quarkus.helm.values[0].property=host
quarkus.helm.values[0].paths=(kind == Ingress).spec.rules.host
quarkus.helm.values[0].value=my-test-host
## `test` is the profile name.
quarkus.helm.values[0].profile=test

ingress host 属性由 Quarkus Helm 扩展预配置。因此,您将在 target/helm/kubernetes/<chart name>/values.yaml 文件中找到 my-host 值:

app:
  host: my-host

但是,由于您还在属性中使用了一个名为 test 的 Profile,Quarkus Helm 扩展还会生成一个 target/helm/kubernetes/<chart name>/values-test.yaml 文件,内容如下:

app:
  host: my-test-host

在测试环境中安装 Chart 时,您可以使用此值文件,如下命令所示:

helm install -f ./target/helm/kubernetes/<chart name>/values-test.yaml helm-example ./target/helm/kubernetes/<chart name>

总结

在本文中,我们学习了如何使用 Quarkus Helm 扩展轻松生成 Helm Chart,如何映射在安装或更新 Chart 时要设置的属性,以及如何使用 Helm Profile。