Перейти к содержимому
Digital Business BY · БЕЛАРУСЬ
НБ РБUSD2.9462EUR3.2801RUB0.0366PLN0.7465CNY0.4429Конвертер →
IT и стартапы

ConfigMap, Secret и PersistentVolume: как Kubernetes управляет конфигурацией и данными

Разбираем ключевые объекты Kubernetes, которые отделяют настройки и секреты от кода — и объясняем, почему Base64 не является шифрованием.

Казакевич Алексей
6 мин
ConfigMap, Secret и PersistentVolume: как Kubernetes управляет конфигурацией и данными
Содержание · 5
  1. 01Почему конфиг не должен жить внутри образа
  2. 02ConfigMap: конфигурация отдельно от кода
  3. 03Secret: секреты и важный нюанс про Base64
  4. 04PersistentVolume: данные, которые переживают Pod
  5. 05Практика: kubectl и первое приложение в Minikube

Практически любое приложение нуждается во внешних настройках: адресах баз данных, паролях, API-ключах, токенах. Если зашить всё это внутрь Docker-образа, сопровождение превращается в головную боль, а безопасность — в иллюзию. Kubernetes решает эту проблему через три специализированных механизма: ConfigMap, Secret и PersistentVolume.

Почему конфиг не должен жить внутри образа

Представьте: база данных переехала на другой сервер. Если адрес подключения зашит в образ, придётся изменить конфиг, пересобрать образ, загрузить его в Registry и накатить обновление в кластере — и всё это ради одного параметра.

Ещё острее проблема встаёт при работе с несколькими окружениями. Одно приложение обычно запускается минимум в трёх средах: разработка, тестирование, продакшн. У каждой свой DB_HOST, свои ключи, свои режимы логирования. Собирать отдельный образ для каждой среды — значит нарушать базовый принцип контейнеризации: один образ должен работать в любом окружении без изменений.

Отдельная история — пароли и токены. Если они попали внутрь образа или в репозиторий Git, любой человек с доступом к коду или Registry может их прочитать. Именно для разделения кода, конфигурации и секретов Kubernetes предоставляет специальные объекты.

ConfigMap: конфигурация отдельно от кода

ConfigMap — объект Kubernetes для хранения обычных, несекретных настроек приложения в виде пар «ключ — значение». Типичное содержимое: адреса сервисов, номера портов, режим работы, пути к директориям, параметры логирования.

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

yaml apiVersion: v1 kind: ConfigMap metadata: name: app-config data: APP_ENV: production DB_HOST: postgres DB_PORT: "5432" LOG_LEVEL: info

Существует два основных способа передать ConfigMap приложению. Первый — через переменные окружения: контейнер получает значения как обычные env-переменные, и приложение работает с ними стандартным способом. Второй — монтирование как файловой системы: Kubernetes подключает ConfigMap как директорию, внутри которой каждый ключ становится отдельным файлом.

Второй подход особенно востребован для приложений, которые читают конфигурацию из файлов, а не из переменных окружения: Nginx, Prometheus, Grafana, PostgreSQL, различные Java-сервисы. Смена конфига в этом случае не требует пересборки образа — достаточно обновить ConfigMap.

Secret: секреты и важный нюанс про Base64

Для хранения чувствительных данных — паролей, токенов, SSH-ключей, TLS-сертификатов, API-ключей — предназначен объект Secret. По интерфейсу он похож на ConfigMap: те же два способа передачи данных в контейнер (переменные окружения или монтирование файлов).

Пример:

yaml apiVersion: v1 kind: Secret metadata: name: db-secret type: Opaque stringData: username: admin password: Passpass

Здесь важно развеять распространённое заблуждение. Многие считают, что Kubernetes автоматически шифрует содержимое Secret. Это не так. По умолчанию значения хранятся в кодировке Base64 — а это кодирование, а не шифрование. Любой, кто получит доступ к объекту, сможет мгновенно декодировать значение.

Для полноценной защиты секретов используют дополнительные инструменты:

  • HashiCorp Vault — популярное решение для централизованного управления секретами, широко применяется в корпоративных инсталляциях, в том числе в компаниях ПВТ;
  • AWS Secrets Manager, Azure Key Vault, Google Secret Manager — облачные варианты для соответствующих платформ;
  • шифрование данных непосредственно в хранилище etcd на уровне кластера.

Тем не менее Secret остаётся стандартным механизмом в Kubernetes: он отделяет секреты от обычной конфигурации и задаёт правильную структуру даже без дополнительного шифрования.

PersistentVolume: данные, которые переживают Pod

ConfigMap и Secret решают вопрос конфигурации. Но у приложений есть ещё одна потребность — хранить данные, которые не исчезнут при перезапуске или переносе Pod на другой узел.

Обычный Volume в Kubernetes привязан к жизненному циклу Pod: удалили Pod — потеряли данные. Для баз данных, файловых хранилищ и любых сервисов с состоянием это неприемлемо.

Для решения этой задачи существуют три взаимосвязанных объекта.

PersistentVolume (PV) — независимый том хранения, который существует отдельно от приложений. Его можно представить как виртуальный диск: он продолжает существовать даже после удаления Pod. PV может использовать локальный диск сервера, Amazon EBS, Google Persistent Disk, Azure Disk, Ceph и другие системы хранения.

PersistentVolumeClaim (PVC) — запрос от приложения на получение хранилища. Разработчику не нужно знать, где физически лежат данные: он просто описывает потребность («нужен диск 10 ГиБ»), а Kubernetes сам находит подходящий PV и связывает их.

StorageClass — описание того, как Kubernetes должен создавать новые тома: SSD, HDD, высокопроизводительные NVMe или сетевые файловые системы. Когда создаётся PVC, StorageClass позволяет автоматически выделить новый PV нужного типа — этот механизм называется Dynamic Provisioning. В современных облачных платформах создавать диски вручную обычно не требуется.

Полная цепочка выглядит так: Pod → PVC → StorageClass → PV → физическое хранилище. Если Pod удаляется или переносится на другой узел, Kubernetes снова подключает тот же PV через PVC — данные остаются доступными.

При создании PV и PVC важно выбрать правильный режим доступа. ReadWriteOnce — том подключается для чтения и записи только к одному узлу, стандартный вариант для баз данных. ReadOnlyMany — несколько узлов читают одновременно, запись запрещена. ReadWriteMany — несколько узлов читают и пишут одновременно, используется сетевыми файловыми системами.

Практика: kubectl и первое приложение в Minikube

Теория приобретает смысл только в связке с практикой. kubectl — официальная консольная утилита для управления кластером. Через неё создают ресурсы, обновляют приложения, смотрят логи, подключаются к контейнерам и диагностируют проблемы.

kubectl не управляет контейнерами напрямую: каждая команда уходит в Kubernetes API Server, который входит в состав Control Plane, а дальше работают компоненты кластера. Это означает, что одной утилитой можно управлять и локальным кластером, и удалёнными в облаке.

Для подключения к нужному кластеру kubectl использует файл kubeconfig (~/.kube/config). Внутри него хранятся адреса API Server, данные аутентификации и список контекстов. Контекст — это сохранённый набор параметров: какой кластер, какой пользователь, какой Namespace использовать по умолчанию. Переключение между контекстами критично при работе с несколькими окружениями: случайно выполнить команду в продакшне вместо тестового стенда — классическая ошибка.

Для локального обучения и экспериментов оптимален Minikube — инструмент, запускающий полноценный Kubernetes-кластер на одном компьютере. Он бесплатен, поддерживает Linux, Windows и macOS и включает все основные компоненты Kubernetes. Для запуска достаточно установленного Docker и свободных 20 ГБ на диске.

После старта кластера командой minikube start можно развернуть первое приложение буквально двумя командами:

bash kubectl create deployment nginx --image=nginx kubectl expose deployment nginx --port=80 --type=NodePort minikube service nginx

Kubernetes сам создаст Deployment, ReplicaSet и Pod, загрузит образ Nginx и откроет страницу приветствия в браузере.

Для диагностики проблем чаще всего используют четыре команды: kubectl describe pod <name> — подробная информация и события Pod; kubectl logs <name> — логи приложения; kubectl exec -it <name> -- sh — подключение внутрь контейнера; kubectl get events — события всего кластера. В большинстве случаев этого достаточно, чтобы найти причину неисправности.

Полный путь приложения в Kubernetes выглядит так: Dockerfile → сборка образа → Container Registry → kubectl apply → Deployment → ReplicaSet → Pod → Service → Ingress → пользователь. Понимание этой цепочки — основа работы DevOps-инженера с современными контейнерными платформами.

ПоделитьсяVK

Свежие новости

Все новости
Концептуальная иллюстрация: Amazon SageMaker AI поддерживает разделение GPU для инференса в реальном времени
IT и стартапы

Amazon SageMaker AI поддерживает разделение GPU для инференса в реальном времени

Amazon SageMaker AI добавил поддержку разделения GPU на реальных эндпоинтах: технология NVIDIA MIG делит один ускоритель на до семи изолированных разделов, каждый со своей памятью и вычислительными ресурсами.

Редакция
1 мин
Концептуальная иллюстрация: Payments Apps API 2027-01: новый сигнал trusted vault origin для обработки карт без CVV
IT и стартапы

Shopify Payments Apps API 2027-01 получил сигнал trusted_vault_origin

В релиз-кандидате Payments Apps API версии 2027-01 появилось поле payment_method.data.trusted_vault_origin. Оно позволяет платёжным приложениям не отклонять транзакцию при отсутствии CVV, если карта поступила из хранилища, которому доверяет Shopify. Поле опциональное и требует отдельного включения со стороны Shopify.

Редакция
2 мин
Концептуальная иллюстрация: AWS Step Functions теперь можно подключать как инструменты для ИИ-агентов
IT и стартапы

AWS Step Functions теперь можно подключать как инструменты для ИИ-агентов

AWS Step Functions добавила поддержку использования рабочих процессов в роли инструментов для ИИ-агентов через Amazon Bedrock AgentCore Gateway. Агент самостоятельно решает, когда запустить процесс и какие данные передать, а Step Functions выполняет каждый шаг в заданном порядке.

Редакция
1 мин
Концептуальная иллюстрация: Shopify Flow теперь управляется через AI Toolkit
IT и стартапы

Shopify Flow теперь управляется через AI Toolkit

Shopify добавила в AI Toolkit поддержку управления рабочими процессами Flow. Агент может разбирать .flow-файлы, получать задачи и пути окружения, а также строить автоматизации — но только для собственного магазина и при наличии одобренного скоупа.

Редакция
1 мин
Концептуальная иллюстрация: Shopify Tax: управляемый режим вводит новые ограничения Admin API
IT и стартапы

Shopify Tax: управляемый режим вводит новые ограничения Admin API

Shopify Tax managed mode теперь влияет на поведение Admin API: часть запросов на запись проходит валидацию на соответствие требованиям управляемого режима. Затронуты приложения, работающие с рынками, товарами, черновыми заказами и оформлением заказа.

Редакция
2 мин
Концептуальная иллюстрация: GitHub Copilot Fusion научился выбирать между локальными и облачными моделями
IT и стартапы

GitHub Copilot Fusion научился выбирать между локальными и облачными моделями

GitHub выпустил экспериментальную функцию интеллектуальной маршрутизации для локальных моделей в Copilot Fusion. Теперь инструмент может автоматически выбирать между моделями на устройстве и облачными — без ручного переключения при каждом запросе.

Редакция
2 мин