← Назад к вопросам

Как избегать ошибки по созданию Deployment

2.0 Middle🔥 202 комментариев
#Kubernetes

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как избегать ошибок при создании Kubernetes Deployment

Создание стабильного и надёжного Deployment — фундаментальная задача DevOps-инженера. Ошибки на этом этапе могут привести к даунтайму, неконсистентности окружений и сложностям в отладке. Вот комплексный подход, основанный на лучших практиках и анализе частых ошибок.

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

Первая и главная ошибка — создание ресурсов через императивные команды kubectl run или kubectl create deployment. Это не даёт возможности отслеживать изменения, повторять развёртывание и применять практики GitOps.

Решение: Всегда описывайте Deployment в YAML-манифесте и храните его в Git. Это обеспечивает:

  • Версионирование и история изменений.
  • Code Review через pull/merge request.
  • Повторяемость развёртываний.
  • Интеграцию с CI/CD пайплайнами.
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  namespace: production
  labels:
    app: my-app
    version: v1.0.0 # Явное указание версии для отслеживания
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
        version: v1.0.0
    spec:
      containers:
      - name: app
        image: my-registry.com/app:v1.0.0 # Используйте конкретные теги, не latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080
        resources:
          requests:
            memory: "128Mi"
            cpu: "100m"
          limits:
            memory: "256Mi"
            cpu: "500m"

2. Валидация и линтинг манифестов

Ручные ошибки в YAML-синтаксисе, несоответствие API-версий или схемы — частые причины сбоев.

Решение: Внедрите статический анализ в CI/CD пайплайн:

  • kubectl apply --dry-run=client -f deployment.yaml — проверка синтаксиса и схемы Kubernetes.
  • kubeval — инструмент для валидации манифестов против официальных схем Kubernetes.
  • kube-linter или kubeconform — более продвинутые линтеры, проверяющие security best practices.
  • Встроенная проверка в редакторах (VS Code с плагинами Kubernetes, IDE от JetBrains).

3. Правильная стратегия обновления и проверка жизнеспособности

Некорректные настройки strategy и liveness/readiness проб — путь к сбою во время обновления.

Решение:

  • Используйте RollingUpdate (стандарт) с настроенными maxUnavailable и maxSurge. Это обеспечивает нулевой или минимальный даунтайм.
  • Всегда настраивайте Readiness Probe. Без неё трафик может начать поступать на под, который ещё не готов обрабатывать запросы.
  • Настройте Liveness Probe для перезапуска "зависших" контейнеров, но будьте осторожны — слишком агрессивные настройки могут привести к циклам перезапусков.
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%  # Гарантирует доступность
      maxSurge: 1          # Плавное обновление
  template:
    spec:
      containers:
      - name: app
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 15 # Дайте время приложению запуститься
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /ready
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 5
          failureThreshold: 3

4. Управление образами контейнеров и секретами

  • Использование тега latest — самая опасная практика, лишающая развёртывание предсказуемости. Всегда используйте семантическое версионирование или хэши образов.
  • Хранение секретов в манифесте. Никогда не коммитьте пароли, токены или ключи в Git. Используйте Kubernetes Secrets, а для управления ими — инструменты вроде Helm Secrets, Sealed Secrets (Bitnami) или внешние хранилища (HashiCorp Vault, AWS Secrets Manager). В манифест добавляйте только ссылку.
# Неправильно:
env:
  - name: DB_PASSWORD
    value: "supersecret123"

# Правильно:
env:
  - name: DB_PASSWORD
    valueFrom:
      secretKeyRef:
        name: app-db-secret
        key: password

5. Определение лимитов ресурсов и политик безопасности

Отсутствие resources.requests/limits ведёт к "войне за ресурсы" между подами и нестабильности кластера. Отсутствие securityContext повышает риски уязвимостей.

Решение: Всегда задавайте лимиты и политики безопасности, начиная с разработки.

spec:
  template:
    spec:
      containers:
      - name: app
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
        securityContext:
          allowPrivilegeEscalation: false
          runAsNonRoot: true
          capabilities:
            drop:
              - ALL
          readOnlyRootFilesystem: true

6. Автоматизация и проверка перед применением

Ручное применение через kubectl apply чревато ошибками в выборе контекста кластера или неймспейса.

Решение:

  • Используйте CI/CD для автоматического развёртывания.
  • Перед применением в продакшен используйте предварительные просмотры (preview) в тестовых кластерах или неймспейсах.
  • Используйте kubectl diff перед apply, чтобы увидеть, какие изменения будут внесены.
  • Рассмотрите инструменты GitOps (Flux, ArgoCD), которые автоматически синхронизируют желаемое состояние из Git с кластером.

Заключительный чек-лист перед созданием Deployment

  1. Манифест проверен линтером (kubeval/kube-linter).
  2. Выполнена команда kubectl apply --dry-run=client --validate=true.
  3. Используется конкретный тег образа (не latest).
  4. Настроены readinessProbe и livenessProbe.
  5. Заданы resources.requests и resources.limits.
  6. Настроена стратегия обновления RollingUpdate.
  7. Секреты вынесены в объект Secret.
  8. Задан минимальный securityContext.
  9. Манифест закоммичен в Git.
  10. Развёртывание сначала протестировано в staging-окружении.

Соблюдение этих практик не только минимизирует ошибки при создании Deployment, но и формирует основу для надёжной, безопасной и легко управляемой инфраструктуры в Kubernetes.