Олег Марков
Работа с cloud-платформами в Kubernetes
Введение
Сегодня Kubernetes стал стандартом для оркестрации контейнерных приложений на крупных инфраструктурах. Одна из главных причин его востребованности — гибкость работы с облачными средами. Kubernetes поддерживает множество cloud-платформ: AWS, Google Cloud, Microsoft Azure и другие. Благодаря встроенным инструментам и расширениям, вы можете запускать свои кластеры в облаке, управлять ресурсами, автоматически масштабировать сервисы и интегрировать внешние хранилища, балансировщики и сетевые решения практически из любого облака.
В этой статье я помогу разобраться, как Kubernetes взаимодействует с облачными платформами, как настроить автоматизацию работы с ресурсами и какие сценарии применимы для разных типов облака. Давайте погрузимся в детали и рассмотрим практические примеры.
Основные возможности Kubernetes для работы с облачными платформами
Kubernetes «понимает» облачные ресурсы через контроллеры, плагины и облачные абстракции, называемые Cloud Controller Manager (CCM). Давайте пошагово разберемся, что это за механизмы, зачем они нужны и как с ними работать.
Что такое Cloud Controller Manager (CCM)
Cloud Controller Manager — это отдельный компонент Kubernetes, который обеспечивает интеграцию ядра Kubernetes с API облачной платформы. Его задача — создавать и управлять объектами облака (например, виртуальными машинами, хранилищами, балансировщиками), опираясь на команды из кластера и описание ресурсов в манифестах.
Когда вы используете облачный Kubernetes, CCM обычно запускается в составе control plane и разделяет логику управления облачными ресурсами и внутреннюю логику самого Kubernetes.
А вот так выглядит базовый процесс работы:
- Вы описываете нужный сервис или хранилище в манифесте.
- CCM берет это описание и создает соответствующий ресурс в облаке (например, Elastic IP, Load Balancer, Persistent Disk).
- Kubernetes связывает облачный ресурс с внутренним объектом (Pod, Service, PVC).
Пример: создание LoadBalancer в облачных сервисах
Смотрите — при таком сервисе Kubernetes автоматически создает внешний балансировщик в облаке (если вы находитесь, например, в AWS):
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: LoadBalancer # Этот тип — сигнал CCM создать облачный балансировщик
ports:
- port: 80
targetPort: 8080
selector:
app: my-app
В комментариях я пояснил, что означает строка с типом сервиса. Если вы примените такой манифест в облачном кластере (например, в GKE или EKS), CCM сам запросит создание внешнего Cloud Load Balancer и настроит маршрутизацию трафика на ваши pod'ы.
Поддерживаемые облачные платформы
Экосистема Kubernetes постоянно расширяется. Вот основные cloud-платформы, для которых реализована поддержка через CCM и дополнительные плагины:
- Amazon Web Services (AWS):
- EKS (Elastic Kubernetes Service)
- Собственный кластер на EC2, интеграция с ELB, EBS и IAM через AWS Cloud Provider.
- Google Cloud Platform (GCP):
- GKE (Google Kubernetes Engine)
- Автоматическая интеграция с GCLB, Persistent Disk и Cloud IAM.
- Microsoft Azure:
- AKS (Azure Kubernetes Service)
- Интеграция с Azure Load Balancer, Managed Disk, VNet.
- DigitalOcean, Alibaba Cloud, Yandex Cloud, OpenStack и другие.
Для каждой платформы есть свои плагины, настройка CCM и документация. В большинстве управляемых сервисов (например, EKS, GKE, AKS) эти механизмы уже предустановлены и требуют минимальных ручных настроек.
Интеграция хранилищ (Persistent Volume)
В облаках Kubernetes может динамически заказывать и подключать внешние диски как хранилище для pod’ов. Обратите внимание — команда на создание хранилища также проходит через cloud-контроллер.
Пример создания Persistent Volume Claim:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: standard # Имя StorageClass — абстракция над облачным storage
resources:
requests:
storage: 10Gi
В данном примере storageClassName
определяет тип облачного хранилища, который заказан у cloud-платформы. В GCP это будет pd-standard
(Persistent Disk), в AWS — gp2
(General Purpose SSD), в Azure — аналогичный managed диск.
Кластер автоматически создает диск, подключает его к ноде, где запущен pod, и обеспечивает работу с этим Persistent Volume на уровне файловой системы.
Работа с облачными балансировщиками и сетями
Kubernetes позволяет автоматически создавать внешние балансировщики нагрузки для экспонирования сервисов. Типичный способ — задействовать Service с типом LoadBalancer
.
Схема работы с LoadBalancer:
- Кластер отправляет запрос на создание балансировщика в облаке.
- Все трафик, поступающий на внешний IP-адрес, маршрутизируется в Service, затем по pod’ам текущего deployment'а.
- Вы можете динамически указывать порты, annotation для дополнительной настройки балансировщика.
Пример расширенной настройки AWS ELB:
apiVersion: v1
kind: Service
metadata:
name: web-service
annotations:
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http # Задаем протокол для backend
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:us-west-2:123456789012:certificate/xxxxxx # Применяем SSL сертификат из ACM
spec:
type: LoadBalancer
ports:
- port: 443
targetPort: 8080
protocol: TCP
selector:
app: web-app
Как видите — благодаря annotation управляете деталями создания ресурса в облаке (в данном случае, привязываем SSL сертификат для HTTPS подключения к вашему приложению).
Интеграция с облачными identity-провайдерами (IAM, Service Accounts)
Важная часть управления — безопасность доступа приложений к облачным ресурсам. В каждом облаке есть свой модели Identity and Access Management (IAM), и Kubernetes поддерживает работу с ними через Service Accounts, RoleBindings и внешние identity-плагины.
Пример для AWS EKS:
- Вы создаёте IAM Role с нужными правами.
- Привязываете эту роль к сервисному аккаунту Kubernetes через
eks.amazonaws.com/role-arn
annotation. - Приложения, запущенные с этим аккаунтом, получают права в AWS строго по IAM-роли.
Пример описания ServiceAccount с привязкой IAM роли в EKS:
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-app-sa
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/MyAppK8sRole # Привязка IAM роли к сервисному аккаунту
Это безопасный способ передачи облачных credentials, потому что права ограничиваются ролью, а ключи не попадают в контейнер.
Автоматическое масштабирование ресурсов в облаке
Одно из преимуществ Kubernetes — автоматизация масштабирования не только подов, но и инфраструктурных ресурсов в облаке. Есть два ключевых инструмента:
- Cluster Autoscaler — увеличивает или уменьшает количество cloud-инстансов (нод) при изменении нагрузки.
- Horizontal Pod Autoscaler — масштабирует непосредственно поды (ноты) на уровне кластера.
Cluster Autoscaler в облаках
Cluster Autoscaler автоматически следит за нагрузкой и при необходимости запрашивает создание или удаление виртуальных машин в облаке.
Пример запуска Cluster Autoscaler в AWS:
# Добавляется в манифест или Helm values cluster-autoscaler-а
autoDiscovery:
clusterName: my-eks-cluster # Имя кластера
awsRegion: us-west-2 # Регион AWS
В управляемом кластере обычно достаточно включить autoscaling в панели облака.
Horizontal Pod Autoscaler
Пример автоскейлинга подов по метрике CPU:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: my-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
Как видно, настройка полностью независима от облачной платформы — Kubernetes сам масштабирует deployment по загрузке CPU.
Использование managed Kubernetes сервисов в облаках
Практически все популярные облачные провайдеры предлагают собственные управляемые сервисы Kubernetes:
- AWS Elastic Kubernetes Service (EKS)
- Google Kubernetes Engine (GKE)
- Azure Kubernetes Service (AKS)
- Yandex Managed Service for Kubernetes
- IBM Cloud Kubernetes Service и другие
Преимущество managed-сервисов — вы не управляете вручную ядром Kubernetes и его обновлением, это берет на себя провайдер. Также у вас есть интеграция со всеми сервисами облака, мониторинг состояния, простая настройка скейлинга.
Давайте посмотрим на ключевые аспекты, где managed Kubernetes помогает упростить работу:
- Простота запуска/обновления кластера: создание через пару команд или через веб-интерфейс облака.
- Автоматический patching и обновления планов управления (control plane).
- Готовые интеграции с большинством облачных сервисов: авто-подключение к сетям, Secure Vault, дискам, cloud-logging и др.
- Мониторинг и алертинг на уровне платформы.
Пример запуска кластера через AWS CLI:
aws eks create-cluster \
--name my-eks-cluster \
--region us-west-2 \
--role-arn arn-aws-iam-123456789012-role-EKSClusterRole \
--resources-vpc-config subnetIds=subnet-xxxx,subnet-yyyy,securityGroupIds=sg-zzzz
Замените значения на свои — машина будет создана, и весь набор сервисов будет готов к подключению облачных ресурсов из Kubernetes.
Использование кастомных решений и Cloud Native интерфейсов
Kubernetes активно поддерживает расширения через CSI (Container Storage Interface), CNI (Container Network Interface) и другие плагины. Это позволяет использовать нестандартные диски, специальные сети или даже приватные облака.
Пример работы с CSI драйвером (Yandex Cloud):
Yandex Cloud предлагает свой CSI-драйвер для работы с облачными дисками. Пример настройки PVC:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: yc-disk-pvc
spec:
accessModes:
- ReadWriteOnce
storageClassName: yc-network-hdd # Имя StorageClass для облачного диска Yandex Cloud
resources:
requests:
storage: 20Gi
CSI-драйвер автоматически создаст и подключит диск в вашей облачной инфраструктуре для хранения данных pod'а. Так же работают и другие драйверы для облаков.
Заключение
Интеграция Kubernetes с облачными платформами давно стала стандартом индустрии. Вы можете запускать гибкие, масштабируемые приложения, используя все возможности облака — от динамического заказа ресурсов до автоматического управления доступом и мониторингом. В большинстве случаев взаимодействие кластера с облаком выглядит как набор декларативных yaml-манифестов, понимаемых облачным контроллером и реализуемых через API платформы.
Используйте возможности хранилищ, балансировщиков, IAM и сервисных аккаунтов, автоматического скейлинга, чтобы приложения работали устойчиво, быстро и с разумной стоимостью. Kubernetes не ограничивает выбор облака — в вашем распоряжении практически любая платформа и множество дополнительных плагинов (CSI, CNI, cloud-controller).
Для успешной эксплуатации важно хорошо понимать, как устроено облако и как Kubernetes «общается» с его API. Это позволит быстро решать задачи создания инфраструктуры, масштабирования и интеграции облачных ресурсов без рутины.
Частозадаваемые технические вопросы по теме статьи и ответы на них
Как мне настроить приватный (Internal) LoadBalancer в облаке для Kubernetes?
В большинстве облаков (AWS, GCP, Azure) для этого достаточно добавить нужную аннотацию в описание сервиса. Например, для AWS используйте:
metadata:
annotations:
service.beta.kubernetes.io/aws-load-balancer-internal: "true"
Для GCP используйте:
yaml
metadata:
annotations:
cloud.google.com/load-balancer-type: "Internal"
После применения такой конфигурации балансировщик будет доступен только внутри VPC.
Как ограничить права контейнера при доступе к облачным сервисам?
Создайте отдельную IAM роль (AWS), Service Account (GCP, Azure), выдайте только необходимые разрешения и привяжите к pod через annotation в сервисном аккаунте. Пример для EKS приведён выше в статье.
Как включить и настроить Cluster Autoscaler для своего облачного кластера?
Для managed Kubernetes сервисов обычно достаточно активировать скейлинг группы в панели управления. Если разворачиваете кастомный кластер — установите cluster-autoscaler через Helm или manifests, обязательно проверьте IAM/ServiceAccount права, чтобы компонент мог создавать/удалять инстансы в облаке.
Как работать с Multi-Zone/Multi-Region кластерами в облаке?
При создании managed кластера указывается список zon/subnet, где запускаются ноды. Kubernetes многозонные возможности (anti-affinity, toleration, zone selectors) позволяют разместить поды в нужных зонах, а балансировщик облака обеспечивает routing трафика по Availability Zones.
Где посмотреть события или логи взаимодействия Kubernetes с облаком?
Если возникает проблема при создании CloudResource (например, LoadBalancer или Volume не создаётся), проверьте:
- Логи pod cloud-controller-manager в namespace kube-system.
- Описания объекта через kubectl describe resource_name.
- Мониторинг/логи в панели cloud-платформы (например, AWS CloudWatch или GCP Operations).
- Доступность и правильность credentials у CCM/Node.
Это поможет выявить ошибки авторизации или конфигурации.
Постройте личный план изучения Kubernetes до уровня Middle — бесплатно!
Kubernetes — часть карты развития DevOps
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Бесплатные лекции
Все гайды по Kubernetes
Лучшие курсы по теме

Kubernetes и Helm
Антон Ларичев
Docker и Ansible
Антон Ларичев