Какой у вас опыт работы с Docker, Ansible и Kubernetes?

«Какой у вас опыт работы с Docker, Ansible и Kubernetes?» — вопрос из категории Архитектура и DevOps-практики, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Мой опыт охватывает полный цикл контейнеризации, оркестрации и инфраструктурной автоматизации.

Docker (3+ года):

  • Создание эффективных и безопасных Dockerfile с многоэтапными сборками, минимизацией слоев и использованием non-root пользователей.
  • Управление образами: версионирование, сканирование на уязвимости (Trivy), хранение в приватных реестрах (ECR, Harbor).
  • Локальная разработка и тестирование с docker-compose для поднятия стека приложений (app + DB + cache).

Пример Dockerfile для Python-приложения:

FROM python:3.11-slim as builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user --no-cache-dir -r requirements.txt

FROM python:3.11-slim
WORKDIR /app
COPY --from=builder /root/.local /root/.local
COPY . .
ENV PATH=/root/.local/bin:$PATH
USER 1001
CMD ["gunicorn", "app:app", "-b", "0.0.0.0:8000"]

Ansible:

  • Автоматизация базовой настройки облачных инстансов (AWS EC2, GCP VMs): установка пакетов, настройка пользователей, конфигурация системных сервисов (nginx, node_exporter).
  • Создание переиспользуемых ролей для стандартных задач (например, common, docker, k8s-node).
  • Использование динамического инвентаря для AWS (aws_ec2 plugin).

Kubernetes (2+ года):

  • Развертывание и поддержка self-managed кластеров (с помощью kubeadm) и работа с managed-сервисами (EKS, GKE).
  • Упаковка приложений в Helm-чарты с параметризацией для разных окружений (dev/stage/prod).
  • Настройка Ingress (nginx-ingress, ALB Controller), ConfigMaps, Secrets (часто с внешним хранилищем типа HashiCorp Vault).
  • Реализация автоматического масштабирования: Horizontal Pod Autoscaler на основе CPU/памяти и кастомных метрик из Prometheus.
  • Мониторинг стека: Prometheus Operator, Grafana, Loki для логов.

Пример манифеста Deployment с readiness/liveness пробами:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: api
  template:
    metadata:
      labels:
        app: api
    spec:
      containers:
      - name: api
        image: my-registry/api:v1.2.3
        ports:
        - containerPort: 8080
        readinessProbe:
          httpGet:
            path: /health/ready
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 10
        livenessProbe:
          httpGet:
            path: /health/live
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 30
        resources:
          requests:
            memory: "256Mi"
            cpu: "100m"
          limits:
            memory: "512Mi"
            cpu: "500m"