Skip to content

configmap

ConfigMap - сущность k8s, предназначенная для хранения конфигураций приложений и значений переменных среды.

По своей сути ConfigMap - это именнованная пара ключ-значение, которая загружается в namespace k8s, а уже из него поды могут брать нужные значения.

Пример с переменными окружения.
# Через указание дериктивы envFrom можно передать все переменные окружения указанные в блоке data объекта ConfigMap.
# Через дериктиву env можно передавать конкретные переменные
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: postgres-config
data:
  POSTGRES_ROOT_PASSWORD: root
  POSTGRES_DB: mydatabase
  POSTGRES_USER: myuser
  POSTGRES_PASSWORD: mypassword
  POSTGRES_INITDB_ARGS: "--encoding=UTF8"

---
apiVersion: apps/v1
kind: Deployment
...
    spec:
      containers:
      - name: postgres
        image: postgres:latest
        envFrom: # k8s возьмет все пары kv из блока data и передаст их в контейнер в неизменном виде
        - configMapRef:
            name: postgres-config
        ports:
        - containerPort: 5432

---
...
    spec:
      containers:
      - name: postgres
        image: postgres:latest
        env: # k8s возьмет значения указаных нами ключей и присвоит их указанным нами переменным
        - name: POSTGRES_DB # имя переменной, которая будет передана в контейнер
           valueFrom: # говорим куберу, что значение нужно брать из переменной
             ConfigMapKeyRef: # говорим, что значение нужно брать из ConfigMap
             name: postgres-config # Имя ConfigMap
             key: POSTGRES_DB # Имя ключа записанного в ConfigMap, может отличаться от нашего имени переменной
Пример с передачей конфигурации для nginx
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  nginx.conf: | # записываем  в ключ nginx.conf блок данных
    server {
        listen 80;
        server_name localhost;

        location / {
            root /usr/share/nginx/html;
            index index.html;
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
            root /usr/share/nginx/html;
        }
    }

---
apiVersion: apps/v1
kind: Deployment
...
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
        volumeMounts: # монтируем в контейнер volume с конфигом
        - name: nginx-config-volume # имя volume
          mountPath: /etc/nginx/conf.d # путь монтирования в контейнере
      volumes: # создаем тома
      - name: nginx-config-volume # имя volume
        configMap: # говорим k8s, что том нужно создать из объекта configMap
          name: nginx-config

Важно понимать, что данные в объекте ConfigMap можно и нужно менять, только чтобы обновления были доставленны в нужные контейнеры - деплойменты должны быть перезапущенны. Либо необходимо создавать такие приложения которые будут автоматически обновляться при изменении связанных с ними объектов ConfigMap