Kubernetes 配置
配置
一旦你配置好 Quarkus 项目,你可以通过在你的项目根目录运行以下命令来添加 kubernetes-config
扩展。
quarkus extension add kubernetes-config
./mvnw quarkus:add-extension -Dextensions='kubernetes-config'
./gradlew addExtension --extensions='kubernetes-config'
这会将以下内容添加到您的构建文件中
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-kubernetes-config</artifactId>
</dependency>
implementation("io.quarkus:quarkus-kubernetes-config")
用法
该扩展通过使用 Kubernetes Client 直接从 Kubernetes API 服务器读取 ConfigMap 和 Secrets 来工作。
该扩展理解以下类型的 ConfigMap 和 Secrets 作为输入源
默认情况下,该扩展是禁用的,以防止应用程序在未在 Kubernetes 环境中运行时进行 API 调用。 要启用它,请设置 quarkus.kubernetes-config.enabled=true
(例如,使用特定的 profile)。
quarkus.kubernetes-config.config-maps
和 quarkus.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 集群上时,作为该部署的一部分创建了一个名为 postgresql
的 Secret
,其中包含以下条目
-
数据库名称
-
数据库用户
-
数据库密码
使 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,应用程序将尝试从 API 服务器查找配置 环境变量: 显示更多 |
布尔值 |
|
如果设置为 true,如果任何配置的配置源无法找到,应用程序将不会启动 环境变量: 显示更多 |
布尔值 |
|
要在为 Kubernetes Client 配置的命名空间中查找的 ConfigMap。 此列表中稍后定义的 ConfigMap 比此列表中较早定义的 ConfigMap 具有更高的优先级。 此外,在 环境变量: 显示更多 |
字符串列表 |
|
要在为 Kubernetes Client 配置的命名空间中查找的 Secrets。 如果你使用这个,你可能想要启用 环境变量: 显示更多 |
字符串列表 |
|
要在其中查找 ConfigMap 和 Secrets 的命名空间。 如果未指定此项,则使用在 kubectl 配置上下文中配置的命名空间。 如果指定了值并且命名空间不存在,应用程序将无法启动。 环境变量: 显示更多 |
字符串 |