机密 PropertySource
Kubernetes 具有用于存储
敏感数据,例如密码、OAuth 令牌等。该项目提供与Secrets
制作 secret
可由 Spring Boot 应用程序访问。您可以通过设置spring.cloud.kubernetes.secrets.enabled
财产。
启用后,Fabric8SecretsPropertySource
在 Kubernetes 中查找Secrets
来自以下来源:
-
从 secrets 挂载中递归读取
-
以应用程序命名(由
spring.application.name
) -
匹配一些标签
注意:
默认情况下,出于安全原因,通过 API 使用密钥(上述第 2 点和第 3 点)未启用。对 Secret 的权限 'list' 允许客户端检查指定命名空间中的 Secret 值。 此外,我们建议容器通过挂载的卷共享密钥。
如果您允许通过 API 使用 Secrets,我们建议您使用授权策略(如 RBAC)来限制对 Secrets 的访问。 有关通过 API 使用 Secrets 时的风险和最佳实践的更多信息,请参阅此文档。
如果找到密钥,则其数据将可供应用程序使用。
假设我们有一个名为demo
它使用 properties 来读取其数据库
配置。我们可以使用以下命令创建 Kubernetes 密钥:
kubectl create secret generic db-secret --from-literal=username=user --from-literal=password=p455w0rd
前面的命令将创建以下密钥(您可以使用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
命令。
然后,您的应用程序可以使用此密钥 — 例如,通过将密钥的值导出为环境变量:
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
您可以通过多种方式选择要使用的密钥:
-
通过列出映射 secret 的目录:
-Dspring.cloud.kubernetes.secrets.paths=/etc/secrets/db-secret,etc/secrets/postgresql
如果您已将所有密钥映射到一个公共根,则可以像这样设置它们:
-Dspring.cloud.kubernetes.secrets.paths=/etc/secrets
-
通过设置命名密钥:
-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
List 使这成为可能。
例如,您可以定义以下内容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
未定,
这Secret
叫s1
将在应用程序运行的命名空间中查找。
请参阅 namespace-resolution 以更好地了解命名空间
的申请已解决。
与ConfigMaps
;如果您希望应用程序无法启动
当无法加载时Secrets
property sources 中,您可以设置spring.cloud.kubernetes.secrets.fail-fast=true
.
也可以为Secret
属性源就像ConfigMaps
.
与ConfigMap
property 源,首先需要设置spring.cloud.kubernetes.secrets.fail-fast=true
.
然后你需要添加spring-retry
和spring-boot-starter-aop
添加到您的 Classpath 中。
重试行为Secret
属性源可以通过设置spring.cloud.kubernetes.secrets.retry.*
性能。
如果您已经拥有spring-retry 和spring-boot-starter-aop 由于某种原因,在 Classpath 上
并希望启用快速失败,但不希望启用重试;您可以对Secrets PropertySources 通过设置spring.cloud.kubernetes.secrets.retry.enabled=false . |
由于来自 Secrets 的数据通常被视为敏感数据,因此 Actuator 的 endpoints/env
和/configprops
可以清理数据,使其不以纯文本显示。为此,您需要设置:
spring.cloud.kubernetes.sanitize.secrets=true
支持此设置,因为3.0.6
和向上。
名字 | 类型 | 违约 | 描述 |
---|---|---|---|
|
|
|
启用 Secret |
|
|
|
设置要查找的 secret 的名称 |
|
|
客户端命名空间 |
设置要查找的 Kubernetes 命名空间 |
|
|
|
设置用于查找密钥的标签 |
|
|
|
设置 secret 的挂载路径(示例 1) |
|
|
|
启用或禁用通过 API 使用密钥(示例 2 和 3) |
|
|
|
启用或禁用在加载 |
|
|
|
启用或禁用密钥重试。 |
|
|
|
初始重试间隔(以毫秒为单位)。 |
|
|
|
最大尝试次数。 |
|
|
|
回退的最大间隔。 |
|
|
|
下一个间隔的乘数。 |
笔记:
-
这
spring.cloud.kubernetes.secrets.labels
属性的行为与基于 Map 的绑定定义的行为相同。 -
这
spring.cloud.kubernetes.secrets.paths
property 的行为与 Collection based binding(基于集合的绑定)定义的行为相同。 -
出于安全原因,通过 API 访问密钥可能会受到限制。首选方法是将 secret 挂载到 Pod。
您可以找到一个使用 Secret 的应用程序示例(尽管它尚未更新为使用新的spring-cloud-kubernetes
项目)位于 spring-boot-camel-config