Kubernetes Config

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

Configuration

一旦您配置好Quarkus项目,您就可以在项目基本目录中运行以下命令,来添加`kubernetes-config`扩展。

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

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

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

Usage

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

该扩展将以下ConfigMap和Secret类型识别为输入源:

  • 包含文本数据的ConfigMap和Secret(请参阅 this以获取有关如何创建它们的示例)

  • 从名为`application.properties`、`application.yaml`或`application.yml`的文件创建的ConfigMap和Secret(请参阅 this以获取有关如何创建它们的示例)。

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

`quarkus.kubernetes-config.config-maps`和`quarkus.kubernetes-config.secrets`的值决定了哪些ConfigMap和/或Secret将用作配置源。请记住,这些ConfigMap和Secret必须与正在运行的应用程序处于相同的Kubernetes`Namespace`中。如果要将它们放在不同的名称空间中,则必须将`quarkus.kubernetes-config.namespace`设置为正确的值。

Priority of obtained properties

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

此外,当使用多个ConfigMap(或Secret)时,列表中后面定义的ConfigMap(或Secret)优先于列表中前面定义的ConfigMap。

最后,当同时使用ConfigMap和Secret时,后者的优先级始终高于前者。

Kubernetes Permissions

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

值得庆幸的是,当将`kubernetes-config`扩展与Kubernetes扩展一起使用时,将自动生成实现上述目的所需的所有必要的Kubernetes资源。

Secrets

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

Example configuration

一个非常常见的用例是部署需要访问关系数据库的Quarkus应用程序,而该数据库本身已部署在Kubernetes上。使用`quarkus-kubernetes-config`扩展可以非常简单地处理此用例。

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

  • database-name

  • database-user

  • database-password

使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 启用阅读秘密。请注意使用`%prod`配置文件,因为我们只希望在应用程序在生产中运行时应用此设置。
2 配置会使用的密钥的名称。无需为此添加 @"1" 配置文件的前缀,因为它在禁用密钥读取时不起作用。
3 Quarkus 会用从 @"4" 密钥名称为 @"3" 的条目中获取的值替换 @"2"。@"5" 是在将 PostgreSQL 部署到 Kubernetes 时创建的 Kubernetes @"6" 的名称。
4 Quarkus 会用从 @"9" 密钥名称为 @"8" 的条目中获取的值替换 @"7"。
5 Quarkus 会用从 @"12" 密钥名称为 @"11" 的条目中获取的值替换 @"10"。

上面的值允许应用程序完全忽略在生产中使用的实际数据库配置,同时也不妨碍在开发时使用应用程序。

Alternatives

使用 @"13" 扩展是完全可选的,因为应用程序还可以通过其他方式进行配置以使用 ConfigMaps 或 Secrets。

一种常见的替代方法是在 Kubernetes @"14" 上将 ConfigMap 和 / Secret 的各个条目映射到环境变量 - 有关更详细的信息,请参见 @"16"。在 Quarkus 中实现此目的时,我们可以使用 @"15" 扩展(负责创建 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}

上述配置的最终结果是将以下 @"17" 部分应用于生成的 @"18":

          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

有关更详细的信息,请参见 @"19"。

Configuration Reference

@"20"