如何使用 Spring Boot 从 Kubernetes 卷挂载中读取密钥和值

Posted

技术标签:

【中文标题】如何使用 Spring Boot 从 Kubernetes 卷挂载中读取密钥和值【英文标题】:How to read secret key and value from Kubernetes volume mount using Spring Boot 【发布时间】:2022-01-21 00:32:35 【问题描述】:

我在 pod 中安装了一个包含用户名和密码的卷。 如果我这样做了,

kubectl  exec -it my-app -- cat /mnt/secrets-store/git-token

"USERNAME":"usernameofgit","PASSWORD":"dhdhfhehfhel"

我想使用 spring boot 读取这个 USERNAME 和 PASSWORD。因为我是新手,有人可以帮我解决这个问题吗。

【问题讨论】:

【参考方案1】:

假设:

文件 (git_token) 格式是固定的 (JSON)。 文件可能没有扩展后缀 (.json)。

...我们有一些问题!

我试过2.3.5. Importing Extensionless Files 喜欢:

spring.config.import=/mnt/secrets-store/git-token[.json]

但它只适用于 YAML/.properties!(使用 spring-boot:2.6.1 测试))

同样适用于2.8. Type-safe Configuration Properties。 ;(;(


在 Spring-Boot 中,我们可以(开箱即用)提供 JSON-config(仅)作为 SPRING_APPLICATION_JSON 环境/命令行属性,它必须是 json 字符串,并且不能是路径或文件(还)。


提议的 (baeldung) 文章展示了“启用 JSON 属性”的方法,但它是一篇很长的文章,有很多细节,展示了很多代码,并且有很多不足/过时(@ConfigurationProperties 上的@Component 相当“非传统”)。 .


我尝试了以下方法(在本地机器上,在上述假设下):

package com.example.demo;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class DemoApplication 

  public static void main(String[] args) 
    SpringApplication.run(DemoApplication.class, args);
  

  @Value("""
    #@jacksonObjectMapper.readValue(
      T(java.nio.file.Files).newInputStream(
        T(java.nio.file.Path).of('/mnt/secrets-store/git-token')),
        T(com.example.demo.GitInfo)
    )""" // watch out with @Value and text blocks! (otherwise: No converter found capable of converting from type [com.example.demo.GitInfo] to type [java.lang.String])
  )
  GitInfo gitInfo;

  @Bean
  CommandLineRunner runner() 
    return (String... args) -> 
      System.out.println(gitInfo.getUsername());
      System.out.println(gitInfo.getPassword());
    ;
  


@Data
class GitInfo 
  @JsonProperty("USERNAME")
  private String username;
  @JsonProperty("PASSWORD")
  private String password;

在板载(仅)spring-boot-starter-web 和 lombok 的情况下,它会打印预期的输出。


解决方案大纲:

为此的一个pojo 大写的问题不大,但可以如图处理。 一个(疯狂的)@Value——(Spring-)表达式,涉及: (希望)自动配置@jacksonObjectMapper bean。 (或者:自定义) ObjectMapper#readValue(可能的替代方案) java.nio.file.Files#newInputStream(可能的替代方案) java.nio.file.Path#of

【讨论】:

【参考方案2】:

安装完卷后,您需要做的就是从 Spring Boot 应用程序中读取 JSON 文件。我推荐阅读Load Spring Boot Properties From a JSON File。

简而言之,您可以创建一个与您的 JSON 文件对应的类,就像这样。

@Component
@PropertySource("file:/mnt/secrets-store/git-token")
@ConfigurationProperties
public class GitToken 
    private String username;
    private String password;

   // getters and setters

然后,您需要将其添加到 componentScan 并且您可以自动连接您的课程。

【讨论】:

以上是关于如何使用 Spring Boot 从 Kubernetes 卷挂载中读取密钥和值的主要内容,如果未能解决你的问题,请参考以下文章

如何从 spring-boot-starter-parent 中排除特定依赖项

如何从 Spring Boot 项目创建 jar,这个 jar 我们想在另一个 Spring Boot 应用程序中使用?

如何从父目录执行spring boot模块?

如何使用 Spring Boot 从 SQL Server 获取当前数据库时间

如何从使用 Spring Cloud Eureka 服务器注册的 Spring Boot 应用程序中公开 Prometheus 指标

如何使用 Spring Boot 从 Kubernetes 卷挂载中读取密钥和值