web-dev-qa-db-fra.com

Comment puis-je stocker un fichier binaire dans un Kubernetes ConfigMap?

Peut-on stocker un fichier binaire dans un KubernetesConfigMap puis lire plus tard le même contenu à partir d'un volume qui monte ce ConfigMap? Par exemple, si le répertoire /etc/mycompany/myapp/config contient un fichier binaire keystore.jks, volonté

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

inclure le fichier keystore.jks dans ConfigMap myapp-config qui peut ensuite être mappé à un volume, monté dans un conteneur et lu comme un fichier binaire?

Par exemple, compte tenu des spécifications de pod suivantes, est-ce que keystore.jks être disponible pour 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

Détails de la version de 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"}
16
Derek Mahar

Les ConfigMaps binaires sont désormais pris en charge depuis Kubernetes version 1.10.0. D'après les notes du fichier Lisez-moi:

Les objets ConfigMap prennent désormais en charge les données binaires via un nouveau champ binaryData. Lorsque vous utilisez kubectl create configmap --from-file, les fichiers contenant des données non UTF8 seront placés dans ce nouveau champ afin de conserver les données non UTF8. Notez que la fonction --append-hash de kubectl ne prend pas en compte les données binaires. L'utilisation de cette fonctionnalité nécessite apiserver 1.10+ et kubelets. (# 57938, @dims)

Voir le changelog pour plus de détails: https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.10.md#apps

13
olly___

Ce que je ferais c'est encoder ce fichier en base64 puis le conteneur qui utilise décodé pour pouvoir l'utiliser

4
Luis Tobon

Selon Jorgan Liggitt dans le numéro de Kubernetes " Activer ConfigMaps pour stocker les fichiers binaires ainsi que les fichiers de caractères. ", Kubernetes 1.3.6 ne peut pas stocker un fichier binaire dans un ConfigMap.

Commentaire GitHub 1 :

les cartes de configuration stockent les données sous forme de chaîne, pas [] octets ... je ne suis pas sûr que je m'attendrais à pouvoir y mettre du contenu binaire arbitraire "

Commentaire GitHub 2 :

@liggitt ConfigMaps n'encode-t-il pas le contenu binaire sous forme de chaînes?

ils ne le font pas, ils stockent des cordes. l'encodage base64 peut être superposé avec la logique d'application si vous le souhaitez

J'ai par la suite démontré que ConfigMaps ne prend pas en charge les fichiers binaires.

2
Derek Mahar

Basé sur d'autres réponses, Base64 fonctionne pour moi (une seule fois)

Pas:

sur mon poste de travail

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

OpenShift

Je me connecte à openshift et crée la carte de configuration

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

configuration de déploiement

  ...
  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

Le moyen le plus simple de modifier/mettre à jour un cacerts existant est de coder les nouveaux cacerts en base64 (avec l'option -w 0), de l'ouvrir avec l'éditeur de fichiers (c.-à-d. Le Bloc-notes), de copier le contenu et de le coller via l'interface utilisateur de la console OpenShift

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

ou en ligne de commande

oc modifier configmap cacerts.base64

1