EKS 네트워킹: VPC CNI 및 로드 밸런싱
Amazon VPC CNI 플러그인을 사용해 파드에 기본 VPC IP 주소를 할당하고, AWS Load Balancer Controller로 서비스를 외부에 노출합니다.
EKS 네트워킹: VPC CNI 및 로드 밸런싱은(는) CoddyKit의 무료 Cloud & IT Cert Prep 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Cloud & IT Cert Prep 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Cloud & IT Cert Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
Kubernetes 네트워킹 기본
Kubernetes에서는 모든 pod가 고유하고 라우팅 가능한 IP 주소를 가져야 하며, NAT 없이 pod끼리 통신할 수 있어야 합니다. Container Network Interface (CNI) 플러그인은 작업자 노드에 IP를 할당하고 네트워크 경로를 구성합니다. Kubernetes 플랫폼마다 사용하는 CNI 구현이 다르며, AWS는 Amazon VPC CNI plugin을 사용해 Kubernetes 네트워킹을 VPC 계층에 직접 통합합니다.
Amazon VPC CNI 플러그인
Amazon VPC CNI plugin은 VPC 서브넷의 CIDR 범위에서 각 pod에 직접 IP 주소를 할당합니다. 따라서 pod는 VPC의 기본 구성원으로 작동하며, 다른 VPC 리소스와 VPN/Direct Connect를 통한 온프레미스 시스템에서 접근할 수 있고, 오버레이 네트워크 변환 없이 보안 그룹을 적용할 수 있습니다. 각 EC2 작업자 노드는 ENI 슬롯마다 하나씩 할당되는 보조 프라이빗 IP 풀을 유지하며, pod가 스케줄링될 때 이 IP를 할당합니다.
# 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 플러그인은 빠른 pod 스케줄링을 위해 각 노드에 미리 할당된 IP 주소의 웜 풀을 유지합니다. 노드가 시작되면 CNI가 여러 ENI를 연결하고 WARM_IP_TARGET 또는 MINIMUM_IP_TARGET 환경 변수에 지정된 수까지 보조 IP를 할당합니다. 따라서 노드가 실행할 수 있는 최대 pod 수는 인스턴스의 ENI 수에 ENI당 IP 수를 곱한 값으로 제한되며, 이 값은 인스턴스 유형에 따라 달라집니다.
# 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 podsPod용 보안 그룹
기본적으로 노드의 모든 pod는 해당 노드의 보안 그룹을 공유합니다. Security Groups for Pods 기능을 사용하면 SecurityGroupPolicy 사용자 지정 리소스로 특정 pod에 개별 보안 그룹을 할당할 수 있습니다. 이를 통해 네트워크 액세스를 세밀하게 제어할 수 있습니다. 예를 들어 데이터베이스 pod만 API pod의 보안 그룹에서 포트 5432로 들어오는 트래픽을 수신하도록 설정할 수 있습니다. 이 기능을 사용하려면 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-0db1234567890abcdEKS의 Kubernetes Service 유형
Kubernetes Services는 안정적인 DNS 이름과 IP 아래에 여러 pod를 노출합니다. EKS에서 관련성이 높은 세 가지 서비스 유형은 다음과 같습니다. ClusterIP(클러스터 내부 통신만 허용), NodePort(모든 노드에서 포트를 열며 EKS에서는 거의 사용하지 않음), LoadBalancer(AWS 로드 밸런서를 자동으로 프로비저닝)입니다. 인터넷에 연결되는 대부분의 EKS 서비스는 LoadBalancer 유형으로 노출합니다.
# 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는 EKS 클러스터를 대신해 ALB 및 NLB 리소스를 관리하는 오픈 소스 Kubernetes Controller입니다. Kubernetes Ingress 객체를 생성하면 Controller가 Application Load Balancer를 프로비저닝합니다. 올바른 주석과 함께 LoadBalancer 유형의 Service를 생성하면 Network Load Balancer를 프로비저닝합니다. 이 Controller는 기존의 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-0abc1234def567890ALB를 사용하는 Kubernetes Ingress
Kubernetes Ingress 객체는 클러스터로 들어오는 HTTP/HTTPS 라우팅 규칙을 정의하며, 경로 기반 및 호스트 기반 라우팅을 모두 지원합니다. AWS Load Balancer Controller는 kubernetes.io/ingress.class: alb 주석이 있는 Ingress 객체를 읽고, 일치하는 리스너 규칙을 포함한 해당 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: 80TCP/UDP 워크로드를 위한 NLB
게임 서버, gRPC 서비스 또는 데이터베이스 프록시처럼 워크로드에 TCP 또는 UDP(HTTP가 아님)가 필요한 경우 ALB 대신 NLB를 사용합니다. Kubernetes Service에 service.beta.kubernetes.io/aws-load-balancer-type: 'external' 및 service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: 'ip'를 주석으로 추가합니다. Controller는 pod IP를 직접 대상으로 사용하는 NLB를 프로비저닝하므로 노드 수준의 포트 전달을 거치지 않아 지연 시간이 줄어듭니다.
# 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는 클러스터 DNS 공급자로 CoreDNS를 실행합니다. 모든 서비스에는 service-name.namespace.svc.cluster.local 형식의 DNS 이름이 부여되며, 이 이름은 서비스의 ClusterIP로 확인됩니다. pod도 DNS를 통해 검색할 수 있습니다. CoreDNS는 DaemonSet이 아닌 Deployment로 배포되며, 복제본 수는 클러스터 크기에 따라 조정해야 합니다. 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 객체는 pod 간 트래픽과 pod에서 외부로 나가는 트래픽에 대한 허용 규칙을 정의합니다. 기본적으로 클러스터의 모든 pod는 자유롭게 통신할 수 있습니다. 제로 트러스트 네트워킹을 적용하려면 Amazon VPC CNI network policy controller를 설치할 수 있습니다(VPC CNI v1.14부터 사용 가능). 네트워크 정책은 eBPF를 사용해 Linux 커널 수준에서 평가되므로 오버레이 네트워크 없이도 높은 성능으로 적용할 수 있습니다.
# 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: 8080VPC CNI 문제 해결 팁
일반적인 EKS 네트워킹 문제로는 IP 주소 고갈(prefix delegation을 활성화하거나 더 큰 서브넷을 추가하여 해결), 노드에 사용 가능한 보조 IP가 없어 pod가 Pending 상태에 멈추는 문제, CoreDNS 복제본 부족으로 발생하는 간헐적인 DNS 확인 실패가 있습니다. 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 plugin은 모든 pod에 기본 VPC IP를 할당하여 VPC에 원활하게 통합하고, AWS Load Balancer Controller는 HTTP Ingress에 ALB를, TCP/UDP Service에 NLB를 프로비저닝합니다. 또한 Security Groups for Pods를 사용하면 pod 수준에서 네트워크 액세스를 제어할 수 있습니다. 다음으로 Kubernetes service account에 세밀한 IAM 역할을 연결하는 IRSA를 살펴보겠습니다.
자주 묻는 질문
“EKS 네트워킹: VPC CNI 및 로드 밸런싱” 강의는 무료인가요?
네 — “EKS 네트워킹: VPC CNI 및 로드 밸런싱” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Cloud & IT Cert Prep 강의 전체를 잠금 해제할 수 있습니다. Cloud & IT Cert Prep 강의에는 총 4개의 강의가 포함되어 있습니다.
“EKS 네트워킹: VPC CNI 및 로드 밸런싱”에서 뭘 배우나요?
Amazon VPC CNI 플러그인을 사용해 파드에 기본 VPC IP 주소를 할당하고, AWS Load Balancer Controller로 서비스를 외부에 노출합니다. 브라우저에서 직접 실행하는 실습 코드로 Cloud & IT Cert Prep을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Cloud & IT Cert Prep을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Cloud & IT Cert Prep은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“EKS 네트워킹: VPC CNI 및 로드 밸런싱” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Cloud & IT Cert Prep 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Cloud & IT Cert Prep 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- EKS 컨트롤 플레인 및 워커 노드
- 서버리스 파드를 위한 Fargate 프로필
- EKS 네트워킹: VPC CNI 및 로드 밸런싱
- 서비스 계정을 위한 IAM 역할(IRSA)