【问题标题】:How to set an SpringBoot array property as a kubernets secret?如何将 Spring Boot 数组属性设置为 kubernetes 机密?
【发布时间】:2022-11-03 02:47:37
【问题描述】:

我想使用从 k8s 密钥到 SpringBoot 属性的直接翻译。 因此我有一个舵图(但与普通 k8s 类似):

apiVersion: v1
data:
  app.entry[0].name: {{.Values.firstEntry.name | b64enc }}
kind: Secret
metadata:
  name: my-secret
type: Opaque

我的意图是这就像我设置了弹簧属性文件一样:

app.entry[0].name: "someName"

但是当我这样做时,我得到一个错误:

 Invalid value: "[app.entry[0].name]": a valid config key must consist of alphanumeric characters, '-', '_' or '.' (e.g. 'key.name',  or 'KEY_NAME',  or 'key-name', regex used for validation is '[-._a-zA-Z0-9]+'),

因此,[0] 似乎不允许作为密钥的密钥名称。

知道如何将数组条目直接从 k8s 秘密名称注入到 spring 中吗?

疯狂地射击我尝试了这些都失败了:

  • app.entry[0].name: ... -- k8s 拒绝 '['
  • app.entry__0.name: ... -- k8s 可以,但是 Spring 不将其识别为数组(我认为)
  • "app.entry[0].name": ... -- k8s 拒绝 '['
  • 'app.entry[0].name': ... -- k8s 拒绝 '['

【问题讨论】:

  • (1.)“舵图”遵循“yaml 语法”,app.entry[0].name 看起来像(java.util.Properties)的“扁平键”,试图转换为适当的格式?
  • @xerx593 据我了解 k8s 的秘密,它们是一个键值映射。因此 yaml 递归字典(如您删除的答案)将不起作用。我认为。正如您可能知道的那样,spring 中的原始格式是“属性”,即基本上是带有花哨键语义的普通键值映射。那个 spring 可以读取 yaml 文件是后来出现的。所以“适当的”语法将是扁平化的关键。不确定,但这就是我的理解。
  • 我只是试图“按照错误信息” :)
  • 这样的事情会有帮助吗? baeldung.com/spring-inject-arrays-lists。然而,扁平化键更有意义,因为它的键值概念。
  • @Godwin 是的......代码更改。我们现在正在这样做。但我希望不需要更改客户端代码。也许是未来的通用解决方案。

标签: spring-boot kubernetes kubernetes-secrets


【解决方案1】:

您可以将 json 文件保存为秘密

步骤1: 创建需要存储为秘密example : secret-data.json的json文件

{
  "entry": [
    {
      "name1": "data1",
      "key1": "dataX"
    },
    {
      "name2": "data2",
      "key2": "dataY"
    }
  ]
}

Step2:从文件中创建一个秘密

kubectl create secret generic data-1 --from-file=secret-data.json

第 3 步:将秘密附加到 pod

env:
  - name: APP_DATA
    valueFrom:
      secretKeyRef:
        name: data-1
        key: secret-data.json

您可以通过 exec 进入容器并检查 env 来验证相同的内容

【讨论】:

    猜你喜欢
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2020-02-16
    • 2018-08-26
    相关资源
    最近更新 更多