【问题标题】:How can I store a binary file in a Kubernetes ConfigMap?如何在 Kubernetes ConfigMap 中存储二进制文件?
【发布时间】:2017-01-18 02:35:28
【问题描述】:

是否可以将二进制文件存储在 Kubernetes ConfigMap 中,然后从挂载此 ConfigMap 的卷中读取相同的内容?例如,如果目录/etc/mycompany/myapp/config包含二进制文件keystore.jks,将

kubectl create configmap myapp-config --from-file=/etc/mycompany/myapp/config

在 ConfigMap myapp-config 中包含文件 keystore.jks,以后可以将其映射到卷、挂载到容器中并作为二进制文件读取?

例如,给定以下 pod 规范,keystore.jks 是否应该在 /etc/mycompany/myapp/config/keystore.jks 上对 myapp 可用?

apiVersion: v1
kind: Pod
metadata:
  name: myapp
spec:
  containers:
  - name: myapp
    image: mycompany/myapp
    volumeMounts:
    - name: myapp-config
      mountPath: /etc/mycompany/myapp/config

  volumes:
  - name: myapp-config
    configMap:
      name: myapp-config

Kubernetes 版本详情:

derek@derek-HP-EliteOne-800-G1-AiO:~/Documents/platinum/fix/brvm$ kubectl version
Client Version: version.Info{Major:"1", Minor:"3", GitVersion:"v1.3.6", GitCommit:"ae4550cc9c89a593bcda6678df201db1b208133b", GitTreeState:"clean", BuildDate:"2016-08-26T18:13:23Z", GoVersion:"go1.6.2", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"3", GitVersion:"v1.3.6+coreos.0", GitCommit:"f6f0055b8e503cbe5fb7b6f1a2ee37d0f160c1cd", GitTreeState:"clean", BuildDate:"2016-08-29T17:01:01Z", GoVersion:"go1.6.2", Compiler:"gc", Platform:"linux/amd64"}

【问题讨论】:

  • 我观察到 Kubernetes 将二进制文件 keystore.jks 存储在 configmap 中,但文件大小比原始文件大,随后 configmap 映射到的卷中文件的大小也是如此.
  • 我将问题从错误报告更改为功能请求。

标签: configuration kubernetes configuration-files


【解决方案1】:

根据 Kubernetes 问题“Enable ConfigMaps to store binary files as well as character files.”中的Jorgan Liggitt,Kubernetes 1.3.6 无法在 ConfigMap 中存储二进制文件。

GitHub 评论1:

配置映射将数据存储为字符串,而不是 []byte... 不确定我是否期望 能够将任意二进制内容放入其中”

GitHub 评论2:

@liggitt ConfigMap 是否不将二进制内容编码为字符串?

他们没有,他们存储字符串。 base64 编码可以分层 如果需要,顶部带有应用程序逻辑

我随后demonstrated 表示 ConfigMaps 不支持二进制文件。

【讨论】:

    【解决方案2】:

    我要做的是在 base64 中编码这个文件,然后使用解码的容器能够使用它

    【讨论】:

    • 好主意!在 Kubernetes 实现 github.com/kubernetes/kubernetes/issues/32432 之前,我可能会这样做。
    • 有效吗?我在 base64 中编码了我的密钥库,在我的 Secret 中添加了这个 base64 值,将我的 Secret 安装为卷,如下所述:kubernetes.io/docs/concepts/configuration/secret/…,最后部署到我的集群中。我的所有 pod 包括这个卷现在都无法启动:/
    • 实际上它可以工作,但您必须对二进制文件进行两次“base64 编码”。如果只执行一次,则保存在存储中的值是二进制形式(作为字符串)。这个字符串包含很多 Go 代码无法理解的奇怪字符。最后,要在服务器中创建 .jks 文件,您可以使用 initContainer: kubernetes.io/docs/tasks/configure-pod-container/… 它将“base64 解码” Secret 中的值并将其放入文件中。
    【解决方案3】:

    根据其他答案,Base64 对我有用(仅一次)

    步骤:

    在我的工作站上

    base64 -w 0 cacerts   > cacerts.base64
    sha256sum.exe cacerts.base64
    keytool.exe  -list -v -keystore cacerts
    

    OpenShift

    我连接到 openshift 并创建配置映射

    oc create configmap cacerts.base64 --from-file=cacerts.base64

    部署配置

      ...
      template:
        metadata:
          name: mydeployment...
        spec:
          volumes:
            - name: cacerts-volume
              configMap:
                name: cacerts.base64
          containers:
            - name: crg-driver
              command:
                - base64
          args:
                - '--decode'
                - '-w 0'
                - '/opt/axatech/openpaas/certificates/cacerts.base64 >   /opt/axatech/openpaas/certificates/cacerts' #this does not work yet
              env:
                - name: SWARM_JVM_ARGS
                  value: >-
                    -Djavax.net.ssl.trustStore=/opt/certificates/cacerts.base64
                    -Djavax.net.ssl.trustStorePassword=changeit
    
             volumeMounts:
               - name: cacerts-volume
                 mountPath: /opt/certificates
    

    编辑/更新现有 cacerts 的最简单方法是将新 cacerts 编码为 base64(使用选项 -w 0),使用文件编辑器(即记事本)打开它,复制内容并通过 OpenShift 控制台 UI 粘贴

    https://osconsole.mycloud.something.example/console/project/project-dev/browse/config-maps/cacerts.base64
    

    或在命令行中

    oc 编辑配置映射 cacerts.base64

    【讨论】:

      【解决方案4】:

      现在从 Kubernetes 1.10.0 版开始支持二进制 ConfigMap。来自自述文件:

      ConfigMap 对象现在通过新的 binaryData 字段支持二进制数据。当使用 kubectl create configmap --from-file 时,包含非 UTF8 数据的文件将被放置在这个新字段中,以保留非 UTF8 数据。请注意,kubectl 的 --append-hash 功能不考虑 binaryData。使用此功能需要 1.10+ apiserver 和 kubelets。 (#57938,@dims)

      查看更新日志了解更多详情:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.10.md#apps

      【讨论】:

      【解决方案5】:

      我使用二进制文件的秘密。您可以使用 --from-file

      kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
      

      【讨论】:

        【解决方案6】:

        如果您使用 Secret 来存储值,您可以利用 stringData 字段的属性。对值进行一次编码并将其放入 stringData 字段而不是 data 字段。 Kubernetes 对存在的值 stringData 进行编码。通过这种方式,我们将手动 base64 编码从两个减少到一个。

        apiVersion: v1
        kind: Secret
        metadata:
          name: my-secret
        type: Opaque
        stringData:
          some_key: YWJjZA==
        

        关于为什么二进制数据需要双重编码的更多信息,可以参考这个link

        【讨论】:

          【解决方案7】:

          如果您不想手动操作,我建议您查看https://kustomize.io/

          他们有一个 configMap 生成器,可以从文件中生成 configMap:https://kubectl.docs.kubernetes.io/references/kustomize/kustomization/configmapgenerator/#configmap-from-file

          还支持二进制文件。示例:

          configMapGenerator:
          - name: text-config
            files:
            - configs/some.properties
          - name: binary-cacerts
            files:
            - configs/keystore.jks
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-09-06
            • 2019-04-29
            • 2013-10-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多