如何在掌舵图中引用 kubernetes 的秘密?

Tia*_*ans 9 kubernetes kubernetes-helm kubernetes-secrets

我想使用 helm charts 在 kubernetes 中进行一些部署。这是我使用的示例覆盖值 yaml:

imageRepository: ""

ocbb:
    imagePullPolicy: IfNotPresent
    TZ: UTC
    logDir: /oms_logs
    tnsAdmin: /oms/ora_k8
    LOG_LEVEL: 3
    wallet:
        client: 
        server: 
        root:
    db:
        deployment:
            imageName: init_db
            imageTag:
        host: 192.168.88.80
        port:
        service:
        alias:
        schemauser: pincloud
        schemapass:
        schematablespace: pincloud
        indextablespace: pincloudx
        nls_lang: AMERICAN_AMERICA.AL32UTF8
        charset: AL32UTF8
        pipelineschemauser: ifwcloud
        pipelineschemapass:
        pipelineschematablespace: ifwcloud
        pipelineindextablespace: ifwcloudx
        pipelinealias:
        queuename:

Run Code Online (Sandbox Code Playgroud)

在此文件中,我必须设置一些涉及凭据的值,例如 schemapass、pipelineschemapass...文档说明我必须生成 kubernetes 机密才能执行此操作,并将此密钥添加到具有相同路径层次结构的 yaml 文件中。

我生成了一些 kubernetes 的秘密,例如:

kubectl create secret generic schemapass --from-literal=password='pincloud'
Run Code Online (Sandbox Code Playgroud)

现在我不知道如何在我的 yaml 文件中引用这个新生成的秘密。关于如何在 yaml 图表中设置 schemapass 字段以引用 kubernetes 秘密的任何提示?

Raf*_*zko 18

您不能在values.yaml. 在values.yaml您只指定头盔图表的输入参数,所以它可能是秘密的名字,但不是秘密本身(或任何其解决)。

如果要在容器中使用机密,则可以将其作为环境变量插入:

env:
- name: SECRET_VALUE_ENV
  valueFrom:
    secretKeyRef:
      name: schemapass
      key: password
Run Code Online (Sandbox Code Playgroud)

您可以在Hazelcast Enterprise Helm Chart 中查看更多信息。我们正是这样做的。您在中指定机密名称values.yaml,然后使用环境变量将机密注入容器。

  • 是的,您不能直接在“values.yaml”中定义它。换句话说,如果您的模板没有为此做好准备,则无法仅通过在“values.yaml”中指定某些内容来注入秘密。 (3认同)

Mos*_*ael 5

您可以通过在容器中将 K8S 值指定为环境变量来在 Helm 中引用 K8S 值(无论是否为机密)。

让您的部署为 mongo.yml

--
kind: Deployment
   --
      --
      containers:
        --
        env:
        - name: DB_URL
          valueFrom:
            configMapKeyRef:
              name: mongo-config
              key: mongo-url
        - name: MONGO_INITDB_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mongo-secret
              key: mongo-password  
Run Code Online (Sandbox Code Playgroud)

mongo-secret 在哪里

apiVersion: v1
kind: Secret
metadata:
  name: mongo-secret
type: Opaque
data:
  mongo-user: bW9uZ291c2Vy
  mongo-password: bW9uZ29wYXNzd29yZA==
Run Code Online (Sandbox Code Playgroud)

和 mongo-config 是

apiVersion: v1
kind: ConfigMap
metadata:
  name: mongo-config
data:
  mongo-url: mongo-service
Run Code Online (Sandbox Code Playgroud)


Dar*_*hop 5

实际上有一个lookup函数,但它充满争议并且调试起来可能很棘手

lookup apiVersion, kind, namespace, name -> resource or resource list
Run Code Online (Sandbox Code Playgroud)

我只是设法让它工作引用同一个图表中的秘密(毫无意义);理想情况下,我希望获得事先通过其他方式部署的秘密的价值。

该应用程序使用一个配置文件(它就是它的本质),我试图通过 helm 模板动态管理该文件,将整个文件存储在图表的秘密中,并将其卷安装在部署模板中。

我很可能会开一个SO帖子


更新 2023/07/02:我发现了外部秘密操作员(ESO)

ESO 为您做什么

ESO 很好地分离了输入秘密和输出秘密的关注点。

输入秘密:

凭借其可插拔设计,您可以从 Kubernetes(本质上是内部机密)获取 Secret(和 ConfigMap),或从 AWS(例如 Secrets Manager、Parameter Store)和其他云提供商(外部机密)获取敏感数据。

输出秘密:

根据输入的机密,您可以:

  • 将它们一对一映射成 Secret
  • 将它们映射为多对一,使用模板生成一个 Secret,例如包含配置文件,在其中安全地内联数据库凭据
如何使用 ESO

因此,通过 ESO,您的 Helm Chartvalues.yaml可以免费为熟悉 Helm 使用的用户提供用户体验支持。

专业提示:不要将应用程序的配置结构泄漏到您的 中values.yaml,从而将两者紧密耦合;利用后者为您提供的“外观”机会。

现在,您可以在 中定义您想要的任何符号values.yaml,以指示/引用应该使用的秘密(以及从何处使用)。

想法:可能的参考格式可能是:
secret://external-secret-store/external/secret/path/or/name#key-within-external-secret
这采用了熟悉的 URI 样式,它早于 Kubernetes/Helm,因此对于开箱即用的用户来说应该相当直观

然后您templates/*.yaml可以解释这些引用以生成:

  1. ExternalSecrets,依次注入和监督 Secrets,以及
  2. 例如,部署将那些注入的 Secret 作为卷或环境变量引用。
示例:使用 OP(缩写)的此方法的具体应用values.yaml
imageRepository: ""

ocbb:
    ...
    db:
        ...
        schemauser: secret://my-parameter-store/ocbb/db/schema-credentials#username
        schemapass: secret://my-parameter-store/ocbb/db/schema-credentials#password
Run Code Online (Sandbox Code Playgroud)

洞察力values.yaml具有您选择的结构ocbb.db.schemapass,并且您知道等是凭据并且可能引用秘密,因此您可以相应地进行模板化。

  • my-parameter-store:ESO 概念,设置为指向 AWS Parameter Store
  • /ocbb/db/schema-credentials:一个AWS概念,AWS Parameter Store中参数的路径
  • username, password: JSON 对象中的键,即 AWS Parameter Store 中的参数