0Pricing
Cloud & IT Cert Prep · Урок

Сеть EKS: VPC CNI и балансировка нагрузки

Используйте плагин Amazon VPC CNI, чтобы поды получали собственные IP-адреса VPC, и публикуйте сервисы с помощью AWS Load Balancer Controller.

«Сеть EKS: VPC CNI и балансировка нагрузки» — бесплатный урок Cloud & IT Cert Prep на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Cloud & IT Cert Prep, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Cloud & IT Cert Prep содержит 4 уроков всего.

Основы сетевого взаимодействия Kubernetes

Kubernetes требует, чтобы каждый под имел уникальный маршрутизируемый IP-адрес, а поды могли обмениваться данными друг с другом без NAT. Подключаемый модуль Container Network Interface (CNI) отвечает за назначение IP и настройку сетевых маршрутов на рабочих узлах. На разных платформах Kubernetes используются разные реализации CNI; AWS применяет Amazon VPC CNI plugin, чтобы напрямую интегрировать сетевое взаимодействие Kubernetes с уровнем VPC.

Подключаемый модуль Amazon VPC CNI

Amazon VPC CNI plugin назначает каждому поду IP-адрес непосредственно из диапазона CIDR подсети VPC. Поэтому поды становятся полноценными участниками VPC: к ним могут обращаться другие ресурсы VPC, локальные системы через VPN/Direct Connect и группы безопасности без преобразования в наложенной сети. Каждый рабочий узел EC2 поддерживает пул вторичных приватных IP-адресов (по одному на слот ENI), которые назначаются подам по мере их планирования.

# Check the VPC CNI version installed in your cluster
kubectl describe daemonset aws-node -n kube-system | grep Image

# View the secondary IPs assigned to a node
aws ec2 describe-network-interfaces \
  --filters 'Name=attachment.instance-id,Values=i-0abcdef1234567890' \
  --query 'NetworkInterfaces[].PrivateIpAddresses[].PrivateIpAddress'

Тёплый пул ENI и IP-адресов

Подключаемый модуль VPC CNI поддерживает на каждом узле тёплый пул предварительно выделенных IP-адресов, чтобы ускорить планирование подов. При запуске узла CNI подключает несколько ENI и назначает вторичные IP-адреса в количестве, заданном переменными окружения WARM_IP_TARGET или MINIMUM_IP_TARGET. Поэтому максимальное количество подов, которое может запустить узел, ограничено произведением количества ENI инстанса на числа IP-адресов на ENI; это значение зависит от типа инстанса.

# Check maximum pods supported by an instance type
aws ec2 describe-instance-types \
  --instance-types m5.large \
  --query 'InstanceTypes[].NetworkInfo.{MaxENIs:MaximumNetworkInterfaces,IPv4sPerENI:Ipv4AddressesPerInterface}'

# Max pods formula: (MaxENIs x (IPv4sPerENI - 1)) + 2
# m5.large: 3 ENIs x (10-1) + 2 = 29 pods

Группы безопасности для подов

По умолчанию все поды на узле используют общую группу безопасности узла. Функция Security Groups for Pods позволяет назначать отдельные группы безопасности определённым подам с помощью пользовательского ресурса SecurityGroupPolicy. Это обеспечивает точное управление сетевым доступом — например, только под базы данных сможет получать трафик на порту 5432 из группы безопасности пода API. Для этой функции требуется версия VPC CNI 1.7.7 или более поздняя, а также транзитный ENI на узле.

# Define a SecurityGroupPolicy (custom resource)
apiVersion: vpcresources.k8s.aws/v1beta1
kind: SecurityGroupPolicy
metadata:
  name: db-pod-sg-policy
  namespace: production
spec:
  podSelector:
    matchLabels:
      role: database
  securityGroups:
    groupIds:
    - sg-0db1234567890abcd

Типы сервисов Kubernetes в EKS

Сервисы Kubernetes предоставляют набор подов по стабильному DNS-имени и IP-адресу. В EKS важны три типа сервисов: ClusterIP (только для внутреннего взаимодействия в кластере), NodePort (открывает порт на каждом узле и редко используется в EKS) и LoadBalancer (автоматически подготавливает балансировщик нагрузки AWS). Тип LoadBalancer используется для публикации большинства сервисов EKS в Интернете.

# Expose a deployment with a LoadBalancer service
kubectl expose deployment my-api \
  --type=LoadBalancer \
  --name=my-api-svc \
  --port=80 \
  --target-port=8080

# Check the assigned AWS load balancer hostname
kubectl get svc my-api-svc -o wide

AWS Load Balancer Controller

AWS Load Balancer Controller — это контроллер Kubernetes с открытым исходным кодом, который управляет ресурсами ALB и NLB от имени кластеров EKS. При создании объекта Kubernetes Ingress контроллер подготавливает Application Load Balancer. При создании Service типа LoadBalancer с правильными аннотациями он подготавливает Network Load Balancer. Этот контроллер заменяет устаревший встроенный поставщик балансировщика нагрузки Kubernetes.

# Install AWS Load Balancer Controller with Helm
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
  -n kube-system \
  --set clusterName=my-cluster \
  --set serviceAccount.create=false \
  --set serviceAccount.name=aws-load-balancer-controller \
  --set region=us-east-1 \
  --set vpcId=vpc-0abc1234def567890

Ingress Kubernetes с ALB

Объект Kubernetes Ingress определяет правила маршрутизации HTTP/HTTPS — по пути и по имени узла — в Ваш кластер. AWS Load Balancer Controller считывает объекты Ingress с аннотацией kubernetes.io/ingress.class: alb и создаёт соответствующий Application Load Balancer с подходящими правилами прослушивателей. Это избавляет от необходимости вручную создавать ALB и целевые группы для каждого сервиса приложения.

# Ingress YAML that creates an ALB
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: api-ingress
  namespace: production
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
spec:
  rules:
  - http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: api-svc
            port:
              number: 80

NLB для рабочих нагрузок TCP/UDP

Если рабочей нагрузке требуется TCP или UDP (а не HTTP), например игровому серверу, сервису gRPC или прокси базы данных, используйте NLB вместо ALB. Добавьте к сервису Kubernetes аннотации service.beta.kubernetes.io/aws-load-balancer-type: 'external' и service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: 'ip'. Контроллер подготавливает NLB, в котором IP-адреса подов используются как непосредственные цели, что позволяет обойти перенаправление портов на уровне узлов и снизить задержку.

# Service YAML that creates an NLB with IP targets
apiVersion: v1
kind: Service
metadata:
  name: grpc-svc
  namespace: production
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: 'external'
    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: 'ip'
    service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
spec:
  type: LoadBalancer
  selector:
    app: grpc-server
  ports:
  - port: 50051
    targetPort: 50051
    protocol: TCP

Разрешение DNS внутри кластера

EKS запускает CoreDNS в качестве поставщика DNS кластера. Каждый сервис получает DNS-имя в формате service-name.namespace.svc.cluster.local, которое разрешается в ClusterIP сервиса. Поды также доступны через DNS. CoreDNS развёртывается как Deployment (а не DaemonSet), и количество его реплик следует масштабировать в зависимости от размера кластера. EKS управляет CoreDNS как дополнением, что позволяет автоматически обновлять его версию.

# Verify DNS resolution from within a pod
kubectl run dns-test --image=busybox --rm -it --restart=Never -- \
  nslookup kubernetes.default.svc.cluster.local

# Expected output: Name: kubernetes.default.svc.cluster.local
# Address: 10.100.0.1 (ClusterIP of the kubernetes service)

Сетевые политики в EKS

Объекты Kubernetes NetworkPolicy определяют правила разрешённого трафика между подами и от подов к внешним ресурсам. По умолчанию все поды в кластере могут свободно обмениваться данными. Для реализации сетевого подхода с нулевым доверием можно установить контроллер сетевых политик Amazon VPC CNI (доступен начиная с VPC CNI v1.14). Сетевые политики оцениваются на уровне ядра Linux с использованием eBPF, что обеспечивает высокопроизводительное применение правил без наложенной сети.

# NetworkPolicy: allow traffic to api pods only from frontend pods
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: api-allow-frontend
  namespace: production
spec:
  podSelector:
    matchLabels:
      role: api
  ingress:
  - from:
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 8080

Советы по устранению проблем VPC CNI

К распространённым проблемам сетевого взаимодействия EKS относятся исчерпание IP-адресов (включите делегирование префиксов или добавьте более крупные подсети), зависание подов в состоянии Pending из-за отсутствия доступных вторичных IP-адресов на узле и периодические сбои разрешения DNS, вызванные недостаточным количеством реплик CoreDNS. Используйте kubectl describe pod, чтобы проверить события, kubectl describe node, чтобы просмотреть количество выделенных IP-адресов, и CloudWatch Container Insights, чтобы отслеживать частоту ошибок DNS в кластере.

# Enable prefix delegation to increase pod density per node
kubectl set env daemonset aws-node \
  -n kube-system \
  ENABLE_PREFIX_DELEGATION=true \
  WARM_PREFIX_TARGET=1

# Check current IP usage on a node
kubectl describe node ip-10-0-1-100.ec2.internal | grep -A5 'Allocatable'

Быстрая проверка

Проверьте, насколько хорошо Вы усвоили изложенные в этом уроке концепции AWS Solutions Architect (SAA-C03).

Итоги урока

В этом уроке Вы узнали: подключаемый модуль Amazon VPC CNI назначает каждому поду собственные IP-адреса VPC для бесшовной интеграции с VPC, AWS Load Balancer Controller подготавливает ALB для HTTP Ingress и NLB для сервисов TCP/UDP, а Security Groups for Pods обеспечивают управление сетевым доступом на уровне подов. Далее мы рассмотрим IRSA для привязки IAM-ролей с детально настроенными разрешениями к сервисным аккаунтам Kubernetes.

Часто задаваемые вопросы

Урок «Сеть EKS: VPC CNI и балансировка нагрузки» бесплатный?

Да — полный текст урока «Сеть EKS: VPC CNI и балансировка нагрузки» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Cloud & IT Cert Prep, подпишись на CoddyKit PRO. Курс Cloud & IT Cert Prep содержит 4 уроков всего.

Чему я научусь в уроке «Сеть EKS: VPC CNI и балансировка нагрузки»?

Используйте плагин Amazon VPC CNI, чтобы поды получали собственные IP-адреса VPC, и публикуйте сервисы с помощью AWS Load Balancer Controller. Ты практикуешь Cloud & IT Cert Prep с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Cloud & IT Cert Prep?

Предыдущий опыт не требуется. Cloud & IT Cert Prep на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Сеть EKS: VPC CNI и балансировка нагрузки»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Cloud & IT Cert Prep?

Да. Каждый урок Cloud & IT Cert Prep включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Плоскость управления и рабочие узлы EKS
  2. Профили Fargate для бессерверных подов
  3. Сеть EKS: VPC CNI и балансировка нагрузки
  4. Роли IAM для сервисных аккаунтов (IRSA)
← Назад к Cloud & IT Cert Prep