Сеть 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 wideAWS 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-0abc1234def567890Ingress 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: 80NLB для рабочих нагрузок 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 — локальная установка не требуется.
Все уроки этого курса
- Плоскость управления и рабочие узлы EKS
- Профили Fargate для бессерверных подов
- Сеть EKS: VPC CNI и балансировка нагрузки
- Роли IAM для сервисных аккаунтов (IRSA)