Ответ
Мой стек инструментов для управления жизненным циклом 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 на созданных инстансах