Вернуться к блогу
12 июня 2025
18 мин

Production-ready Kubernetes: настройка кластера для реальных нагрузок

Kubernetes
Production
DevOps

Редакция DevBobs · Дата публикации: 12 июня 2025

Развертывание Kubernetes в production требует серьезной подготовки и понимания множества аспектов: от безопасности до мониторинга. В этом руководстве разберем все критически важные компоненты production-ready кластера.

Планирование архитектуры

Перед развертыванием определите требования к вашему кластеру: ожидаемые нагрузки, требования к доступности, бюджет, compliance требования.

Ключевые решения:

  • Managed vs Self-managed кластер
  • Мультизонность и географическое распределение
  • Размер и тип узлов
  • Сетевая архитектура и CNI плагин
  • Хранилище данных и CSI драйверы

Безопасность кластера

RBAC (Role-Based Access Control)

Настройте детализированные права доступа для пользователей и сервисных аккаунтов. Следуйте принципу минимальных привилегий.

# rbac-example.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: production
  name: app-developer
rules:
- apiGroups: [""]
  resources: ["pods", "services", "configmaps"]
  verbs: ["get", "list", "create", "update", "patch"]
- apiGroups: ["apps"]
  resources: ["deployments", "replicasets"]
  verbs: ["get", "list", "create", "update", "patch"]

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: app-developer-binding
  namespace: production
subjects:
- kind: User
  name: developer@company.com
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: app-developer
  apiGroup: rbac.authorization.k8s.io

Pod Security Standards

Внедрите Pod Security Standards для контроля безопасности подов на уровне namespace.

# security-policy.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: production
  labels:
    pod-security.kubernetes.io/enforce: restricted
    pod-security.kubernetes.io/audit: restricted
    pod-security.kubernetes.io/warn: restricted

Network Policies

Настройте сетевые политики для контроля трафика между подами и внешними ресурсами.

# network-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: deny-all-ingress
  namespace: production
spec:
  podSelector: {}
  policyTypes:
  - Ingress
  ingress: []

---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-frontend-to-backend
  namespace: production
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 8080

Высокая доступность (HA)

Control Plane HA

Разверните кластер с множественными master-нодами в разных зонах доступности. Используйте внешний etcd кластер для критически важных данных.

Worker Nodes

Распределите worker-ноды по зонам доступности, настройте автоскейлинг и механизмы автоматического восстановления.

# node-group-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cluster-autoscaler-status
  namespace: kube-system
data:
  nodes.max: "100"
  nodes.min: "3"
  scale-down-delay-after-add: "10m"
  scale-down-unneeded-time: "10m"

Мониторинг и наблюдаемость

Prometheus Stack

Разверните полный стек мониторинга: Prometheus для сбора метрик, Grafana для визуализации, Alertmanager для уведомлений.

# prometheus-values.yaml
prometheus:
  prometheusSpec:
    retention: 30d
    storageSpec:
      volumeClaimTemplate:
        spec:
          storageClassName: fast-ssd
          accessModes: ["ReadWriteOnce"]
          resources:
            requests:
              storage: 100Gi
    resources:
      requests:
        memory: 2Gi
        cpu: 1000m
      limits:
        memory: 4Gi
        cpu: 2000m

grafana:
  persistence:
    enabled: true
    size: 10Gi
  resources:
    requests:
      memory: 512Mi
      cpu: 500m

Logging

Настройте централизованное логирование с использованием ELK Stack или Grafana Loki. Обеспечьте сбор логов как приложений, так и системных компонентов.

# fluentd-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: fluentd-config
data:
  fluent.conf: |
    <source>
      @type tail
      path /var/log/containers/*.log
      pos_file /var/log/fluentd-containers.log.pos
      tag kubernetes.*
      format json
      time_format %Y-%m-%dT%H:%M:%S.%NZ
    </source>
    
    <filter kubernetes.**>
      @type kubernetes_metadata
    </filter>
    
    <match kubernetes.**>
      @type elasticsearch
      host elasticsearch.logging.svc.cluster.local
      port 9200
      index_name kubernetes
    </match>

Автоскейлинг

Horizontal Pod Autoscaler (HPA)

Настройте автоматическое масштабирование подов на основе метрик CPU, памяти или кастомных метрик.

# hpa-config.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: webapp-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: webapp
  minReplicas: 3
  maxReplicas: 100
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 60
      policies:
      - type: Percent
        value: 100
        periodSeconds: 60
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
      - type: Percent
        value: 10
        periodSeconds: 60

Vertical Pod Autoscaler (VPA)

Используйте VPA для автоматической настройки ресурсных лимитов подов на основе фактического использования.

Cluster Autoscaler

Настройте автоскейлинг узлов для автоматического добавления/удаления worker-нод в зависимости от нагрузки.

Backup и Disaster Recovery

etcd Backup

Настройте регулярное резервное копирование etcd — сердца вашего кластера.

# etcd-backup-cronjob.yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: etcd-backup
spec:
  schedule: "0 2 * * *"  # Каждый день в 2:00
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: etcd-backup
            image: k8s.gcr.io/etcd:3.5.0
            command:
            - /bin/sh
            - -c
            - |
              ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-snapshot-$(date +%Y%m%d-%H%M%S).db                 --endpoints=https://etcd:2379                 --cacert=/etc/ssl/etcd/ca.crt                 --cert=/etc/ssl/etcd/client.crt                 --key=/etc/ssl/etcd/client.key
            volumeMounts:
            - name: backup-storage
              mountPath: /backup
          volumes:
          - name: backup-storage
            persistentVolumeClaim:
              claimName: etcd-backup-pvc
          restartPolicy: OnFailure

Application Data Backup

Используйте Velero или похожие инструменты для резервного копирования ресурсов кластера и persistent volumes.

Производительность и оптимизация

Resource Management

Правильно настройте requests и limits для всех контейнеров. Используйте ResourceQuotas для ограничения ресурсов на уровне namespace.

# resource-quota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: production-quota
  namespace: production
spec:
  hard:
    requests.cpu: "100"
    requests.memory: 200Gi
    limits.cpu: "200"
    limits.memory: 400Gi
    persistentvolumeclaims: "10"
    pods: "50"
    services: "20"

Quality of Service

Классифицируйте ваши поды по QoS классам (Guaranteed, Burstable, BestEffort) для правильного управления ресурсами.

Обновления и поддержка

Rolling Updates

Настройте стратегии обновления для минимизации downtime и обеспечения отката в случае проблем.

# deployment-strategy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: webapp
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  template:
    spec:
      containers:
      - name: webapp
        image: webapp:v1.2.0
        readinessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 10
          periodSeconds: 5
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10

Cluster Upgrades

Планируйте регулярные обновления кластера, тестируйте их на staging окружении и всегда имейте план отката.

Заключение

Production-ready Kubernetes кластер — это сложная система, требующая внимания к множеству деталей. Начните с базовых принципов безопасности и мониторинга, постепенно добавляя продвинутые возможности по мере роста требований.

Помните: надежность в production достигается не только правильной настройкой, но и постоянным мониторингом, тестированием и готовностью к быстрому реагированию на инциденты.

Нужна помощь с DevOps в вашем проекте?

Наши эксперты готовы помочь настроить CI/CD, оптимизировать инфраструктуру и автоматизировать процессы

Наши услуги