【问题标题】:How to generate a random string / password in Kubernetes secrets如何在 Kubernetes 机密中生成随机字符串/密码
【发布时间】:2022-02-11 18:01:07
【问题描述】:

现在,我使用静态文件部署我的应用程序 pod,其中一个是 app-secrets.yaml,其中包含部署应用程序的所有秘密

---
apiVersion: v1
kind: Secret
metadata:
  name: app-secrets
type: Opaque
data:
  root: xxxxxx
  user1: xxxxxx
  user2: xxxxxx

但这既不安全也不方便(如果我需要另一个应用程序实例,我必须使用人工生成的密码创建另一个文件)。

我希望在创建应用程序时生成随机密码,但我不知道这是否可能。 我已经看过主题secret,尤其是secretGenerator,但这不是我想要的,因为它不会创建一个随机字符串,而是一个随机的秘密名称,如secret/app-secrets-ssdsdfmfh4k,但我必须仍然提供密码。

【问题讨论】:

    标签: kubernetes kubernetes-secrets


    【解决方案1】:

    您可能想使用kubernetes-secret-generator。我已经对其进行了测试,它正在做你所需要的。

    要完成它,您必须在集群中安装 helm 并按照以下说明操作:

    克隆存储库

    $ git clone https://github.com/mittwald/kubernetes-secret-generator
    

    创建 helm 部署

    $ helm upgrade --install secret-generator ./deploy/chart
    

    现在你要使用它,你只需要

    将注释secret-generator.v1.mittwald.de/autogenerate 添加到任何 Kubernetes 秘密对象。注解的值可以是一个字段 秘密中的名称(或逗号分隔的字段名称列表);这 SecretGeneratorController 会选择这个注解并添加一个字段 [或字段](在下面的示例中为password)使用 a 随机生成的字符串值。来自here

    $ kubectl apply -f mysecret.yaml
    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
      annotations:
        secret-generator.v1.mittwald.de/autogenerate: password
    data:
      username: UGxlYXNlQWNjZXB0Cg==
    

    应用此密码后,您可以查看它以检查密码是否按预期生成:

    $ kubectl get secrets mysecret -o yaml
    apiVersion: v1
    data:
      password: dnVKTDBJZ0tFS1BacmtTMnBuc3d2YWs2YlZsZ0xPTUFKdStDa3dwUQ==
      username: UGxlYXNlQWNjZXB0Cg==
    kind: Secret
    metadata:
      annotations:
        kubectl.kubernetes.io/last-applied-configuration: |
          {"apiVersion":"v1","data":{"username":"UGxlYXNlQWNjZXB0Cg=="},"kind":"Secret","metadata":{"annotations":{"secret-generator.v1.mittwald.de/autogenerate":"password"},"name":"mysecret","namespace":"default"}}
        secret-generator.v1.mittwald.de/autogenerate: password
        secret-generator.v1.mittwald.de/autogenerate-generated-at: 2020-01-09 14:29:44.397648062
          +0000 UTC m=+664.011602557
        secret-generator.v1.mittwald.de/secure: "yes"
      creationTimestamp: "2020-01-09T14:29:44Z"
      name: mysecret
      namespace: default
      resourceVersion: "297425"
      selfLink: /api/v1/namespaces/default/secrets/mysecret
      uid: 7ae42d71-32ec-11ea-92b3-42010a800009
    type: Opaque
    

    正如我们所见,密码已生成,并根据您的需要进行了加密。

    【讨论】:

    • 正是我想要的,不幸的是 k8s 默认不提供该功能,并且该项目使用 helm 进行部署。
    【解决方案2】:

    你也可以这样做:

    $ head /dev/urandom | tr -dc A-Za-z0-9 | head -c 8 ; echo '' | base64 | kubectl create secret generic mysecret --from-literal=password=-
    

    不方便的是每次运行命令时都需要更改密码名称,但看起来您已经有了生成随机密码名称的机制。

    注意:更改head -c 8中的数字来控制字符串的长度。

    【讨论】:

    • 上面的例子不行,所以我给一个工作的:head /dev/urandom | tr -dc A-Za-z0-9 | head -c 8 | xargs -I {} kubectl create secret generic mysecret --from-literal=password={}
    • @red 首先,我刚刚尝试了 k8s 1.20,它确实有效。并且您应该预计有些帖子会在一年半后过时。
    【解决方案3】:

    Kubernetes 本身不具备此功能。

    如果您想自己手动执行此操作,请查看question

    如果您想自动执行此手动任务,则可以使用此自定义 controller 来执行此操作。

    将注释 secret-generator.v1.mittwald.de/autogenerate 添加到任何 Kubernetes 机密对象。注释的值可以是秘密中的字段名称(或逗号分隔的字段名称列表); SecretGeneratorController 将选择此注解并使用随机生成的字符串值将一个字段 [或字段](下例中的密码)添加到密钥

    【讨论】:

      【解决方案4】:

      为了背上@suren的回答,这就是今天应该做的事情

      如果你想试运行,

      head /dev/urandom | tr -dc A-Za-z0-9 | head -c 8 | kubectl create secret generic xxx --dry-run=client --from-file=password=/dev/stdin -o json
      

      要创建秘密并解码,

      head /dev/urandom | tr -dc A-Za-z0-9 | head -c 8 | kubectl create secret generic xxx --from-file=password=/dev/stdin
      
      kubectl get secret xxx -o jsonpath='{.data.password}' | base64 -d
      

      【讨论】:

        猜你喜欢
        • 2012-08-05
        • 2018-11-01
        • 1970-01-01
        • 2010-09-08
        • 2013-07-26
        • 2016-09-16
        • 2011-08-31
        相关资源
        最近更新 更多