Kubernetes Openshift 4 ConfigMap二进制文件作为目录装入

Kubernetes Openshift 4 ConfigMap二进制文件作为目录装入,kubernetes,openshift,configmap,Kubernetes,Openshift,Configmap,我已从Openshift 4 Windows 10 CLI创建了ConfigMap: .\oc create configmap my-cacerts --from-file=cacerts 我可以使用Openshift 4的web界面查看名为my cacerts的ConfigMap,并从中下载二进制文件cacerts 现在我挂载它(部署.yaml的一部分) 不幸的是/etc/my/cacerts作为一个空文件夹而不是一个二进制文件装载 如何将cacerts装载为文件而不是目录 更新: 如果我

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

.\oc create configmap my-cacerts --from-file=cacerts
我可以使用Openshift 4的web界面查看名为my cacerts的ConfigMap,并从中下载二进制文件cacerts

现在我挂载它(部署.yaml的一部分)

不幸的是/etc/my/cacerts作为一个空文件夹而不是一个二进制文件装载

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

更新:

如果我发布

.\oc get configmap my-cacerts
.\oc describe pod my-pod
有以下输出:

apiVersion: v1
binaryData:
  cacerts: ... big long base64...
kind: ConfigMap
metadata: ...
如果我发布

.\oc get configmap my-cacerts
.\oc describe pod my-pod
我明白了


您的
定义不正确,
配置映射
不存在且无效,但似乎API正在悄悄地退回到此处的
空目录
,从而导致目录为空

当您使用上面的
oc
命令创建
ConfigMap
时,结果将是一个
ConfigMap
如下所示(请注意,有一个键称为“cacerts”):

部分,然后使用
configMap:
子路径
,如下所示,从
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!
您也可以保留
子路径
并将
/etc/my/
设置为相同结果的目标,因为每个键都有一个文件:

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

对于正确的语法,您还可以检查Openshift 4的

应指定默认模式

      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

嗨,西蒙,谢谢你的快速回答。我现在就去试试。请注意,如果我发出“oc get configmap my cacerts-o yaml”,那么我会得到包含所有内容的yaml,但是里面是二进制数据而不是数据。它是Openshift 4I,我已经一对一地尝试过了(包括oc rsh),但它仍然会创建空文件夹。如前所述,唯一的区别是在ConfigMap中我有binaryData:caccerts:>-…感谢您更新原始问题。BinaryData或ConfigMap中的数据应该无关紧要,在这两种情况下都应该有效。主要问题是您仍然有一个“type:EmptyDir”类型的卷,您应该再次编辑部署以获得正确的卷类型,并确保您在那里获得正确的卷类型(另请参阅我链接的文档)。这是Openshift特定的内容,defaultMode:420解决了我的问题
.\oc describe pod my-pod

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