Что вы будете использовать для развертывания и управления ванильным Kubernetes в облаке и на bare metal?

«Что вы будете использовать для развертывания и управления ванильным Kubernetes в облаке и на bare metal?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Мой стек инструментов для управления жизненным циклом Kubernetes-кластера (от provisioning до day-2 operations) выглядит так:

1. Provisioning и установка (Day-0/Day-1):

  • Облако (AWS/GCP/Azure): Использую инфраструктуру как код (IaC). Для AWS это будет Terraform с модулем terraform-aws-modules/eks/aws для EKS или набором модулей для создания self-managed кластера на EC2.
  • Bare metal / On-premise: Для автоматизации установки на физические серверы или VM предпочитаю Kubespray (Ansible-based). Он хорошо поддерживает различные CNI, инвентаризацию и параметры кластера.

2. Конфигурация и управление приложениями (Day-2):

  • Helm: Стандарт для упаковки и развертывания приложений. Все внутренние сервисы упакованы в Helm-чарты.
  • GitOps: Для непрерывного развертывания и дрейфа конфигурации использую ArgoCD. Он синхронизирует состояние кластера с декларативными манифестами в Git-репозитории.

3. Сетевая инфраструктура:

  • Облако: Нативные Load Balancer сервисы (AWS ALB/NLB, GCP Cloud Load Balancing) через соответствующие контроллеры ingress (aws-load-balancer-controller, ingress-nginx).
  • Bare metal: MetalLB в режиме BGP или L2 для предоставления внешних IP-адресов сервисам типа LoadBalancer.

4. Мониторинг и логирование:

  • Prometheus Stack (kube-prometheus-stack): Для сбора метрик кластера и приложений, алертинга.
  • Grafana: Визуализация дашбордов.
  • Loki + Promtail: Для централизованного сбора и агрегации логов.

Пример Terraform для запуска self-managed кластера на AWS:

# Создание мастер-нод и worker-нод
resource "aws_instance" "k8s_master" {
  count         = 3
  ami           = data.aws_ami.ubuntu.id
  instance_type = "t3.medium"
  subnet_id     = aws_subnet.private[count.index % length(aws_subnet.private)].id
  user_data     = templatefile("${path.module}/templates/master-setup.sh", {
    cluster_name = var.cluster_name
  })
  tags = {
    Name = "${var.cluster_name}-master-${count.index}"
    Role = "master"
  }
}
# Далее - запуск Kubespray через Ansible на созданных инстансах