Thank you for reading this post, don't forget to subscribe!
Использование конфигмапов (ConfigMaps
) позволяет разделять конфигурационные файлы и контейнеры с приложениями, избавляя от необходимости упаковывать конфиги в docker-образ. В данной статье рассмотрим несколько примеров использования конфигмапов.
Для создания объекта ConfigMap
в кластере Kubernetes
используется команда:
1 2 |
kubectl create configmap <map-name> <data-source> |
C помощью этой команды можно создавать конфигмапы из каталогов, файлов и аргументов командной строки. Разберем каждый из перечисленных вариантов на примерах.
Создание конфигмапа (ConfigMap
) из каталога подразумевает создание объекта из одного или нескольких файлов, расположенных в одной директории. Например, создаем каталог и скачиваем в него два файла с параметрами:
1 2 3 4 |
mkdir -p configmap-from-dir/ wget <a class="vglnk" href="https://k8s.io/docs/tasks/configure-pod-container/configmap/kubectl/game.properties" rel="nofollow">https://k8s.io/docs/tasks/configure-pod-container/configmap/kubectl/game.properties</a> -O configmap-from-dir/game.properties wget <a class="vglnk" href="https://k8s.io/docs/tasks/configure-pod-container/configmap/kubectl/ui.properties" rel="nofollow">https://k8s.io/docs/tasks/configure-pod-container/configmap/kubectl/ui.properties</a> -O configmap-from-dir/ui.properties |
1 2 3 4 |
ls configmap-from-dir/ game.properties ui.properties |
Создаем конфигмап из каталога:
1 2 |
kubectl create configmap game-config --from-file=configmap-from-dir/ |
Проверим, что созданный конфигмап действительно состоит из двух файлов:
1 2 3 4 5 6 7 8 9 10 11 |
kubectl describe configmaps game-config Name: game-config Namespace: default Labels: <none> Annotations: <none> Data ==== game.properties: 158 bytes ui.properties: 83 bytes |
Проверим содержимое конфигмапа (секция data:
), вывод сокращен:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
kubectl get configmaps game-config -o yaml apiVersion: v1 data: game.properties: | enemies=aliens lives=3 enemies.cheat=<span class="hljs-literal">true</span> enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=<span class="hljs-literal">true</span> secret.code.lives=30 ui.properties: | color.good=purple color.bad=yellow allow.textmode=<span class="hljs-literal">true</span> how.nice.to.look=fairlyNice kind: ConfigMap metadata: ... |
Создание конфигмапа из файла тоже не должно вызывать сложностей:
1 2 |
kubectl create configmap game-config-2 --from-file=configmap-from-dir/game.properties |
Проверка:
1 2 3 4 5 6 7 8 9 10 |
kubectl describe configmaps game-config-2 Name: game-config-2 Namespace: default Labels: <none> Annotations: <none> Data ==== game.properties: 158 bytes |
К слову, есть возможность несколько раз указывать параметр --from-file
для данной команды - при этом будет создан конфигмап из нескольких файлов, например:
1 2 |
kubectl create configmap game-config-2 --from-file=configmap-from-dir/game.properties --from-file=configmap-from-dir/ui.properties |
Есть возможность создавать конфигмапы из файлов с переменными (env-file). Эти файлы должны содержать информацию в формате ключ=значение (по одному на строку), пустые строки и строки, начинающиеся с символа #
игнорируются. Например, создадим в нашем каталоге файл с именем game-env-file.properties
и следующим содержимым:
1 2 3 4 |
enemies=aliens lives=3 allowed=<span class="hljs-string">"true"</span> |
Теперь создадим из этого файла конфигмап командой:
1 2 |
kubectl create configmap game-config-env-file --from-env-file=configmap-from-dir/game-env-file.properties |
Cодержимое конфигмапа:
1 2 3 4 5 6 7 8 9 10 11 |
kubectl get configmap game-config-env-file -o yaml apiVersion: v1 data: allowed: <span class="hljs-string">'"true"'</span> enemies: aliens lives: <span class="hljs-string">"3"</span> kind: ConfigMap metadata: ... |
Стоит отметить, что при передаче нескольких параметров --from-env-file
для создания конфигмапа, будет использован только последний из указанных файлов.
Также полезной может оказаться возможность указывать ключ, название которого отличается от имени файла с параметрами, при создании конфигмапа. Например:
1 2 |
kubectl create configmap game-config-3 --from-file=game-special-key=configmap-from-dir/game.properties |
Обратите внимание на название ключа:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
kubectl get configmaps game-config-3 -o yaml apiVersion: v1 data: game-special-key: | enemies=aliens lives=3 enemies.cheat=<span class="hljs-literal">true</span> enemies.cheat.level=noGoodRotten secret.code.passphrase=UUDDLRLRBABAS secret.code.allowed=<span class="hljs-literal">true</span> secret.code.lives=30 kind: ConfigMap metadata: ... |
Еще одна возможность - создавать конфигмапы указывая параметры прямо в командной строке с помощью --from-literal
:
1 2 |
kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm |
Проверим:
1 2 3 4 5 6 7 8 9 10 |
kubectl get configmaps special-config -o yaml apiVersion: v1 data: special.how: very special.type: charm kind: ConfigMap metadata: ... |
Напоследок - самый удобный (на мой взгляд) вариант создания конфигмапов - описание их в отдельном yaml-файле (по аналогии с другими объектами Kubernetes
). Создадим два таких файла:
1 2 3 4 5 6 7 8 |
apiVersion: v1 kind: ConfigMap metadata: name: special-config namespace: default data: special.how: very |
1 2 3 4 5 6 7 8 |
apiVersion: v1 kind: ConfigMap metadata: name: env-config namespace: default data: log_level: INFO |
Теперь мы можем использовать созданные выше конфигмапы при описании пода (Pod
):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - name: test-container image: <a class="vglnk" href="http://k8s.gcr.io/busybox" rel="nofollow">k8s.gcr.io/busybox</a> command: [ "/bin/sh", "-c", "env" ] env: - name: SPECIAL_LEVEL_KEY valueFrom: configMapKeyRef: name: special-config key: special.how - name: LOG_LEVEL valueFrom: configMapKeyRef: name: env-config key: log_level restartPolicy: Never |
В данном примере для настройки пода мы явно указываем с каких конфигмапов и значения каких ключей необходимо брать.
Можно создать конфигмап с несколькими парами ключ=значение, например:
1 2 3 4 5 6 7 8 9 |
apiVersion: v1 kind: ConfigMap metadata: name: special-config namespace: default data: SPECIAL_LEVEL: very SPECIAL_TYPE: charm |
Такой конфигмап в описании пода будет выглядеть несколько проще:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
apiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - name: test-container image: <a class="vglnk" href="http://k8s.gcr.io/busybox" rel="nofollow">k8s.gcr.io/busybox</a> command: [ "/bin/sh", "-c", "env" ] envFrom: - configMapRef: name: special-config restartPolicy: Never |
Еще одна важная (и самая востребованная) особенность - возможность монтировать конфигмапы в контейнеры в качестве томов. Пример с использованием созданного ранее конфигмапа special-config
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: containers: - name: test-container image: <a class="vglnk" href="http://k8s.gcr.io/busybox" rel="nofollow">k8s.gcr.io/busybox</a> command: [ "/bin/sh", "-c", "ls /etc/config/" ] volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: # Provide the name of the ConfigMap containing the files you want # to add to the container name: special-config restartPolicy: Never |
При старте данного пода команда ls /etc/config/
выведет на экран следующее:
1 2 3 |
special.level special.type |
Можно указывать конкретный путь для монтирования данных из конфигмапа. Например, сущность special.level
из конфигмапа с именем special-config
может быть смонтирована в /etc/config/keys
внутри контейнера:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
apiVersion: v1 kind: Pod metadata: name: dapi-test-pod spec: containers: - name: test-container image: <a class="vglnk" href="http://k8s.gcr.io/busybox" rel="nofollow">k8s.gcr.io/busybox</a> command: [ "/bin/sh","-c","cat /etc/config/keys" ] volumeMounts: - name: config-volume mountPath: /etc/config volumes: - name: config-volume configMap: name: special-config items: - key: special.level path: keys restartPolicy: Never |
При запуске пода команда cat /etc/config/keys
выведет на экран:
1 2 |
very |
Напоследок стоит отметить, что смонтированные внутрь контейнера конфигмапы будут обновляться автоматически (за исключением монтирования как subPath). Период обновления, как указано в документации, составляет kubelet sync period + ttl of ConfigMaps cache in kubelet
.