K8s Q A ConfigMaps

Материал из noname.com.ua
Версия от 11:16, 9 января 2024; Sirmax (обсуждение | вклад) (Новая страница: «ConfigMap) Aug 13, 2018 07:03 · 814 words · 4 minute read KUBERNETES Использование конфигмапов (ConfigMaps) позволяет разд...»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигацииПерейти к поиску

ConfigMap)

Aug 13, 2018 07:03 · 814 words · 4 minute read KUBERNETES Использование конфигмапов (ConfigMaps) позволяет разделять конфигурационные файлы и контейнеры с приложениями, избавляя от необходимости упаковывать конфиги в docker-образ. В данной статье рассмотрим несколько примеров использования конфигмапов - давайте разберемся!

Для создания объекта ConfigMap в кластере Kubernetes используется команда:

kubectl create configmap <map-name> <data-source> C помощью этой команды можно создавать конфигмапы из каталогов, файлов и аргументов командной строки. Разберем каждый из перечисленных вариантов на примерах.

Создание конфигмапа (ConfigMap) из каталога подразумевает создание объекта из одного или нескольких файлов, расположенных в одной директории. Например, создаем каталог и скачиваем в него два файла с параметрами:

mkdir -p configmap-from-dir/ wget https://k8s.io/docs/tasks/configure-pod-container/configmap/kubectl/game.properties -O configmap-from-dir/game.properties wget https://k8s.io/docs/tasks/configure-pod-container/configmap/kubectl/ui.properties -O configmap-from-dir/ui.properties ls configmap-from-dir/ game.properties ui.properties Создаем конфигмап из каталога:

kubectl create configmap game-config --from-file=configmap-from-dir/ Проверим, что созданный конфигмап действительно состоит из двух файлов:

kubectl describe configmaps game-config Name: game-config Namespace: default Labels: <none> Annotations: <none>

Data

==

game.properties: 158 bytes ui.properties: 83 bytes Проверим содержимое конфигмапа (секция data:), вывод сокращен:

kubectl get configmaps game-config -o yaml

apiVersion: v1 data:

 game.properties: |
   enemies=aliens
   lives=3
   enemies.cheat=true
   enemies.cheat.level=noGoodRotten
   secret.code.passphrase=UUDDLRLRBABAS
   secret.code.allowed=true
   secret.code.lives=30
 ui.properties: |
   color.good=purple
   color.bad=yellow
   allow.textmode=true
   how.nice.to.look=fairlyNice

kind: ConfigMap metadata: ... Создание конфигмапа из файла тоже не должно вызывать сложностей:

kubectl create configmap game-config-2 --from-file=configmap-from-dir/game.properties Проверка:

kubectl describe configmaps game-config-2 Name: game-config-2 Namespace: default Labels: <none> Annotations: <none>

Data

==

game.properties: 158 bytes К слову, есть возможность несколько раз указывать параметр --from-file для данной команды - при этом будет создан конфигмап из нескольких файлов, например:

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 и следующим содержимым:

enemies=aliens lives=3 allowed="true" Теперь создадим из этого файла конфигмап командой:

kubectl create configmap game-config-env-file --from-env-file=configmap-from-dir/game-env-file.properties Cодержимое конфигмапа:

kubectl get configmap game-config-env-file -o yaml

apiVersion: v1 data:

 allowed: '"true"'
 enemies: aliens
 lives: "3"

kind: ConfigMap metadata: ... Стоит отметить, что при передаче нескольких параметров --from-env-file для создания конфигмапа, будет использован только последний из указанных файлов.

Также полезной может оказаться возможность указывать ключ, название которого отличается от имени файла с параметрами, при создании конфигмапа. Например:

kubectl create configmap game-config-3 --from-file=game-special-key=configmap-from-dir/game.properties Обратите внимание на название ключа:

kubectl get configmaps game-config-3 -o yaml

apiVersion: v1 data:

 game-special-key: |
   enemies=aliens
   lives=3
   enemies.cheat=true
   enemies.cheat.level=noGoodRotten
   secret.code.passphrase=UUDDLRLRBABAS
   secret.code.allowed=true
   secret.code.lives=30

kind: ConfigMap metadata: ... Еще одна возможность - создавать конфигмапы указывая параметры прямо в командной строке с помощью --from-literal:

kubectl create configmap special-config --from-literal=special.how=very --from-literal=special.type=charm Проверим:

kubectl get configmaps special-config -o yaml

apiVersion: v1 data:

 special.how: very
 special.type: charm

kind: ConfigMap metadata: ... Напоследок - самый удобный (на мой взгляд) вариант создания конфигмапов - описание их в отдельном yaml-файле (по аналогии с другими объектами Kubernetes). Создадим два таких файла:

apiVersion: v1 kind: ConfigMap metadata:

 name: special-config
 namespace: default

data:

 special.how: very

apiVersion: v1 kind: ConfigMap metadata:

 name: env-config
 namespace: default

data:

 log_level: INFO

Теперь мы можем использовать созданные выше конфигмапы при описании пода (Pod):

apiVersion: v1 kind: Pod metadata:

 name: test-pod

spec:

 containers:
   - name: test-container
     image: k8s.gcr.io/busybox
     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

В данном примере для настройки пода мы явно указываем с каких конфигмапов и значения каких ключей необходимо брать.

Можно создать конфигмап с несколькими парами ключ=значение, например:

apiVersion: v1 kind: ConfigMap metadata:

 name: special-config
 namespace: default

data:

 SPECIAL_LEVEL: very
 SPECIAL_TYPE: charm

Такой конфигмап в описании пода будет выглядеть несколько проще:

apiVersion: v1 kind: Pod metadata:

 name: test-pod

spec:

 containers:
   - name: test-container
     image: k8s.gcr.io/busybox
     command: [ "/bin/sh", "-c", "env" ]
     envFrom:
     - configMapRef:
         name: special-config
 restartPolicy: Never

Еще одна важная (и самая востребованная) особенность - возможность монтировать конфигмапы в контейнеры в качестве томов. Пример с использованием созданного ранее конфигмапа special-config:

apiVersion: v1 kind: Pod metadata:

 name: dapi-test-pod

spec:

 containers:
   - name: test-container
     image: k8s.gcr.io/busybox
     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/ выведет на экран следующее:

special.level special.type Можно указывать конкретный путь для монтирования данных из конфигмапа. Например, сущность special.level из конфигмапа с именем special-config может быть смонтирована в /etc/config/keys внутри контейнера:

apiVersion: v1 kind: Pod metadata:

 name: dapi-test-pod

spec:

 containers:
   - name: test-container
     image: k8s.gcr.io/busybox
     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 выведет на экран:

very Напоследок стоит отметить, что смонтированные внутрь контейнера конфигмапы будут обновляться автоматически (за исключением монтирования как subPath). Период обновления, как указано в документации, составляет kubelet sync period + ttl of ConfigMaps cache in kubelet. В следующей статье цикла рассмотрим создание и работу с секретами в кластере Kubernetes.