Этот гайд дает готовые шаблоны манифестов и пошаговые инструкции для запуска микросервисов в Kubernetes. Вы получите рабочие конфигурации для Deployment, Service, Ingress, NetworkPolicy и HorizontalPodAutoscaler, а также примеры интеграции PostgreSQL, Redis и Kafka. Материал проверен на практике в 2026 году и ориентирован на DevOps-инженеров и системных администраторов, которые переходят с монолитной архитектуры на микросервисную.
Kubernetes решает ключевые задачи микросервисной архитектуры: независимое масштабирование компонентов, автоматический перезапуск упавших подов и стабильное сетевое взаимодействие между сервисами. Вместо того чтобы вручную управлять серверами и балансировщиками, вы описываете желаемое состояние системы в YAML-манифестах, а контроллеры Kubernetes поддерживают его. Это сокращает время развертывания и снижает вероятность ошибок при эксплуатации.
Статья построена как практический маршрут: от подготовки кластера до настройки сетевых политик и управления жизненным циклом. Если вы только начинаете работать с оркестрацией, рекомендую сначала изучить архитектуру кластера и ключевые объекты API, чтобы уверенно ориентироваться в терминах Pod, Deployment и Service.
Подготовка кластера и базовые принципы
Перед развертыванием микросервисов убедитесь, что кластер работает корректно. Выполните проверку доступности:
kubectl cluster-infoЕсли команда возвращает адреса control plane и CoreDNS, кластер готов к работе. Для микросервисной архитектуры потребуется Kubernetes версии 1.28 или новее. В этой версии стабильно работают NetworkPolicy, HorizontalPodAutoscaler и все необходимые API-ресурсы.
Требования к кластеру и инструментам
Минимальный набор инструментов для работы:
- kubectl версии, совместимой с вашим кластером
- Helm 3 для установки сложных компонентов, таких как Kafka
- metrics-server для работы HorizontalPodAutoscaler
- CNI-плагин с поддержкой NetworkPolicy, например Calico или Cilium
Проверьте, что RBAC включен. Это критично для безопасности микросервисов, поскольку каждый сервис должен иметь минимально необходимые права. Установите metrics-server, если планируете использовать автомасштабирование по CPU:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yamlПодробнее о проектировании production-ready кластеров с чек-листами по безопасности и отказоустойчивости читайте в руководстве по проектированию кластеров Kubernetes.
Создание namespace и настройка контекста
Namespace изолирует ресурсы микросервисов от остальной части кластера. Создайте отдельное пространство имен и переключите на него текущий контекст, чтобы не указывать флаг -n в каждой команде:
kubectl create namespace microservices
kubectl config set-context --current --namespace=microservicesПосле этого все команды kubectl будут применяться к namespace microservices. Это снижает риск случайного изменения ресурсов в других пространствах имен.
Развертывание первого микросервиса: от манифеста до работающего пода
Начнем с простого веб-сервиса. Создайте файл deployment.yaml со следующей конфигурацией:
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-service
labels:
app: user-service
spec:
replicas: 3
selector:
matchLabels:
app: user-service
template:
metadata:
labels:
app: user-service
spec:
containers:
- name: user-service
image: nginx:1.27-alpine
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "100m"
limits:
memory: "128Mi"
cpu: "200m"Разберем ключевые поля. replicas задает количество запущенных подов. selector определяет, какие поды управляются этим Deployment. template описывает сам под: контейнер, образ, порты и ресурсы. Поле resources с requests и limits обязательно указывать для каждого сервиса, иначе поды могут быть вытеснены при нехватке ресурсов на узле.
Создание Deployment: пошаговый разбор манифеста
Секция spec.template.spec.containers описывает контейнер. Основные параметры:
image- образ контейнера из registryports- порты, которые слушает контейнерenv- переменные окружения для настройки приложенияresources- запросы и лимиты CPU и памяти
Переменные окружения можно задать напрямую в манифесте или через ConfigMap и Secret. Прямое указание подходит для тестов, но в production лучше выносить конфигурацию в отдельные объекты. Это позволяет менять настройки без пересборки образа.
Применение манифеста и проверка работоспособности
Примените манифест и проверьте статус подов:
kubectl apply -f deployment.yaml
kubectl get pods -o wideСтатус Running означает, что под запущен и контейнер работает. Если статус Pending, кластеру не хватает ресурсов для запуска. Статус CrashLoopBackOff указывает на ошибку в приложении: контейнер запускается, падает и перезапускается снова. Для диагностики используйте:
kubectl logs deployment/user-service
kubectl describe pod -l app=user-serviceКоманда logs показывает вывод контейнера, а describe - события и ошибки, связанные с подом. Эти две команды закрывают большинство задач первичной диагностики.
Организация сетевого взаимодействия: Service и обнаружение сервисов
Поды эфемерны: при перезапуске они получают новые IP-адреса. Service решает эту проблему, предоставляя стабильный DNS-имя и виртуальный IP для доступа к группе подов. CoreDNS автоматически резолвит имена сервисов внутри кластера, поэтому микросервисы могут обращаться друг к другу по имени, например http://user-service.
Создание Service типа ClusterIP
Создайте файл service.yaml:
apiVersion: v1
kind: Service
metadata:
name: user-service
spec:
selector:
app: user-service
ports:
- port: 80
targetPort: 80
type: ClusterIPService находит поды через selector, который сопоставляется с labels в шаблоне Deployment. Проверьте доступность из другого пода:
kubectl run test-pod --image=busybox --rm -it -- wget -qO- http://user-serviceЕсли команда возвращает ответ, сервис работает корректно. Для балансировки нагрузки между подами Service использует kube-proxy, который распределяет трафик по всем подам, соответствующим selector.
Внешний доступ через Ingress
ClusterIP доступен только внутри кластера. Для внешнего доступа нужен Ingress Controller, например NGINX. Установите его через Helm:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install ingress-nginx ingress-nginx/ingress-nginxЗатем создайте Ingress resource:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: user-service-ingress
spec:
ingressClassName: nginx
rules:
- host: api.example.com
http:
paths:
- path: /users
pathType: Prefix
backend:
service:
name: user-service
port:
number: 80Этот манифест направляет трафик с api.example.com/users на сервис user-service. Для production обязательно настройте TLS через секцию tls в Ingress или через cert-manager.
Сетевые политики: безопасность взаимодействия микросервисов
По умолчанию все поды в кластере могут общаться друг с другом. Это создает риск: если один микросервис скомпрометирован, злоумышленник получает доступ ко всем остальным. NetworkPolicy ограничивает трафик на уровне сети, разрешая только необходимые соединения.
Пример NetworkPolicy для ограничения доступа к базе данных
Создайте политику, которая разрешает доступ к PostgreSQL только от backend-подов:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: postgres-access
spec:
podSelector:
matchLabels:
app: postgres
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
app: backend
ports:
- protocol: TCP
port: 5432Эта политика блокирует все входящие соединения к подам с меткой app: postgres, кроме трафика от подов с меткой app: backend на порт 5432. Остальные поды, включая frontend, не смогут подключиться к базе данных.
Лучшие практики и типичные ошибки
При внедрении сетевых политик учитывайте несколько моментов. Если сервису нужен доступ во внешний мир, добавьте egress-правила, иначе исходящий трафик будет заблокирован. Для межпространственного доступа используйте namespaceSelector. Проверьте, что ваш CNI-плагин поддерживает NetworkPolicy: Calico и Cilium поддерживают, а Flannel без дополнительных настроек - нет. Внедряйте политики постепенно, начиная с наименее критичных сервисов, чтобы не нарушить работу production.
Управление жизненным циклом: обновления, пробы и масштабирование
Надежная эксплуатация микросервисов требует трех механизмов: обновления без простоя, автоматического перезапуска при сбоях и масштабирования под нагрузкой. Kubernetes предоставляет все три через Deployment, probes и HorizontalPodAutoscaler.
Настройка probes для повышения отказоустойчивости
Добавьте в манифест Deployment секции readinessProbe и livenessProbe:
readinessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 5
periodSeconds: 10
livenessProbe:
httpGet:
path: /health
port: 80
initialDelaySeconds: 15
periodSeconds: 20Readiness-проба определяет, готов ли под принимать трафик. Пока она не проходит, Service не направляет запросы на этот под. Liveness-проба проверяет, жив ли контейнер. Если она не проходит, Kubernetes перезапускает контейнер. Не задавайте слишком агрессивные проверки: короткий periodSeconds и маленький timeoutSeconds могут привести к ложным перезапускам при кратковременных задержках.
Автомасштабирование с HorizontalPodAutoscaler
Создайте HPA для автоматического изменения количества реплик в зависимости от нагрузки:
kubectl autoscale deployment user-service --cpu-percent=70 --min=3 --max=10Проверьте работу:
kubectl get hpaHPA увеличивает количество подов, когда средняя загрузка CPU превышает 70%, и уменьшает при снижении нагрузки. Для корректной работы требуется metrics-server. Откатить неудачное обновление можно командой:
kubectl rollout undo deployment/user-serviceСтратегия RollingUpdate в Deployment обеспечивает постепенную замену подов, что исключает простой при обновлении. Готовые production-манифесты с настройкой RollingUpdate и probes собраны в руководстве по управлению Deployment.
Интеграция stateful-компонентов: Kafka, PostgreSQL, Redis
Микросервисная архитектура редко обходится без stateful-компонентов. Базы данных, кэши и брокеры сообщений требуют постоянного хранилища и особого подхода к развертыванию. Для таких сервисов используйте StatefulSet и PersistentVolumes, чтобы данные сохранялись при перезапуске подов.
Развертывание PostgreSQL с персистентным хранилищем
Создайте PVC для хранения данных:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: postgres-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10GiЗатем разверните PostgreSQL через StatefulSet:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgres
spec:
serviceName: postgres
replicas: 1
selector:
matchLabels:
app: postgres
template:
metadata:
labels:
app: postgres
spec:
containers:
- name: postgres
image: postgres:16-alpine
ports:
- containerPort: 5432
env:
- name: POSTGRES_PASSWORD
valueFrom:
secretKeyRef:
name: postgres-secret
key: password
volumeMounts:
- name: postgres-data
mountPath: /var/lib/postgresql/data
volumeClaimTemplates:
- metadata:
name: postgres-data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 10GiДля production настройте репликацию PostgreSQL, чтобы обеспечить отказоустойчивость. Репликация гарантирует минимальные задержки при записи и защищает от потери данных при сбое основного узла.
Подключение Redis для кэширования
Redis развертывается проще, чем PostgreSQL, поскольку для кэша не всегда нужна репликация. Создайте Deployment и Service:
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:7-alpine
ports:
- containerPort: 6379
---
apiVersion: v1
kind: Service
metadata:
name: redis
spec:
selector:
app: redis
ports:
- port: 6379
targetPort: 6379Подключите микросервис к Redis через переменные окружения:
env:
- name: REDIS_HOST
value: redis
- name: REDIS_PORT
value: "6379"Redis обеспечивает мгновенный доступ к часто запрашиваемым данным, снижая нагрузку на основную базу данных.
Установка Kafka через Helm
Kafka - самый сложный компонент для ручного развертывания. Используйте Helm chart от Bitnami:
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install kafka bitnami/kafka --set provisioning.enabled=trueОсновные параметры values.yaml включают количество брокеров, размер хранилища и настройки репликации топиков. После установки создайте топик:
kubectl exec -it kafka-0 -- kafka-topics.sh --create --topic events --bootstrap-server localhost:9092 --partitions 3 --replication-factor 1Kafka выполняет роль надежного буфера для потоковых данных, обеспечивая прием и параллельную обработку сообщений от множества источников.
Реальный кейс: архитектура Icmotion для обработки IoT-данных
Платформа Icmotion для мониторинга транспорта демонстрирует, как описанные подходы работают в production. Система обрабатывает десятки тысяч одновременных подключений в реальном времени, используя микросервисную архитектуру на Kubernetes.
На входе весь трафик принимает Apache Kafka, который выполняет роль надежного буфера. Это позволяет параллельно обрабатывать потоковые данные от множества транспортных средств без потери сообщений. Для долгосрочного хранения данных клиентов и телеметрии используется PostgreSQL с настроенной репликацией. Redis обеспечивает мгновенный доступ к часто запрашиваемой информации, снижая нагрузку на основную базу.
Kubernetes оркестрирует все микросервисы, позволяя гибко масштабировать отдельные узлы системы при росте числа подключенных объектов или объема обрабатываемых данных. Разработчики отказались от монолитной архитектуры в пользу микросервисов, что обеспечило стабильность и возможность независимого масштабирования компонентов. Этот кейс подтверждает: связка Kafka, PostgreSQL, Redis и Kubernetes - проверенный шаблон для высоконагруженных систем.
Типичные ошибки при развертывании микросервисов и как их избежать
Большинство проблем в production возникает из-за нескольких повторяющихся ошибок. Разберем их и дадим конкретные решения.
Ошибка: недостаточные или отсутствующие resource limits
Без requests и limits поды могут потреблять неограниченные ресурсы, вытесняя соседние сервисы. Kubernetes убивает поды, превышающие лимиты, что приводит к неожиданным перезапускам. Всегда задавайте ресурсы:
resources:
requests:
memory: "128Mi"
cpu: "100m"
limits:
memory: "256Mi"
cpu: "500m"Requests гарантируют минимальные ресурсы для пода, limits ограничивают максимальное потребление. Подробный разбор этой и других ошибок с готовыми решениями - в статье о типичных ошибках Kubernetes.
Ошибка: хранение секретов в коде или образах
Пароли и ключи API не должны попадать в git-репозиторий или Docker-образ. Используйте Kubernetes Secrets:
kubectl create secret generic postgres-secret --from-literal=password=your-passwordДля production-окружений рассмотрите внешние менеджеры секретов, такие как HashiCorp Vault. Они обеспечивают ротацию ключей и аудит доступа. Никогда не коммитьте секреты в git, даже в зашифрованном виде, если у вас нет автоматизированного процесса их расшифровки при деплое.
Заключение: чек-лист для внедрения микросервисов в Kubernetes
Соберите ключевые шаги в чек-лист и пройдите по нему при внедрении:
- Проверьте кластер: версия 1.28+, RBAC включен, metrics-server установлен
- Создайте namespace для изоляции микросервисов
- Разверните первый сервис через Deployment с ресурсами и probes
- Настройте Service типа ClusterIP для внутреннего доступа
- Откройте внешний доступ через Ingress с TLS
- Примените NetworkPolicy для ограничения трафика между сервисами
- Настройте HorizontalPodAutoscaler для масштабирования под нагрузкой
- Разверните stateful-компоненты: PostgreSQL, Redis, Kafka
- Проверьте отказоустойчивость: удалите под и убедитесь, что он перезапустился
- Настройте мониторинг и алертинг для отслеживания состояния сервисов
Если вы переходите с монолита, начните с выделения одного сервиса и постепенно декомпозируйте остальные. Пошаговый план миграции без даунтайма описан в руководстве по переходу от монолита к микросервисам. Для размещения кластера можно использовать облачную инфраструктуру Timeweb Cloud, которая предоставляет готовые серверы и Kubernetes с гибким изменением ресурсов.