Openshift 4 ConfigMap 二进制文件挂载为目录

Openshift 4 ConfigMap binary file is mounted as directory

我已经从 Openshift 4 创建了 ConfigMap Windows 10 CLI:

.\oc create configmap my-cacerts --from-file=cacerts

我可以看到名为 my-cacerts 的 ConfigMap 并使用 Openshift 4[=16] 的 Web 界面从中下载二进制文件 cacerts =]

现在我安装它(my-deployment.yaml的一部分)

containers:
  volumeMounts:
    - name: my-cacerts-volume
      mountPath: /etc/my/cacerts
volumes:
  - name: my-cacerts-volume
    config-map: 
      name: my-cacerts

不幸的是/etc/my/cacerts被挂载为空文件夹而不是单个二进制文件。

如何将 cacerts 挂载为文件而不是目录?

更新:

如果我发布

.\oc get configmap my-cacerts

有如下输出:

apiVersion: v1
binaryData:
  cacerts: ... big long base64...
kind: ConfigMap
metadata: ...

如果我发布

.\oc describe pod my-pod

我明白了

Volumes:
  my-cacerts-volume:
    Type: EmptyDir (a temporary directory that shares a pod's lifetime)

你的volumes定义不正确,config-map不存在且无效,但API似乎正在默默回退到这里的 EmptyDir,从而导致一个空目录。

当您使用上面的 oc 命令创建 ConfigMap 时,结果将是一个 ConfigMap,看起来像这样(请注意,有一个名为“cacerts”的密钥) :

apiVersion: v1
kind: ConfigMap
metadata:
  name: my-cacerts
data:
  cacerts: |
    Hello world!

volumes 部分,然后使用 configMap:subPath 如下所示从您的 ConfigMap 安装一个密钥(“cacerts”):

$ oc edit deployment my-deployment
[..]
    spec:
      containers:
      - image: registry.fedoraproject.org/fedora-minimal:33
        name: fedora-minimal
        volumeMounts:
        - mountPath: /etc/my/cacerts
          name: my-cacerts-volume
          subPath: cacerts
[..]
      volumes:
      - configMap:
          name: my-cacerts
          defaultMode: 420
        name: my-cacerts-volume

这将导致:

$ oc rsh ...
sh-5.0$ ls -l /etc/my/cacerts
-rw-r--r--. 1 root 1000590000 13 Dec  3 19:11 /etc/my/cacerts
sh-5.0$ cat /etc/my/cacerts
Hello world!

您也可以不使用 subPath 并将 /etc/my/ 设置为相同结果的目的地,因为对于每个键都会有一个文件:

[..]
        volumeMounts:
        - mountPath: /etc/my/
          name: my-cacerts-volume
[..]
      volumes:
      - configMap:
          name: my-cacerts
        name: my-cacerts-volume

对于正确的语法,您还可以检查the documentation

对于 Openshift 4 defaultMode 应指定:

      volumeMounts:
        - mountPath: /etc/my
          name: cacerts-ref
          readOnly: true
  volumes:
    - name: cacerts-ref
      configMap:
        defaultMode: 420
        name: cacerts

之后 configMap 内容被正确映射。

.\oc describe pod my-pod

Volumes:
  cacerts-ref:
    Type:      ConfigMap (a volume populated by a ConfigMap)
Name:      cacerts
Optional:  false