如何在Kubernetes ConfigMap中存储二进制文件?



是否可以将二进制文件存储在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 1.10.0版本开始支持二进制configmap。来自自述说明:

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

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

我要做的是将该文件编码为base64然后使用已解码的容器才能使用它

根据其他答案,Base64适合我(只有一次)

步骤:

在我的工作站上

base64 -w 0 cacerts   > cacerts.base64
sha256sum.exe cacerts.base64
keytool.exe  -list -v -keystore cacerts
<标题> OpenShift h1> 连接到openshift并创建配置映射

oc create configmap cacerts。base64——从文件= 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

或命令行

根据Jorgan ligitt在Kubernetes issue "Enable ConfigMaps to storage binary file and character files.", Kubernetes 1.3.6不能在ConfigMap中存储二进制文件。

GitHub注释1:

配置映射将数据存储为字符串,而不是[]byte…我不确定我能预料到可以在里面放任意的二进制内容"

GitHub注释2:

@liggitt ConfigMaps不编码二进制内容字符串?

则不是,它们存储字符串。base64编码可以分层如果需要,在顶部加上应用程序逻辑

我随后演示了ConfigMaps不支持二进制文件。

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

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

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

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

有关二进制数据需要双重编码的更多信息,可以参考此链接

如果您不想手动操作,我建议您查看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

从1.10版本开始,配置映射支持binaryData字段。

最新更新