编辑此页面

Kubernetes 配置

Quarkus 包括 kubernetes-config 扩展,它允许开发人员使用 Kubernetes ConfigMapSecrets 作为配置源,而无需将它们挂载到运行 Quarkus 应用程序的 Pod 中,或者对他们的 Kubernetes Deployment(或 OpenShift DeploymentConfig)进行任何其他修改。

配置

一旦你配置好 Quarkus 项目,你可以通过在你的项目根目录运行以下命令来添加 kubernetes-config 扩展。

CLI
quarkus extension add kubernetes-config
Maven
./mvnw quarkus:add-extension -Dextensions='kubernetes-config'
Gradle
./gradlew addExtension --extensions='kubernetes-config'

这会将以下内容添加到您的构建文件中

pom.xml
<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-kubernetes-config</artifactId>
</dependency>
build.gradle
implementation("io.quarkus:quarkus-kubernetes-config")

用法

该扩展通过使用 Kubernetes Client 直接从 Kubernetes API 服务器读取 ConfigMap 和 Secrets 来工作。

该扩展理解以下类型的 ConfigMap 和 Secrets 作为输入源

  • 包含字面数据的 ConfigMap 和 Secrets(参见 这个 了解如何创建一个的例子)

  • 从名为 application.propertiesapplication.yamlapplication.yml 的文件创建的 ConfigMap 和 Secrets(参见 这个 了解如何创建一个的例子)。

默认情况下,该扩展是禁用的,以防止应用程序在未在 Kubernetes 环境中运行时进行 API 调用。 要启用它,请设置 quarkus.kubernetes-config.enabled=true(例如,使用特定的 profile)。

quarkus.kubernetes-config.config-mapsquarkus.kubernetes-config.secrets 的值决定了哪些 ConfigMap 和/或 Secrets 将被用作配置源。请记住,这些 ConfigMap 和 Secrets 必须与运行的应用程序在同一个 Kubernetes Namespace 中。 如果它们要在不同的命名空间中找到,那么必须将 quarkus.kubernetes-config.namespace 设置为正确的值。

获取的属性的优先级

从 ConfigMap 和 Secrets 获取的属性具有比 application.properties(或 YAML 等效项)中找到的相同名称的任何属性更高的优先级(即,它们覆盖),但它们具有比通过环境变量或 Java 系统属性设置的属性更低的优先级。

此外,当使用多个 ConfigMap(或 Secrets)时,列表中稍后定义的 ConfigMap(或 Secrets)比列表中较早定义的 ConfigMap 具有更高的优先级。

最后,当同时使用 ConfigMap 和 Secrets 时,后者始终比前者具有更高的优先级。

Kubernetes 权限

由于读取 ConfigMap 涉及与 Kubernetes API 服务器的交互,当 RBAC 在集群上启用时,用于运行应用程序的 ServiceAccount 需要具有此类访问的适当权限。

值得庆幸的是,当将 kubernetes-config 扩展与 Kubernetes 扩展一起使用时,会自动生成所有必要的 Kubernetes 资源来实现这一点。

Secrets

默认情况下,Kubernetes 扩展不会生成允许访问 Secrets 的必要资源。 设置 quarkus.kubernetes-config.secrets.enabled=true 以生成必要的角色和相应的角色绑定。

示例配置

一个非常常见的用例是部署一个需要访问关系数据库的 Quarkus 应用程序,该数据库本身已经部署在 Kubernetes 上。 使用 quarkus-kubernetes-config 扩展使得这个用例非常容易处理。

假设我们的 Quarkus 应用程序需要与 PostgreSQL 通信,并且当 PostgreSQL 部署在我们的 Kubernetes 集群上时,作为该部署的一部分创建了一个名为 postgresqlSecret,其中包含以下条目

  • 数据库名称

  • 数据库用户

  • 数据库密码

使 Quarkus 使用这些条目连接数据库的一种可能方法是使用以下配置

%prod.quarkus.kubernetes-config.secrets.enabled=true                            (1)
quarkus.kubernetes-config.secrets=postgresql                                    (2)

%prod.quarkus.datasource.jdbc.url=postgresql://somehost:5432/${database-name}   (3)
%prod.quarkus.datasource.username=${database-user}                              (4)
%prod.quarkus.datasource.password=${database-password}                          (5)
1 启用 Secrets 的读取。请注意 %prod 配置文件的使用,因为我们只希望在应用程序在生产环境中运行时应用此设置。
2 配置将使用的 Secret 的名称。 这不需要以 %prod 配置文件为前缀,因为如果 Secret 读取被禁用,它将没有任何影响。
3 Quarkus 将用从 postgres Secret 的名称为 database-name 的条目获得的值替换 ${database-name}somehost 是在将 PostgreSQL 部署到 Kubernetes 时创建的 Kubernetes Service 的名称。
4 Quarkus 将用从 postgres Secret 的名称为 database-user 的条目获得的值替换 ${database-user}
5 Quarkus 将用从 postgres Secret 的名称为 database-password 的条目获得的值替换 ${database-password}

上面的值允许应用程序完全不知道生产环境中使用的实际数据库配置,同时也不会抑制应用程序在开发时的可用性。

替代方案

使用 quarkus-kubernetes-config 扩展是完全可选的,因为还有其他方法可以配置应用程序以使用 ConfigMap 或 Secrets。

一种常见的替代方法是将 ConfigMap 和 / Secret 的每个条目映射到 Kubernetes Deployment 上的环境变量 - 有关更多详细信息,请参见 。 为了在 Quarkus 中实现这一点,我们可以使用 quarkus-kubernetes 扩展(它负责创建 Kubernetes 清单并包括以下配置)并将其配置如下

quarkus.kubernetes.env.secrets=postgresql
quarkus.kubernetes.env.mapping.database-name.from-secret=postgresql
quarkus.kubernetes.env.mapping.database-name.with-key=database-name
quarkus.kubernetes.env.mapping.database-user.from-secret=postgresql
quarkus.kubernetes.env.mapping.database-user.with-key=database-user
quarkus.kubernetes.env.mapping.database-password.from-secret=postgresql
quarkus.kubernetes.env.mapping.database-password.with-key=database-password

%prod.quarkus.datasource.jdbc.url=postgresql://somehost:5432/${database-name}
%prod.quarkus.datasource.username=${database-user}
%prod.quarkus.datasource.password=${database-password}

上述配置的最终结果是将以下 env 部分应用于生成的 Deployment

          env:
            - name: DATABASE_NAME
              valueFrom:
                secretKeyRef:
                  key: database-name
                  name: postgresql
            - name: DATABASE_USER
              valueFrom:
                secretKeyRef:
                  key: database-user
                  name: postgresql
            - name: DATABASE_PASSWORD
              valueFrom:
                secretKeyRef:
                  key: database-password
                  name: postgresql

有关更多详细信息,请参见

配置参考

构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖

配置属性

类型

默认

是否可以从 Secrets 读取配置。如果设置为 true,将生成允许访问 Secrets 的 Kubernetes 资源(角色和角色绑定)。

环境变量: QUARKUS_KUBERNETES_CONFIG_SECRETS_ENABLED

显示更多

布尔值

false

角色的名称。

环境变量: QUARKUS_KUBERNETES_CONFIG_SECRETS_ROLE_CONFIG_NAME

显示更多

字符串

view-secrets

角色的命名空间。

环境变量: QUARKUS_KUBERNETES_CONFIG_SECRETS_ROLE_CONFIG_NAMESPACE

显示更多

字符串

角色是否是集群范围的。 默认情况下,它不是集群范围的角色。

环境变量: QUARKUS_KUBERNETES_CONFIG_SECRETS_ROLE_CONFIG_CLUSTER_WIDE

显示更多

布尔值

false

当前角色是否要生成。 如果不是,它将仅用于生成角色绑定资源。

环境变量: QUARKUS_KUBERNETES_CONFIG_SECRETS_ROLE_CONFIG_GENERATE

显示更多

布尔值

true

如果设置为 true,应用程序将尝试从 API 服务器查找配置

环境变量: QUARKUS_KUBERNETES_CONFIG_ENABLED

显示更多

布尔值

false

如果设置为 true,如果任何配置的配置源无法找到,应用程序将不会启动

环境变量: QUARKUS_KUBERNETES_CONFIG_FAIL_ON_MISSING_CONFIG

显示更多

布尔值

true

要在为 Kubernetes Client 配置的命名空间中查找的 ConfigMap。 此列表中稍后定义的 ConfigMap 比此列表中较早定义的 ConfigMap 具有更高的优先级。 此外,在 secrets 中定义的任何 Secrets 将比所有 ConfigMap 具有更高的优先级。

环境变量: QUARKUS_KUBERNETES_CONFIG_CONFIG_MAPS

显示更多

字符串列表

要在为 Kubernetes Client 配置的命名空间中查找的 Secrets。 如果你使用这个,你可能想要启用 quarkus.kubernetes-config.secrets.enabled。 此列表中稍后定义的 Secrets 比此列表中较早定义的 ConfigMap 具有更高的优先级。 此外,这些 Secrets 比 configMaps 中定义的所有 ConfigMap 具有更高的优先级。

环境变量: QUARKUS_KUBERNETES_CONFIG_SECRETS

显示更多

字符串列表

要在其中查找 ConfigMap 和 Secrets 的命名空间。 如果未指定此项,则使用在 kubectl 配置上下文中配置的命名空间。 如果指定了值并且命名空间不存在,应用程序将无法启动。

环境变量: QUARKUS_KUBERNETES_CONFIG_NAMESPACE

显示更多

字符串

相关内容