【问题标题】:How to mount multiple files / secrets into common directory in kubernetes?如何将多个文件/秘密挂载到 kubernetes 的公共目录中?
【发布时间】:2020-03-23 13:08:50
【问题描述】:

我从不同的文件创建了多个秘密。我想将它们全部存储在公共目录/var/secrets/ 中。不幸的是,我无法这样做,因为 kubernetes 在 pod 验证步骤中抛出 'Invalid value: "/var/secret": must be unique 错误。下面是我的 pod 定义的示例。

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: alpine-secret
  name: alpine-secret
spec:
  containers:
  - command:
    - sleep
    - "3600"
    image: alpine
    name: alpine-secret
    volumeMounts:
    - name: xfile
      mountPath: "/var/secrets/"
      readOnly: true
    - name: yfile
      mountPath: "/var/secrets/"
      readOnly: true
  volumes:
  - name: xfile
    secret:
      secretName: my-secret-one
  - name: yfile
    secret:
      secretName: my-secret-two

如何将来自多个机密的文件存储在同一目录中?

【问题讨论】:

    标签: kubernetes kubernetes-secrets


    【解决方案1】:

    预计体积

    您可以使用projected volume 在同一个目录中拥有两个秘密

    示例

    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        run: alpine-secret
      name: alpine-secret
    spec:
      containers:
      - command:
        - sleep
        - "3600"
        image: alpine
        name: alpine-secret
        volumeMounts:
        - name: xyfiles
          mountPath: "/var/secrets/"
          readOnly: true
      volumes:
      - name: xyfiles
        projected:
          sources:
          - secret:
              name: my-secret-one
          - secret:
              name: my-secret-two
    

    【讨论】:

      【解决方案2】:

      (编辑:没关系 - 我刚刚注意到@Jonas 之前给出了相同的答案。+1 来自我)

      从 Kubernetes v1.11+ 开始,可以使用 projected 卷:

      投影卷将多个现有卷源映射到同一个 目录。

      目前,可以投影以下类型的音量源:

      • 秘密
      • 向下API
      • 配置映射
      • serviceAccountToken

      This is an example for "...如何使用投影卷将多个现有卷源挂载到同一目录中"。

      【讨论】:

        【解决方案3】:

        可能 subPath (using subPath) 会有所帮助。

        例子:

                volumeMounts:
                - name: app-redis-vol
                  mountPath: /app/config/redis.yaml
                  subPath: redis.yaml
                - name: app-config-vol
                  mountPath: /app/config/app.yaml
                  subPath: app.yaml
              volumes:
                - name: app-redis-vol
                  configMap:
                    name: config-map-redis
                    items:
                      - key: yourKey
                        path: redis.yaml
                - name: app-config-vol
                  configMap:
                    name: config-map-app
                    items:
                      - key: yourKey
                        path: app.yaml
        

        在这里,您的名为 config-map-redis 的 configMap 从安装在 app/config/ 中的文件 redis.yaml 创建为文件 redis.yaml。 还将 configMap config-map-app 安装在 app/config/ 中为 app.yaml

        这里有一篇很好的文章:Injecting multiple Kubernetes volumes to the same directory

        【讨论】:

          【解决方案4】:

          已编辑: @Jonas 的回答是正确的!

          但是,如果您像我在问题中那样使用卷,那么简短的回答是 您不能这样做,您必须将 mountPath 指定给未使用的目录 - 卷必须是唯一的并且无法挂载到公共目录。

          解决方案: 最后我所做的是,我将文件保存在单独的秘密中,而是创建了一个包含多个文件的秘密。

          【讨论】:

          • 您可以在共享文件夹中进行子路径投影,但它很快就会变得比它的价值更复杂。
          猜你喜欢
          • 2023-03-14
          • 1970-01-01
          • 2019-11-27
          • 2021-05-15
          • 2021-04-25
          • 2020-10-21
          • 1970-01-01
          • 2021-04-25
          • 2016-08-21
          相关资源
          最近更新 更多