---
# System prepended metadata

title: Configmap

---

# Configmap

1) Создаем configmap

configmap.yaml
```yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-configmap
data:
  default.conf: |
    server {
        listen       80 default_server;
        server_name  _;

        default_type text/plain;

        location / {
            return 200 '$hostname\n';
        }
    }
```

deployment-with-configmap.yaml
```yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - image: nginx:1.20
        name: nginx
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: 50m
            memory: 100Mi
          limits:
            cpu: 100m
            memory: 100Mi
        volumeMounts:
        - name: config
          mountPath: /etc/nginx/conf.d/
      volumes:
      - name: config
        configMap:
          name: my-configmap
```
Для этого выполним команды:

```bash
kubectl apply -f configmap.yaml
kubectl apply -f deployment-with-configmap.yaml
```

2) Проверяем

Проверим, что configmap попал в контейнер, для этого пробросим порт из пода и выполним curl.
Для этого выполним команду, заменив имя pod на имя вашего pod(``можно воспользоваться автоподстановкой по TAB``).

& - это запуск команд в фоновом режиме, потом вводим следующую команду. 
```bash
kubectl port-forward my-deployment-<TAB> 8080:80 &
curl 127.0.0.1:8080
```

В результате выполнения curl увидим имя пода, который обработал запрос. Результат должен быть примерно таким:

```bash
my-deployment-5b47d48b58-l4t67
```

3) Обновим configmap

```bash
kubectl edit configmap my-configmap

# изменим текст ответа

            return 200 '$hostname\nOK\n';
```

4) Проверим вывод пода

```bash
curl 127.0.0.1:8080
```

Вывод не изменился

5) Монтирование configmap, как отдельного файла в каталоге через subPath

php-config.yaml
```yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-php-conf
data:
  php.ini: |
    [php]
    register_globals = off
    track_errors = yes
```

deployment-with-configmap-php.yaml
```yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - image: quay.io/testing-farm/nginx:1.20
        name: nginx
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: 10m
            memory: 100Mi
          limits:
            cpu: 100m
            memory: 100Mi
        volumeMounts:
        - name: config
          mountPath: /etc/nginx/conf.d/
        - name: php
          mountPath: /etc/php.ini
          subPath: php.ini
      volumes:
      - name: config
        configMap:
          name: my-configmap
      - name: php
        configMap:
          name: my-php-conf
```

Применяем манифесты:

```bash
kubectl apply -f php-config.yaml
kubectl apply -f deployment-with-configmap-php.yaml
```

6) Заходим в под, смотрим на смонтированный файл

```bash
kubectl exec -it my-deployment-<TAB> -- bash

ls -lsa /etc
```

7) Смотрим, что бывает, если попробовать смонтировать файл в существующий каталог.

Исправляем манифест деплоймент, в части точки монтирования configmap my-php-conf
Убираем subPath, меняем точку монтирования.

```bash
kubectl edit deployment my-deployment
```

```yaml
  - mountPath: /etc
    name: php
```

8) Смотрим причину, по которой не стартует под

```bash
kubectl describe pod my-deployment-<TAB>
```

9) Чистим за собой, удаляем "изломанный" deployment

```bash
kubectl delete deployment my-deployment
```
