Spring Cloud 秘密PropertySource
Kubernetes具有用于存储敏感数据(例如密码,OAuth令牌等)的秘密的概念
。该项目提供了与Secrets
的集成,以使Spring Boot应用程序可以访问机密。您可以通过设置spring.cloud.kubernetes.secrets.enabled
属性来显式启用或禁用此功能。
启用后,SecretsPropertySource
将从以下来源中为Secrets
查找Kubernetes:
- 从秘密坐骑递归读取
- 以应用程序命名(由
spring.application.name
定义) - 匹配一些标签
注意:
默认情况下,出于安全原因,未启用通过API消费机密(以上第2点和第3点)。机密上的权限“列表”允许客户端检查指定名称空间中的机密值。 此外,我们建议容器通过安装的卷共享机密。
如果您通过API启用使用机密,我们建议您使用授权策略(例如RBAC)限制对机密的访问。有关通过API使用“机密”时的风险和最佳做法的更多信息,请参阅此文档 。
如果找到了机密,则其数据可供应用程序使用。
假设我们有一个名为demo
的spring boot应用程序,该应用程序使用属性读取其数据库配置。我们可以使用以下命令创建Kubernetes机密:
oc create secret generic db-secret --from-literal=username=user --from-literal=password=p455w0rd
前面的命令将创建以下秘密(您可以使用oc 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编码版本。
然后,您的应用程序可以使用此秘密-例如,通过将秘密的值导出为环境变量:
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
您可以通过多种方式选择要使用的秘密:
-
通过列出映射机密的目录:
-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
表140.2。Properties:
名称 | 类型 | 默认 | 描述 |
---|---|---|---|
|
|
|
通过API启用或禁用使用机密(示例2和3) |
|
|
|
启用机密 |
|
|
|
设置要查找的机密名称 |
|
|
客户端名称空间 |
设置Kubernetes命名空间的查找位置 |
|
|
|
设置用于查找机密的标签 |
|
|
|
设置安装机密的路径(示例1) |
笔记:
spring.cloud.kubernetes.secrets.labels
属性的行为如 基于Map的绑定 所定义 。spring.cloud.kubernetes.secrets.paths
属性的行为与 基于Collection的binding 定义的行为相同 。- 出于安全原因,可能会限制通过API访问机密。首选方法是将机密安装到Pod。
您可以在spring-boot-camel-config中找到使用机密的应用程序示例(尽管尚未更新以使用新的spring-cloud-kubernetes
项目)。
更多建议: