【问题标题】:Byte array as kubernetes secret?字节数组作为 kubernetes 的秘密?
【发布时间】:2019-12-12 02:00:53
【问题描述】:

我想知道是否可以将字节数组作为 kubernetes 机密。 我创建了一个字节数组和一个 base64 编码的字符串,如下所示

    SecureRandom random = new SecureRandom();
    byte bytes[] = new byte[32];

    random.nextBytes(bytes);
    for (int i = 0; i < bytes.length; i++) {
        System.out.print(bytes[i] + ",");
    }

    String token = Base64.getEncoder().withoutPadding().encodeToString(bytes);

然后我在 kubernetes 机密中使用了生成的字符串。秘密创建成功。 现在我希望在 kubernetes 中运行的 Spring Boot 应用程序读取和解码该值。 但是,我得到一个 IllegalArgumentException(非法 base64 字符) 在本地运行应用程序时,从属性文件中读取相同的令牌,可以对其进行解码。

所以我的问题又来了:是否可以使用字节数组作为 kubernetes 密码?

【问题讨论】:

    标签: kubernetes kubernetes-secrets


    【解决方案1】:

    无论是使用--from-file 还是--from-literal(正如@fg78nc 所避免的那样),在使用kubectl create secret generic 创建秘密时都需要使用普通值。

    Creating a Secret Manually 来自二进制值时需要 base64 编码的值。

    如果秘密的值是二进制值,我建议将秘密安装为卷并将其作为字节数组从文件中读取 - 它将在文件中进行 base64 解码。

    当从由密钥创建的环境变量、从作为卷挂载的文件获取值时,密钥会自动进行 base64 解码,但不是通过kubectl get secret 或直接使用 Kubernetes API (GET /api/v1/namespaces/{namespace}/secrets/{name}) 时。

    【讨论】:

      【解决方案2】:

      您无需手动对其进行编码。只需向 secret 提供纯文本,它将是由 k8s 编码的 base64。否则会被编码两次。

      kind: Secret
      apiVersion: v1
      stringData: # allows to add plain text (will be encoded by k8s and kept in Base64 encoded format under data) 
        foo: plain text
      data:
      

      【讨论】:

      • hm,如果我使用 kubectl apply -f 创建密钥...该值需要经过 base64 编码
      • 它将被自动编码 - 你可以只提供纯字符串。请参阅上面的更新答案。
      • 如果您需要读取 base64 以传递给您的应用,请改用 configmap。秘密,正如“fg78nc”所说,已经用 base64 编码,或者听从“gears”的建议
      • 如果我正确理解了这个问题,它是关于在 Secret 中存储一个表示 SecureRandom 数的字节数组。我的理解是使用stringData 字段,它允许将秘密数据作为未编码的字符串 提供,适用于纯文本 数据,是的,但不适用于二进制值。
      • 是什么让你这么认为?你试过了吗?
      猜你喜欢
      • 2016-02-17
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 2018-09-05
      • 2023-01-20
      • 2019-11-27
      • 2019-11-28
      • 2019-03-02
      相关资源
      最近更新 更多