Production-ready Kubernetes: настройка кластера для реальных нагрузок
Редакция 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.ioPod 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: restrictedNetwork 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: 500mLogging
Настройте централизованное логирование с использованием 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: 60Vertical 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: OnFailureApplication 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: 10Cluster Upgrades
Планируйте регулярные обновления кластера, тестируйте их на staging окружении и всегда имейте план отката.
Заключение
Production-ready Kubernetes кластер — это сложная система, требующая внимания к множеству деталей. Начните с базовых принципов безопасности и мониторинга, постепенно добавляя продвинутые возможности по мере роста требований.
Помните: надежность в production достигается не только правильной настройкой, но и постоянным мониторингом, тестированием и готовностью к быстрому реагированию на инциденты.