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

时间:2016-09-09 21:41:26

标签: configuration kubernetes configuration-files

可以在Kubernetes ConfigMap中存储二进制文件,然后从安装此ConfigMap的卷中读取相同的内容吗?例如,如果目录while read line; do echo $line done < file 包含二进制文件/etc/mycompany/myapp/config,则

keystore.jks

在ConfigMap kubectl create configmap myapp-config --from-file=/etc/mycompany/myapp/config 中包含文件keystore.jks,该文件稍后可以映射到卷,挂载到容器中,并作为二进制文件读取?

例如,根据以下pod规范,myapp-config keystore.jks myapp是否可以使用/etc/mycompany/myapp/config/keystore.jks

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"}

7 个答案:

答案 0 :(得分:9)

自Kubernetes版本1.10.0起,现在支持Binary ConfigMaps。从自述文件说明:

  

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

有关详细信息,请参阅更改日志:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.10.md#apps

答案 1 :(得分:4)

我要做的是在base64中对此文件进行编码,然后使用已解码的容器对其进行编码

答案 2 :(得分:1)

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

GitHub评论1

  

config将商店数据映射为字符串,而不是[] byte ...不确定我是否期望   能够在其中放置任意二进制内容&#34;

GitHub评论2

  
    

@liggitt Do ConfigMaps不将二进制内容编码为字符串吗?

  
     

他们没有,他们存储字符串。 base64-encoding可以分层   如果需要,可以使用应用程序逻辑

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

答案 3 :(得分:1)

根据其他答案,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 edit configmap cacerts.base64

答案 4 :(得分:1)

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

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

有关为什么需要对二进制数据进行双重编码的更多信息,您可以参考此link

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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