【问题标题】:Openshift 4 ConfigMap binary file is mounted as directoryOpenshift 4 ConfigMap 二进制文件挂载为目录
【发布时间】:2020-12-03 17:54:33
【问题描述】:

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

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

我可以看到名为 my-cacerts 的 ConfigMap 并使用 Openshift 4 的 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)

【问题讨论】:

    标签: kubernetes openshift configmap


    【解决方案1】:

    您的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

    【讨论】:

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

    对于 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
    

    【讨论】:

      猜你喜欢
      • 2021-10-14
      • 2022-01-08
      • 1970-01-01
      • 2013-11-17
      • 2017-01-18
      • 2018-03-25
      • 2019-04-19
      • 1970-01-01
      • 2023-03-22
      相关资源
      最近更新 更多