codecamp

Spring Cloud 秘密PropertySource

Kubernetes具有用于存储敏感数据(例如密码,OAuth令牌等)秘密的概念 该项目提供了与Secrets的集成,以使Spring Boot应用程序可以访问机密。您可以通过设置spring.cloud.kubernetes.secrets.enabled属性来显式启用或禁用此功能。

启用后,SecretsPropertySource将从以下来源中为Secrets查找Kubernetes:

  1. 从秘密坐骑递归读取
  2. 以应用程序命名(由spring.application.name定义)
  3. 匹配一些标签

注意:

默认情况下,出于安全原因,未启用通过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

您可以通过多种方式选择要使用的秘密:

  1. 通过列出映射机密的目录:

    -Dspring.cloud.kubernetes.secrets.paths=/etc/secrets/db-secret,etc/secrets/postgresql

    如果您已将所有机密映射到公共根,则可以将它们设置为:

    -Dspring.cloud.kubernetes.secrets.paths=/etc/secrets
  2. 通过设置命名机密:

    -Dspring.cloud.kubernetes.secrets.name=db-secret
  3. 通过定义标签列表:

    -Dspring.cloud.kubernetes.secrets.labels.broker=activemq
    -Dspring.cloud.kubernetes.secrets.labels.db=postgresql

表140.2。Properties:

名称 类型 默认 描述

spring.cloud.kubernetes.secrets.enableApi

Boolean

false

通过API启用或禁用使用机密(示例2和3)

spring.cloud.kubernetes.secrets.enabled

Boolean

true

启用机密PropertySource

spring.cloud.kubernetes.secrets.name

String

${spring.application.name}

设置要查找的机密名称

spring.cloud.kubernetes.secrets.namespace

String

客户端名称空间

设置Kubernetes命名空间的查找位置

spring.cloud.kubernetes.secrets.labels

Map

null

设置用于查找机密的标签

spring.cloud.kubernetes.secrets.paths

List

null

设置安装机密的路径(示例1)


笔记:

  • spring.cloud.kubernetes.secrets.labels属性的行为如 基于Map的绑定 所定义
  • spring.cloud.kubernetes.secrets.paths属性的行为与 基于Collection的binding 定义的行为相同
  • 出于安全原因,可能会限制通过API访问机密。首选方法是将机密安装到Pod。

您可以在spring-boot-camel-config中找到使用机密的应用程序示例(尽管尚未更新以使用新的spring-cloud-kubernetes项目)。

Spring Cloud Kubernetes本机服务发现
Spring Cloud PropertySource重新加载
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

三、Spring Cloud Netflix

SpringCloud Hystrix超时和Ribbon客户

SpringCloud 重试失败的请求

五、Spring Cloud Stream

六、SpringCloud Binder实现

SpringCloud 重试RabbitMQ Binder

SpringCloud Dead-Letter队列处理

八、Spring Cloud Sleuth

SpringCloud 当前Span

十二、Spring Cloud for Cloud Foundry

十三、Spring Cloud Contract

Spring Cloud Contract验证程序设置

SrpingCloud Gradle项目

十五、Spring Cloud网关

Spring Cloud 配置路由谓词工厂和网关过滤工厂

Spring Cloud TLS / SSL

Spring Cloud网关配置

SpringCloud 故障排除

十八、Spring Cloud GCP

Spring Cloud GCP Spring资源

Spring Cloud Spring JDBC

Spring Cloud Redis的Cloud Memorystore

Spring Cloud 云身份识别代理(IAP)身份验证

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }