如何将多个文件/机密挂载到 kubernetes 的公共目录中?

How to mount multiple files / secrets into common directory in kubernetes?

我有多个从不同文件创建的机密。我想将它们全部存储在公共目录 /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

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

已编辑: @Jonas 回答正确!

但是,如果您像我在问题中那样使用卷,那么简短的回答是您不能那样做,您必须指定mountPath到一个未使用的目录- 卷必须是唯一的,不能安装到公共目录。

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

预计数量

您可以使用一个 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

(编辑:没关系 - 我只是注意到@Jonas 早些时候给出了相同的答案。+1 来自我)

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

A projected volume maps several existing volume sources into the same directory.

Currently, the following types of volume sources can be projected:

  • secret
  • downwardAPI
  • configMap
  • serviceAccountToken

This is an example“...如何使用投影卷将多个现有卷源安装到同一目录”。

可能是子路径 (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 从文件 redis.yaml 创建,作为文件 redis.yaml 安装在 app/config/ 中。 还将 configMap config-map-app 安装在 app/config/ 中作为 app.yaml

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