Перейти до вмісту

Модуль 2.4: Конфігурація

Складність: [СЕРЕДНІЙ] - Концепції конфігурації

Час на виконання: 25-30 хвилин

Передумови: Модуль 2.3 (Зберігання)


Що ви зможете робити

Розділ «Що ви зможете робити»

Після завершення цього модуля ви зможете:

  • Пояснити призначення ConfigMap та Secret для відокремлення конфігурації від коду
  • Порівняти методи впровадження конфігурації: змінні середовища, монтування томів та аргументи команд
  • Визначити коли використовувати ConfigMap або Secret залежно від чутливості даних
  • Оцінити незмінні ConfigMap та їхні переваги для масштабних розгортань

Чому цей модуль важливий

Розділ «Чому цей модуль важливий»

Застосунки потребують конфігурації — URL баз даних, прапорці функцій, API-ключі. Kubernetes надає ConfigMaps та Secrets для керування конфігурацією окремо від образів контейнерів. Це основна концепція, яку перевіряє KCNA.


Проблема конфігурації

Розділ «Проблема конфігурації»
┌─────────────────────────────────────────────────────────────┐
│ ЧОМУ ВІДДІЛЯТИ КОНФІГУРАЦІЮ? │
├─────────────────────────────────────────────────────────────┤
│ │
│ Без ConfigMaps/Secrets (погана практика): │
│ ───────────────────────────────────────────────────────── │
│ Конфігурація вбудована в образ: │
│ ENV DATABASE_URL=prod-db.example.com │
│ ENV API_KEY=sk-12345... │
│ │
│ Проблеми: │
│ • Потрібні різні образи для dev/staging/prod │
│ • Секрети видимі у шарах образу │
│ • Не можна змінити конфігурацію без перебудови образу │
│ │
│ З ConfigMaps/Secrets (найкраща практика): │
│ ───────────────────────────────────────────────────────── │
│ Той самий образ скрізь: │
│ [my-app:v1.0] ←── той самий образ │
│ ├── dev: ConfigMap з налаштуваннями dev │
│ ├── staging: ConfigMap з налаштуваннями staging │
│ └── prod: ConfigMap з налаштуваннями prod │
│ │
│ Переваги: │
│ • Один образ, багато середовищ │
│ • Зміна конфігурації без перебудови │
│ • Секрети керуються окремо та безпечно │
│ │
└─────────────────────────────────────────────────────────────┘

ConfigMap зберігає нечутливі конфігураційні дані:

┌─────────────────────────────────────────────────────────────┐
│ CONFIGMAP │
├─────────────────────────────────────────────────────────────┤
│ │
│ ConfigMaps зберігають: │
│ • Пари ключ-значення │
│ • Конфігураційні файли │
│ • Змінні середовища │
│ │
│ Приклад ConfigMap: │
│ ───────────────────────────────────────────────────────── │
│ apiVersion: v1 │
│ kind: ConfigMap │
│ metadata: │
│ name: app-config │
│ data: │
│ DATABASE_HOST: mysql.default.svc │
│ LOG_LEVEL: info │
│ MAX_CONNECTIONS: "100" │
│ │
│ Примітка: Всі значення є рядками (навіть "100") │
│ │
└─────────────────────────────────────────────────────────────┘

Використання ConfigMaps

Розділ «Використання ConfigMaps»

Два способи:

  1. Як змінні середовища — використовуючи envFrom або valueFrom
  2. Як том (файли) — монтування ConfigMap як тому, де кожен ключ стає файлом

Secret зберігає чутливі дані:

┌─────────────────────────────────────────────────────────────┐
│ SECRETS │
├─────────────────────────────────────────────────────────────┤
│ │
│ Secrets зберігають: │
│ • Паролі │
│ • API-ключі │
│ • Сертифікати │
│ • SSH-ключі │
│ │
│ Типи Secret: │
│ • Opaque: Загальний secret (за замовчуванням) │
│ • kubernetes.io/tls: TLS-сертифікати │
│ • kubernetes.io/dockerconfigjson: Автентифікація реєстру │
│ • kubernetes.io/basic-auth: Базова автентифікація │
│ • kubernetes.io/ssh-auth: SSH-облікові дані │
│ │
│ Дані закодовані в base64 (НЕ зашифровані!) │
│ │
└─────────────────────────────────────────────────────────────┘

Ті ж патерни, що й ConfigMaps:

  1. Як змінні середовища
  2. Як том (з readOnly: true — найкраща практика для secrets)

┌─────────────────────────────────────────────────────────────┐
│ CONFIGMAP проти SECRET │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────┐ ┌──────────────────────┐ │
│ │ ConfigMap │ │ Secret │ │
│ ├──────────────────────┤ ├──────────────────────┤ │
│ │ • Нечутливі дані │ │ • Чутливі дані │ │
│ │ • Простий текст │ │ • Закодовані base64 │ │
│ │ • Не зашифровані │ │ • Можуть бути зашифр.│ │
│ │ • Без обмеження розм. │ │ • Обмеження 1МБ │ │
│ └──────────────────────┘ └──────────────────────┘ │
│ │
│ Коли що використовувати: │
│ ConfigMap: Secret: │
│ • Хост бази даних • Пароль бази даних │
│ • Рівень логування • API-ключі │
│ • Прапорці функцій • TLS-сертифікати │
│ • Конфігураційні файли • SSH-ключі │
│ │
│ Важливо: │
│ Base64 — це НЕ шифрування! │
│ Це лише кодування. Будь-хто може декодувати. │
│ Для справжньої безпеки увімкніть шифрування в стані │
│ спокою. │
│ │
└─────────────────────────────────────────────────────────────┘

Незмінні ConfigMaps та Secrets

Розділ «Незмінні ConfigMaps та Secrets»
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
immutable: true ← Не може бути змінений після створення
data:
key: value

Переваги:

  • Захист від випадкових змін
  • Покращення продуктивності (не потрібні watches)
  • Зменшення навантаження на API server

Для оновлення: Видаліть та створіть заново з новим ім’ям.


Змінні середовища проти монтування томів

Розділ «Змінні середовища проти монтування томів»
АспектЗмінні середовищаМонтування томів
ОновленняПотребує перезапуск ПодаМожливе гаряче оновлення
ДоступСередовище процесуФайлова система
ВикористанняПрості ключ-значенняКонфігураційні файли
РозмірОбмеженийБільші файли OK

  • Secrets не зашифровані за замовчуванням - Вони лише закодовані base64. Увімкніть шифрування в стані спокою для справжньої безпеки.

  • Оновлення ConfigMap - Якщо змонтований як том, зміни поширюються до Подів (з затримкою). Змінні середовища потребують перезапуск Пода.

  • Обмеження розміру Secret - Secrets обмежені 1МБ, оскільки вони зберігаються в etcd.

  • Монтування конкретних ключів - Ви можете монтувати тільки конкретні ключі з ConfigMap/Secret, а не весь ресурс.


ПомилкаЧому це шкодитьПравильне розуміння
Зберігання секретів у ConfigMapsРизик безпеки, видно в логахВикористовуйте Secrets для чутливих даних
Думати, що base64 — це шифруванняХибне почуття безпекиУвімкніть шифрування в стані спокою
Хардкодинг в образахНе можна змінити без перебудовиВикористовуйте ConfigMaps/Secrets
Великі ConfigMapsПроблеми продуктивностіТримайте конфігурації малими, розділяйте за потреби

  1. Яка різниця між ConfigMap та Secret?

    Відповідь ConfigMaps зберігають нечутливі конфігураційні дані у простому тексті. Secrets зберігають чутливі дані (паролі, ключі) та закодовані base64. Обидва можуть використовуватися як змінні середовища або монтуватися як томи.
  2. Чи є кодування base64 безпечним?

    Відповідь Ні! Base64 — це кодування, а не шифрування. Будь-хто може декодувати його. Для справжньої безпеки увімкніть шифрування в стані спокою для Secrets в etcd.
  3. Як застосунок може споживати дані ConfigMap?

    Відповідь Два способи: (1) Як змінні середовища через envFrom або valueFrom, (2) Як файли, монтуючи ConfigMap як том. Змінні середовища потребують перезапуск Пода для оновлення; монтування томів можуть оновлюватися автоматично.
  4. Що робить immutable: true?

    Відповідь Робить ConfigMap або Secret незмінним після створення. Це захищає від випадкових змін та покращує продуктивність. Для оновлення потрібно видалити та створити заново.
  5. Чому відділяти конфігурацію від образів контейнерів?

    Відповідь Щоб використовувати той самий образ у різних середовищах (dev/staging/prod), змінювати конфігурацію без перебудови образів та тримати чутливі дані поза шарами образу.

ConfigMaps:

  • Зберігають нечутливу конфігурацію
  • Пари ключ-значення або файли у простому тексті
  • Використання: хости баз даних, рівні логування, прапорці функцій

Secrets:

  • Зберігають чутливі дані
  • Закодовані base64 (не зашифровані!)
  • Використання: паролі, API-ключі, сертифікати

Методи споживання:

  • Змінні середовища (потребують перезапуск для оновлень)
  • Монтування томів (можуть гаряче оновлюватися)

Найкращі практики:

  • Ніколи не хардкодьте конфігурацію в образах
  • Використовуйте Secrets для чутливих даних
  • Увімкніть шифрування в стані спокою для Secrets
  • Розгляньте immutable для стабільності

Частину 2 завершено!

Розділ «Частину 2 завершено!»

Ви закінчили Оркестрацію контейнерів (22% іспиту). Тепер ви розумієте:

  • Як планування вирішує, де запускати Поди
  • Масштабування з HPA, VPA та Cluster Autoscaler
  • Зберігання з PV, PVC та StorageClasses
  • Конфігурацію з ConfigMaps та Secrets

Наступна частина: Частина 3: Хмарна архітектура - Розуміння патернів проєктування хмарних технологій та екосистеми CNCF.