Secrets 属性源
Kubernetes 提供了名为 Secrets 的概念,用于存储敏感数据,例如密码、OAuth 令牌等。此项目提供了与 `Secrets` 的集成,使 Spring Boot 应用程序能够访问这些 secrets。您可以通过设置 `spring.cloud.kubernetes.secrets.enabled` 属性来显式启用或禁用此功能。
启用后,`Fabric8SecretsPropertySource` 将从以下来源在 Kubernetes 中查找 `Secrets`
-
递归读取 secrets 挂载点
-
以应用程序名称命名(由 `spring.application.name` 定义)
-
匹配某些标签
注意
出于安全原因,默认情况下,**不会启用**通过 API 使用 Secrets(上述第 2 点和第 3 点)。secrets 上的“list”权限允许客户端检查指定命名空间中 secrets 的值。此外,我们建议容器通过挂载卷共享 secrets。
如果启用通过 API 使用 Secrets,我们建议您使用授权策略(例如 RBAC)来限制对 Secrets 的访问。有关通过 API 使用 Secrets 时风险和最佳实践的更多信息,请参阅 此文档。
如果找到 secrets,则其数据将提供给应用程序。
假设我们有一个名为 `demo` 的 Spring Boot 应用程序,它使用属性来读取其数据库配置。我们可以使用以下命令创建一个 Kubernetes secret:
kubectl create secret generic db-secret --from-literal=username=user --from-literal=password=p455w0rd
上述命令将创建以下 secret(您可以使用 `kubectl get secrets db-secret -o yaml` 查看):
apiVersion: v1
data:
password: cDQ1NXcwcmQ=
username: dXNlcg==
kind: Secret
metadata:
creationTimestamp: 2017-07-04T09:15:57Z
name: db-secret
namespace: default
resourceVersion: "357496"
selfLink: /api/v1/namespaces/default/secrets/db-secret
uid: 63c89263-6099-11e7-b3da-76d6186905a8
type: Opaque
请注意,数据包含 `create` 命令提供的文本的 Base64 编码版本。
然后,您的应用程序可以使用此 secret,例如,通过将 secret 的值导出为环境变量:
apiVersion: v1
kind: Deployment
metadata:
name: ${project.artifactId}
spec:
template:
spec:
containers:
- env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: db-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
您可以通过多种方式选择要使用的 Secrets:
-
列出 secrets 映射到的目录
-Dspring.cloud.kubernetes.secrets.paths=/etc/secrets/db-secret,etc/secrets/postgresql
如果所有 secrets 都映射到一个公共根目录,您可以像这样设置它们:
-Dspring.cloud.kubernetes.secrets.paths=/etc/secrets
-
设置命名的 secret
-Dspring.cloud.kubernetes.secrets.name=db-secret
-
定义标签列表
-Dspring.cloud.kubernetes.secrets.labels.broker=activemq -Dspring.cloud.kubernetes.secrets.labels.db=postgresql
与 `ConfigMap` 一样,也可以使用多个 `Secret` 实例进行更高级的配置。`spring.cloud.kubernetes.secrets.sources` 列表使这成为可能。例如,您可以定义以下 `Secret` 实例:
spring:
application:
name: cloud-k8s-app
cloud:
kubernetes:
secrets:
name: default-name
namespace: default-namespace
sources:
# Spring Cloud Kubernetes looks up a Secret named s1 in namespace default-namespace
- name: s1
# Spring Cloud Kubernetes looks up a Secret named default-name in namespace n2
- namespace: n2
# Spring Cloud Kubernetes looks up a Secret named s3 in namespace n3
- namespace: n3
name: s3
在前面的示例中,如果未设置 `spring.cloud.kubernetes.secrets.namespace`,则将在应用程序运行的命名空间中查找名为 `s1` 的 `Secret`。请参阅 命名空间解析,以更好地了解如何解析应用程序的命名空间。
与 `ConfigMaps` 类似;如果希望应用程序在无法加载 `Secrets` 属性源时启动失败,可以设置 `spring.cloud.kubernetes.secrets.fail-fast=true`。
还可以为 `Secret` 属性源启用重试 类似于 `ConfigMaps`。与 `ConfigMap` 属性源一样,首先需要设置 `spring.cloud.kubernetes.secrets.fail-fast=true`。然后,您需要将 `spring-retry` 和 `spring-boot-starter-aop` 添加到您的类路径中。`Secret` 属性源的重试行为可以通过设置 `spring.cloud.kubernetes.secrets.retry.*` 属性来配置。
如果由于某种原因您已经在类路径中拥有 `spring-retry` 和 `spring-boot-starter-aop`,并且想要启用快速失败,但不想启用重试;您可以通过设置 `spring.cloud.kubernetes.secrets.retry.enabled=false` 来禁用 `Secrets` `PropertySources` 的重试。 |
由于来自 Secrets 的数据通常被视为敏感数据,因此可以使执行器端点 `/env` 和 `/configprops` 对数据进行清理,以便不会以纯文本显示。为此,您需要设置:
spring.cloud.kubernetes.sanitize.secrets=true
此设置自 `3.0.6` 及更高版本起受支持。
名称 | 类型 | 默认值 | 描述 |
---|---|---|---|
|
|
|
启用 Secrets `PropertySource` |
|
|
|
设置要查找的 secret 的名称 |
|
|
客户端命名空间 |
设置要在其中查找的 Kubernetes 命名空间 |
|
|
|
设置用于查找 secrets 的标签 |
|
|
|
设置 secrets 挂载的路径(示例 1) |
|
|
|
启用或禁用通过 API 使用 secrets(示例 2 和 3) |
|
|
|
启用或禁用在加载 `Secret` 时发生错误时使应用程序启动失败 |
|
|
|
启用或禁用 secrets 重试。 |
|
|
|
初始重试间隔(毫秒)。 |
|
|
|
最大尝试次数。 |
|
|
|
回退的最大间隔。 |
|
|
|
下一个间隔的乘数。 |
备注
您可以在 spring-boot-camel-config 中找到一个使用 secrets 的应用程序示例(尽管它尚未更新为使用新的 `spring-cloud-kubernetes` 项目)