При выполнении контейнерирования часто возникает необходимость в управлении некоторыми конфигурациями извне контейнера. После загрузки контейнера с определенными предварительно сконфигурированными данными необходимо иметь способ, которым эти данные могут быть изменены во время выполнения, если это необходимо. Например, у нас могут быть разные конфигурации для разных сред развертывания, и мы можем захотеть использовать правильный набор конфигураций для целевой среды без повторного создания контейнера.
Kubernetes предоставляет, ConfigMap
чтобы помочь настроить данные извне. Это следует парадигме дизайна — «отделение конфига от кода». API ConfigMap делает приложение переносимым. Конфигурация может быть изменена без повторного развертывания приложения.
ConfigMap
Ресурс Kuignetes ConfigMap содержит данные в виде пары ключ-значение. Это позволяет нам указывать данные конфигурации вне контейнера. Это разъединяет изображение и его конфигурацию. Любые изменения в configMap во время выполнения также отражаются в работающем контейнере. Следовательно, configMap является очень полезным инструментом в нескольких случаях использования, таких как:
- Установка переменных среды
- Установка аргументов командной строки в модуле
- Чтение файлов конфигурации с тома
Каждый из этих вариантов использования объясняется далее в этом посте.
Во-первых, давайте посмотрим на образец ConfigMap.
YAML
1
kind ConfigMap
2
apiVersion v1
3
metadata
4
creationTimestamp 2020-03-12T20 10 5Z
5
name my-configmap
6
namespace default
7
data
8
environment.variable.1 value1
9
environment.variable1.2 value2
10
external.property.file -
11
prop.1=value1
12
prop.2=value2
13
prop.3=value3
14
В приведенном выше примере данные поля содержат данные конфигурации. Как мы видим, он может содержать как отдельные свойства, так и содержимое из внешнего файла.
Создать ConfigMap
Давайте теперь начнем с создания configMap. Это можно сделать с помощью команды ниже:
xxxxxxxxxx
1
$ kubectl create configmap <name> <source>
где имя - это имя configMap, а источник - литеральное значение или файл, содержащий данные.
Чтобы заполнить configMap из литеральных значений, смотрите команду:
Оболочка
1
$ kubectl create configmap my-configmap --from-literal=property.1=value1 --from-literal=property.2=value2
Если у нас есть каталог, содержащий несколько файлов, используйте следующую команду:
Оболочка
xxxxxxxxxx
1
$ kubectl create configmap my-configmap --from-file=parentDir/container/configmap/
Чтобы увидеть детали уже созданного configMap, используйте следующую команду:
Оболочка
xxxxxxxxxx
1
$ kubectl describe configmaps my-configmap
Использование ConfigMap в модуле
Есть несколько вариантов использования, где configMap используется внутри спецификации Pod.
Для переменных среды
Если нам нужно установить значение переменной среды, объявленной в спецификации Pod, используя configMap, тогда мы можем выполнить следующие шаги.
Сначала создайте configMap:
Оболочка
xxxxxxxxxx
1
$ kubectl create configmap my-configmap --from-literal=property.1=value
Теперь создайте спецификацию pod (mypod.yaml):
YAML
xxxxxxxxxx
1
apiVersion v1
2
kind Pod
3
metadata
4
name my-pod
5
spec
6
containers
7
name my-container
8
image my-image
9
env
10
# Here we define environment variable
11
name ENV_VARIABLE
12
valueFrom
13
configMapKeyRef
14
# Name the ConfigMap which has value for this env variable
15
name my-configmap
16
# Name the key in the configMap which holds value of this env var
17
key property.1
18
Теперь создайте стручок из вышеупомянутой спецификации.
xxxxxxxxxx
1
$ kubectl apply -f mypod.yaml
2
pod/my-pod created
Теперь, чтобы проверить, были ли созданы переменные среды.
Оболочка
xxxxxxxxxx
1
$ kubectl exec my-pod -it -- env | grep ENV_VARIABLE
2
ENV_VARIABLE =value
Нет необходимости устанавливать данные конфигурации только из одной карты конфигурации. Мы можем указать несколько configMaps и использовать их для установки различных переменных среды.
Допустим, у нас есть два configMaps, my-configmap1 и my-configmap2.
Затем мы можем использовать их следующим образом:
YAML
xxxxxxxxxx
1
apiVersion v1
2
kind Pod
3
metadata
4
name my-pod
5
spec
6
containers
7
name my-container
8
image hello-world
9
env
10
name ENV_VARIABLE_1
11
valueFrom
12
configMapKeyRef
13
name my-configmap1
14
key property.1
15
name ENV_VARIABLE_1
16
valueFrom
17
configMapKeyRef
18
name my-configmap2
19
key property.1
Для аргументов командной строки A Pod
Под спецификацией есть раздел команд. Мы можем установить эту команду из configMap, таким образом делая команду динамической. Смотрите ниже спецификации стручка:
YAML
xxxxxxxxxx
1
apiVersion v1
2
kind Pod
3
metadata
4
name my-pod
5
spec
6
containers
7
name my-container
8
image my-hello-world
9
command "/bin/sh" "echo $(KEY)"
10
env
11
name KEY
12
valueFrom
13
configMapKeyRef
14
name my-configmap
15
key property.1
Здесь, KEY
содержит значение property.1, определенное в configMap my-configMap.
Если мы используем том Kubernetes для модуля, а затем мы можем заполнить его, используя файлы, объявленные в configMap. Смотрите спецификацию стручка ниже:
YAML
xxxxxxxxxx
1
apiVersion v1
2
kind Pod
3
metadata
4
name my-pod
5
spec
6
containers
7
name my-container
8
image hello-world
9
volumeMounts
10
name test-volume
11
mountPath /etc/myvolume
12
volumes
13
name test-volume
14
configMap
15
# Name ConfigMap which contains list of files which will be populated in the voume
16
name my-configmap
В приведенном выше примере данные my-configmap будут добавлены в том, указанный в volumeMounts.mountPath.
Заключение
В этом посте мы обсуждали, как мы можем использовать ресурс Kubernetes configMap для динамической установки данных конфигурации модулей, что позволяет отделить конфигурацию от кода.
Мы объяснили, как использовать configMap с помощью реальных фрагментов кода, которые можно легко использовать в вашем проекте.