Как сохранить двоичный файл в Kubernetes ConfigMap?

Можно хранить двоичный файл в Kubernetes ConfigMap, а затем прочесть тот же контент из тома, который монтирует этот ConfigMap? Например, если каталог /etc/mycompany/myapp/config содержит двоичный файл keystore.jks, будет

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

включить файл keystore.jks в ConfigMap myapp-config, который позже может быть сопоставлен с томом, установлен в контейнер и прочитан как двоичный файл?

Например, учитывая следующую спецификацию pod, 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:

[email protected]:~/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"}

Ответ 1

Двоичные ConfigMaps теперь поддерживаются начиная с Kubernetes версии 1.10.0. Из примечаний readme:

Объекты ConfigMap теперь поддерживают двоичные данные через новое поле binaryData. При использовании kubectl create configmap --from-file файлы, содержащие данные, отличные от UTF8, будут помещены в это новое поле для сохранения данных, отличных от UTF8. Обратите внимание, что функция kapectl --append-hash не учитывает двоичные данные. Для использования этой функции требуется 1. 10+ apiserver и kubelets. (# 57938, @dims)

Смотрите список изменений для более подробной информации: https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.10.md#apps

Ответ 2

Что бы я сделал, это кодировать этот файл в base64, а затем контейнер, который использует декодированные, чтобы иметь возможность использовать его

Ответ 3

В соответствии с Jorgan Liggitt в выпуске Kubernetes " Включить ConfigMaps для хранения двоичных файлов файлы, а также файлы символов. ", Kubernetes 1.3.6 не может хранить двоичный файл в ConfigMap.

Комментарий GitHub 1:

config хранит данные в виде строки, а не [] байт... не уверен, что я ожидаю чтобы иметь возможность помещать в них произвольный двоичный контент "

Комментарий GitHub 2:

@liggitt Do ConfigMaps не кодирует двоичный контент как строки?

они этого не делают, они хранят строки. base64-кодирование может быть сверху с помощью логики приложения

Впоследствии продемонстрировал, что ConfigMaps не поддерживает двоичные файлы.

Ответ 4

Основываясь на других ответах, 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 Console

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

или в командной строке

oc edit configmap cacerts.base64