이 글은 CloudNet@팀의 AWS EKS Workshop Study(AEWS) 3기 스터디 내용을 바탕으로 작성되었습니다.
AEWS는 CloudNet@의 '가시다'님께서 진행하는 스터디로, EKS를 학습하는 과정입니다.
EKS를 깊이 있게 이해할 기회를 주시고, 소중한 지식을 나눠주시는 가시다님께 다시 한번 감사드립니다.
이 글이 EKS를 학습하는 분들께 도움이 되길 바랍니다.
Amazon Elastic Kubernetes Service(EKS)는 '완전 관리형 Kubernetes 서비스'로, 사용자가 Kubernetes 컨트롤 플레인(Control Plane)과 노드(Nodes)를 직접 설치, 운영 및 유지보수할 필요 없이 Kubernetes 클러스터를 실행할 수 있도록 지원합니다.
EKS는 기본적으로 AWS의 인프라 위에서 실행되며, AWS 서비스와 긴밀하게 통합됩니다.
✔ 고가용성(High Availability)
Amazon EKS는 여러 AWS 가용 영역에 걸쳐 컨트롤 플레인을 자동으로 배포하고 크기를 조정하여 높은 가용성을 보장합니다.
컨트롤 플레인은 인스턴스의 크기를 자동으로 조정하고, 비정상적인 컨트롤 플레인 인스턴스를 감지하여 교체합니다.
버전 업데이트 및 패치 관리 자동화를 지원하여 Kubernetes 클러스터 유지보수를 간소화합니다.
✔ AWS 서비스와 긴밀한 통합
Amazon EKS는 다양한 AWS 서비스와 기본적으로 통합되며, 이를 통해 보다 효율적인 클러스터 운영이 가능합니다.
✔ Kubernetes 생태계와의 호환성
Amazon EKS는 오픈 소스 Kubernetes의 최신 버전을 실행하므로, Kubernetes 커뮤니티에서 사용되는 모든 기존 플러그인과 도구를 그대로 활용할 수 있습니다.
표준 Kubernetes 애플리케이션을 코드 수정 없이 EKS로 쉽게 마이그레이션할 수 있습니다.
✔ 보안 및 규정 준수
Amazon EKS는 AWS Fargate(서버리스 컴퓨팅 옵션)와 통합되어 서버리스 Kubernetes 클러스터를 운영할 수 있습니다.
AWS PrivateLink를 사용하여 VPC 내부에서 완전한 네트워크 격리 환경을 유지할 수 있습니다.
EKS는 보안 및 규정 준수를 준수하는 기업 환경에 적합합니다.
✔ 자동 확장(Autoscaling) 기능
Kubernetes의 Cluster Autoscaler를 지원하여 노드 풀을 자동으로 확장/축소할 수 있습니다.
Horizontal Pod Autoscaler(HPA) 및 Vertical Pod Autoscaler(VPA)와 연동하여 워크로드에 따라 리소스를 동적으로 조정할 수 있습니다.
✔ 하이브리드 및 멀티클라우드 지원
AWS 외부에서도 Kubernetes 클러스터를 실행할 수 있도록 Amazon EKS Anywhere를 지원합니다.
AWS Outposts와 연동하여 온프레미스 환경에서도 EKS를 활용할 수 있습니다.
💡 Amazon EKS는 크게 두 부분으로 구성됩니다:
✔ 컨트롤 플레인(Control Plane) → AWS가 완전히 관리
✔ 데이터 플레인(Data Plane, Worker Nodes) → 사용자가 직접 관리
💡 클러스터의 네트워크 통신 방식은 EKS Cluster Endpoint 설정에 따라 달라집니다:
✔ Public
✔ Public & Private
✔ Private
이제 각 요소를 자세히 살펴보겠습니다.
✅ 역할: Kubernetes 클러스터의 핵심 컴포넌트를 관리하며, 클러스터 전체를 조율하는 역할을 함
✅ 특징: AWS에서 완전 관리되며, 여러 가용 영역에 걸쳐 자동으로 배포되어 고가용성 보장

🛠 구성 요소
| 구성 요소 | 설명 |
|---|---|
| API 서버 (kube-apiserver) | Kubernetes의 중앙 허브 역할을 하며, 클러스터의 모든 요청을 받아들이고, 인증 및 유효성 검사를 수행하며 다른 컨트롤 플레인 컴포넌트와 통신 |
| 컨트롤러 매니저 (kube-controller-manager) | 클러스터의 상태를 모니터링하고, 여러 개의 컨트롤러(노드 컨트롤러, 레플리케이션 컨트롤러 등)를 실행하며, 클러스터의 원하는 상태가 유지되도록 자동 조정 |
| 스케줄러 (kube-scheduler) | 새로운 Pod가 생성될 때 적절한 워커 노드에 배치 |
| etcd | 클러스터의 모든 상태 정보를 저장하는 분산 키-값 저장소 |
| 클라우드 컨트롤러 매니저 (cloud-controller-manager) | AWS와 같은 클라우드 공급자와의 통합을 관리하여, 로드 밸런서 생성, 노드 정보 동기화 등의 기능 수행 |
🔹 특이점:
✔ EKS의 컨트롤 플레인은 여러 가용 영역에 자동으로 배포되어 고가용성(HA)를 보장
✔ 사용자는 직접 관리할 필요 없이 AWS에서 자동으로 패치 및 업그레이드를 제공
✔ 클라우드 컨트롤러 매니저가 존재하여 AWS와 Kubernetes 리소스 간 연동을 담당
✅ 역할: 실제 컨테이너(Pods)가 실행되는 노드(서버)
✅ 특징: 사용자가 직접 관리해야 하며, EC2 인스턴스, AWS Fargate, EKS Auto Mode, Hybrid Nodes에서 실행 가능

🛠 구성 요소
| 구성 요소 | 설명 |
|---|---|
| 워커 노드 (Worker Nodes) | 애플리케이션을 실행하는 물리적/가상 서버 (EC2, Fargate) |
| Kubelet | 각 노드에서 실행되는 에이전트로, API 서버와 통신하며 Pod의 상태를 모니터링 및 관리 |
| 컨테이너 런타임 (Container Runtime) | 컨테이너 실행 환경 (containerd, CRI-O 등. Docker는 공식적으로 deprecated됨) |
| CNI(Container Network Interface) | Pod 간 네트워크 연결을 담당, AWS의 VPC CNI를 기본 제공 |
| kube-proxy | 클러스터 내 네트워크 트래픽을 관리하며, Kubernetes 서비스 간 통신을 위한 프록시 역할 수행 (iptables 또는 IPVS 기반) |
🔹 특이점:
✔ 사용자는 EC2 인스턴스 기반 노드 그룹 또는 Fargate 기반 서버리스 노드 중 선택 가능
✔ Cluster Autoscaler 및 Karpenter를 사용하여 노드 자동 확장 가능
✔ 각 워커 노드는 Kubelet을 통해 API 서버와 지속적으로 통신하며, Pod 상태를 관리
✔ kube-proxy가 각 노드에서 실행되어 서비스 트래픽을 적절히 분배
✔ 노드 로컬 컴포넌트(예: kube-proxy, 로깅 에이전트)가 추가적으로 실행될 수 있음
📌 EKS 데이터 플레인 운영 방식
| 운영 방식 | 설명 |
|---|---|
| Managed Node Groups | AWS에서 관리하는 최신 EKS Optimized AMI를 사용하는 노드 그룹. AWS가 노드 패치 및 업그레이드를 자동 수행 |
| Self-Managed Nodes | 사용자가 직접 커스텀 AMI를 사용하고, Auto Scaling Group(ASG)을 관리하며, OS 패치를 직접 수행 |
| AWS Fargate (서버리스) | 사용자가 노드를 직접 운영하지 않고, AWS가 Pod 단위의 Micro VM을 제공하는 서버리스 실행 환경 |
| EKS Hybrid Nodes | 온프레미스 및 엣지 인프라를 Amazon EKS 클러스터의 노드로 활용할 수 있도록 지원하는 기능 |
| EKS Auto Mode | AWS가 컨트롤 플레인뿐만 아니라 데이터 플레인까지 자동 관리하는 완전 관리형 EKS 모델 |
| Karpenter | Kubernetes 클러스터의 유연한 자동 확장 기능을 제공하며, 애플리케이션 부하에 따라 최적화된 인프라를 동적으로 프로비저닝 |
EKS 클러스터의 엔드포인트 설정은 Public, Public-Private, Private 세 가지 모드로 나뉘며,
각 설정은 EKS Owned ENI, Internet Gateway, Public/Private Hosted Zone, VPC Endpoint 등과 함께 동작 방식이 다릅니다.


📌 특징
✅ 클러스터의 제어부(Control Plane)는 퍼블릭 도메인을 통해 접근 가능
✅ EKS Owned ENI를 통해 워커 노드와 제어부 간 통신 수행
✅ 워커 노드는 퍼블릭 도메인을 통해 API 서버에 접근 가능
✅ kubectl 등의 클라이언트도 퍼블릭 도메인을 통해 접근 가능
📌 네트워크 구성
| 컴포넌트 | 통신 방식 |
|---|---|
| 제어부(Control Plane) → 워커 노드 Kubelet | EKS Owned ENI (AWS 내부 ENI) |
| 워커 노드 → 제어부(Control Plane) | 퍼블릭 도메인 (AWS 제공 API 서버 도메인) |
| 사용자(kubectl 등) → 제어부(Control Plane) | 퍼블릭 도메인 (AWS 제공 API 서버 도메인) |
📌 연계된 네트워크 리소스
✔ EKS Owned ENI → 컨트롤 플레인과 워커 노드 간 내부 통신 담당
✔ Internet Gateway (IGW) → 퍼블릭 도메인을 통한 API 서버 접근을 가능하게 함
✔ Public Hosted Zone → API 서버의 퍼블릭 엔드포인트를 제공
📌 장점
설정이 간단하며, 인터넷을 통해 어디서든 API 서버에 접근 가능
kubectl 사용이 쉬움 (추가적인 네트워크 설정 없이 접근 가능)
📌 단점
보안 리스크 존재 (공격자가 퍼블릭 엔드포인트를 통해 접근 가능)
제어부 접근이 인터넷 의존적 (VPC 내부 전용 통신이 불가능)


📌 특징
✅ 클러스터 제어부는 퍼블릭 + 프라이빗 도메인을 동시에 사용
✅ EKS Owned ENI를 통해 워커 노드와 제어부 간 통신 수행
✅ 워커 노드는 퍼블릭 도메인이 아닌 프라이빗 도메인(EKS Owned ENI)을 통해 API 서버에 접근
✅ kubectl 클라이언트는 여전히 퍼블릭 도메인 사용 가능
📌 네트워크 구성
| 컴포넌트 | 통신 방식 |
|---|---|
| 제어부(Control Plane) → 워커 노드 Kubelet | EKS Owned ENI (AWS 내부 ENI) |
| 워커 노드 → 제어부(Control Plane) | 프라이빗 도메인(EKS Owned ENI) |
| 사용자(kubectl 등) → 제어부(Control Plane) | 퍼블릭 도메인 (AWS 제공 API 서버 도메인) |
📌 연계된 네트워크 리소스
✔ EKS Owned ENI → 컨트롤 플레인과 워커 노드 간 내부 통신 담당
✔ Internet Gateway (IGW) → kubectl의 퍼블릭 엔드포인트 접근을 가능하게 함
✔ Public Hosted Zone → 사용자(kubectl)에서 퍼블릭 도메인으로 API 서버에 접근 가능하도록 설정
✔ Private Hosted Zone → 내부 워커 노드가 API 서버에 프라이빗 도메인으로 접근 가능하도록 설정
📌 장점
워커 노드의 API 서버 접근이 프라이빗 네트워크에서만 이루어짐 → 보안 강화
kubectl은 여전히 퍼블릭 도메인을 사용 가능하므로 접근이 편리함
📌 단점
퍼블릭 엔드포인트가 그대로 존재하므로, 보안상 공격 가능성이 있음


📌 특징
✅ 클러스터 제어부는 오직 프라이빗 도메인에서만 접근 가능
✅ EKS Owned ENI를 통해 워커 노드와 제어부 간 통신 수행
✅ kubectl도 퍼블릭 도메인을 사용할 수 없으며, VPC 내에서만 API 서버 접근 가능
✅ 외부에서 접근하려면 VPN, AWS Direct Connect, Bastion Host 필요
📌 네트워크 구성
| 컴포넌트 | 통신 방식 |
|---|---|
| 제어부(Control Plane) → 워커 노드 Kubelet | EKS Owned ENI (AWS 내부 ENI) |
| 워커 노드 → 제어부(Control Plane) | 프라이빗 도메인 (EKS Owned ENI) |
| 사용자(kubectl 등) → 제어부(Control Plane) | 프라이빗 도메인 (EKS Owned ENI), VPC Endpoint |
📌 연계된 네트워크 리소스
✔ EKS Owned ENI → 컨트롤 플레인과 워커 노드 & 사용자(kubectl) 간 내부 통신 담당
✔ VPC Endpoint → VPC 내부에서 API 서버에 접근할 수 있도록 설정
✔ Private Hosted Zone → 내부에서만 API 서버 도메인 확인 가능
📌 장점
완벽한 보안 → 퍼블릭 접근이 차단되므로, 외부 공격 가능성 없음
내부 통신 전용 → API 서버와 노드 간 트래픽이 인터넷을 거치지 않음
📌 단점
kubectl 사용이 불편 → 외부에서 접근하려면 VPN, Direct Connect, Bastion Host 필요
네트워크 설정이 복잡
| EKS Cluster Endpoint | 제어부 → 워커노드 | 워커노드 → 제어부 | 사용자(kubectl) → 제어부 | 네트워크 리소스 |
|---|---|---|---|---|
| Public | EKS Owned ENI | 퍼블릭 도메인 | 퍼블릭 도메인 | Internet Gateway, Public Hosted Zone |
| Public & Private | EKS Owned ENI | 프라이빗 도메인 (EKS Owned ENI) | 퍼블릭 도메인 | Internet Gateway, Public Hosted Zone, Private Hosted Zone |
| Private | EKS Owned ENI | 프라이빗 도메인 (EKS Owned ENI) | 프라이빗 도메인 (EKS Owned ENI, VPC Endpoint) | VPC Endpoint, Private Hosted Zone |
🔗 참고: EKS Cluster Endpoint Access
1️⃣ 사용자가 EKS 클러스터를 생성하면 AWS가 컨트롤 플레인을 자동으로 배포
2️⃣ 컨트롤 플레인은 클러스터의 상태를 관리하며, API 요청을 처리하고 etcd에 저장
3️⃣ 데이터 플레인(워커 노드)은 EC2 또는 Fargate에서 실행되며, 애플리케이션을 실제로 실행
4️⃣ 노드 간 네트워크 연결은 AWS VPC CNI를 사용하여 설정
5️⃣ 로드 밸런싱, 보안 및 모니터링은 AWS 서비스와 통합하여 운영 가능
EKS 컨트롤 플레인의 API 서버 앞단에 NLB(Network Load Balancer)를 사용하는 주된 이유는 속도와 연결 안정성 때문입니다.
✅ NLB가 선택된 이유
✅ ALB가 적절하지 않은 이유
📌 결론:
📌 초기 EKS 아키텍처 (CLB 사용)
초기에 AWS는 etcd 앞단에서 CLB(Classic Load Balancer)를 사용하여 트래픽을 부하 분산했었음

📌 CLB가 선택됐던 이유
📌 CLB 사용 시 문제점
📌 개선된 EKS 아키텍처 (CLB 제거)

✅ AWS는 CLB를 제거하고 API 서버가 직접 etcd와 통신하는 방식으로 변경
✅ API 서버 ↔ etcd 간 ENI-to-ENI 직접 연결
✅ API 서버가 자체적으로 Client-Side Load Balancing 수행
✅ 각 API 리소스 유형(Pods, Nodes, Secrets 등)마다 독립적인 etcd 클라이언트 연결 생성
📌 CLB 제거 후 장점
📌 결론:
🔗 참고