Kubernetes 의 네트워킹의 변화과정에서 한계점 극복을 위해 출시된 Amazon VPC Lattice에 대해 확인.
1. Kubernetes의 애플리케이션 네트워킹 변화 과정
- 1.1 기존 Kubernetes 네트워크의 한계점
- 1.2 Gateway API
2. Amazon VPC Lattice 란?
- Amazon VPC Lattice 장점
3. Amazon VPC Lattice 실습
1. Kubernetes의 애플리케이션 네트워킹 변화 과정
단일클러스터를 사용 시
- 단일 클러스터 내부에 배포되는 Kubernetes 서비스들은 클러스터 내부의 DNS 인 CoreDNS 및 Ingress 리소스를 통해서 내부 서비스 간 통신 및 외부로의 통신을 모두 네이티브하게 구현할 수 있음.
- 사용되는 방법들
- 기본 Service 리소스로 시작
- NodePort, ClusterIP, LoadBalancer 타입의 서비스 구현
- Ingress 활용
- 경로 기반 라우팅으로 서비스 구조화 및 관리 개선
- SSL/TLS 종단점 제공을 통한 보안 강화
- 단순한 내부 통신과 외부 노출 기능에 중점
여러 개의 Kubernetes 클러스터를 사용할 때
- 애플리케이션이 진화하고, 조직이 발전하면서 서비스들이 독자적인 VPC 및 Kubernetes 클러스터에 운영되기 시작하면서 클러스터 운영자들은 이런 VPC 간 / 클러스터 간의 애플리케이션 네트워킹에 대해서 고민하게 됨.
- 애플리케이션 끼리 통신을 하기 위해선 가장 먼저 내가 통신하고 싶은 서비스 혹은 마이크로 서비스가 어디에 있는지를 아는 것이 선행 되어야 함 → Service Discovery
- Service Discovery
- 서비스의 IP 주소 및 포트 정보를 동적으로 관리
- 각 서비스 인스턴스를 지속적으로 Health Check
- 서비스 관련 메타데이터와 구성 정보를 저장하고 관리
- Service Discovery 패턴
- 클라이언트 사이드
- 클라이언트가 직접 서비스 레지스트리를 쿼리하여 서비스 위치를 찾는 방식(예: Netflix Eureka, Spring Cloud)
- 클라이언트 사이드
- Service Discovery
- 애플리케이션 끼리 통신을 하기 위해선 가장 먼저 내가 통신하고 싶은 서비스 혹은 마이크로 서비스가 어디에 있는지를 아는 것이 선행 되어야 함 → Service Discovery
- 이크로 서비스가 늘어나면서 네트워크 복잡성 증가 및 공통 기능 적용(서킷브레이커, 재시도 로직, 타임아웃, 인증 등)의 요구사항 이 생김 → Service Mesh
- Service Mesh
- AWS AppMesh, Istio, Linkerd 등으로 트래픽 관리, 보안, 관찰성 강화
- 마이크로서비스 간 통신의 복잡성 추상화
- 서비스 디스커버리와 로드밸런싱의 고도화 및 자동화 (서비스 메시는 서비스 디스커버리를 기반으로 함)
- Service Mesh
- 동작 원리
- 컨테이너 애플리케이션 앞에 AWS AppMesh, Istio, Linkerd 등의 사이드카 프록시 컨테이너를 배치

- 테이너 애플리케이션으로 들어오고 나가는 모든 트래픽은 프록시 컨테이너를 통해 라우팅 되는 방식
- 프록시 컨테이너의 역할
- 데이터 영역
- 사이드카가 요청을 가로챔 → 요청을 별도의 네트워크 연결로 캡슐화 → 소스 프록시와 대상 프록시 간에 안전하고 암호화된 채널을 설정
- 서비스 간 로우 레벨 메시징을 처리
- 서킷 브레이킹, 요청 재시도와 같은 기능을 구현하여 복원력을 높이고 서비스 성능 저하를 방지
- 제어 영역
- 메시 내의 모든 서비스를 추적하는 서비스 레지스트리 기능 수행
- 신규 서비스 자동 검색 기능 및 비활성 서비스 제거 기능 수행
- 지표, 로그, 분산 추적 정보와 같은 텔레메트리 데이터의 수집 및 집계
- 데이터 영역
1.1 기존 쿠버네티스 환경이 네트워크 한계점
Ingress와 Service Discovery, Service Mesh의 한계점
Ingress와 Service Discovery, Service Mesh는 Kubernetes에서 트래픽 라우팅을 관리하는 대표적인 방식이었지만, 다음과 같은 한계점을 가지고 있었습니다.
Ingress의 한계
- HTTP, HTTPS와 같은 L7 트래픽에 최적화 되어있어 gRPC 및 TPC, UDP와 같은 비 L7 프로토콜에 대한 라우팅 기능이 제한적이었습니다.
- 고급 기능(인증, 속도 제한 정책, 고급 트래픽 관리 등)을 사용하려면 벤더별(AWS, NGINX, HAProxy 등) 사용자 정의 어노테이션이 필요하여 이식성과 표준화에 한계가 존재했습니다.
Service Mesh의 한계
- 주로 동-서 트래픽(서비스 간 내부 통신)에 초점을 맞추어 설계되어 북-남 트래픽(외부-내부 통신)에 대한 기능이 제한적이였습니다.
- Amazon EKS의 경우, VPC Peering 및 TGW가 필요 → 점점 늘어나는 설정들과 네트워크 리소스들
- 여러 AWS 계정을 사용할 경우, 각각 교차 계정 액세스 설정이 필요 → 권한 관리의 어려움
- 사이드카 프록시 배포가 필수적이며, 멀티 VPC 클라우드 환경에서 네트워크 복잡도가 증가하였습니다. (멀티 클러스터, 멀티 메시의 수많은 프록시 운영 및 관리의 어려움)
또한, 클라우드 환경에서 점차 마이크로 서비스가 확장되고 인프라 구성이 복잡해짐에 따라 아래와 같은 요구사항도 생겨났습니다.
- 다양한 팀 간의 책임 분리(인프라 담당자, 애플리케이션 개발자, DevOps 엔지니어 등)가 필요해졌습니다.
- 여러 VPC 또는 멀티 클러스터 환경에 걸친 리소스들을 일관되게 관리해야 했습니다.
- 다양한 컴퓨팅 형태(인스턴스, 컨테이너, 서버리스 등)를 통합적으로 관리할 수 있는 네트워킹 레이어가 필요했습니다.
이러한 한계를 극복하기 위해 SIG-NETWORK 커뮤니티에서 Gateway API가 고안되었습니다. Gateway API는 다음과 같은 목표를 가지고 설계되었습니다.
- 역할 기반 설계: 인프라 관리자, 클러스터 운영자, 애플리케이션 개발자 각각의 요구사항을 반영할 수 있도록 설계되었습니다.
- 범용성: HTTP, HTTPS, gRPC 등 다양한 프로토콜을 지원하고 확장성 있게 설계되었습니다.
- 표준화: Kubernetes Ingress와 같이 포터블한 표준 API가 되도록 설계되었습니다.
- 확장성: 멀티 클러스터 환경 및 다양한 VPC 간의 원활한 네트워크 통합이 가능하도록 설계되었습니다.
1.2 Gateway API의 주요 구성요소
Gateway API는 계층적 구조로 설계되어 인프라 관리자와 애플리케이션 개발자의 역할과 책임을 명확히 구분합니다. 주요 구성 요소는 다음과 같습니다.
GatewayClass
- 공통 구성을 가진 게이트웨이 집합을 정의하며, 이 클래스를 구현하는 컨트롤러에 의해 관리됩니다.
- 게이트웨이는 각기 다른 컨트롤러에 의해 다양한 구성으로 구현될 수 있습니다. 게이트웨이는 반드시 해당 클래스를 구현하는 컨트롤러의 이름을 포함하는 GatewayClass를 참조해야 합니다.
Gateway
- 외부 트래픽을 수신하고 내부 서비스로 라우팅하는 진입점을 정의합니다.
- 하나 이상의 Route 리소스와 연결될 수 있습니다.
Routes
- 트래픽을 특정 서비스로 매핑하는 프로토콜 별 규칙을 정의합니다.
- HTTPRoute, TLSRoute, TCPRoute, UDPRoute, GRPCRoute 등이 있습니다.
- Gateway 리소스에 연결되어 트래픽을 대상 서비스로 전달합니다.
구성도

Amazon VPC Lattice란?
Amazon VPC Lattice 는 AWS에서 제공하는 완전관리형 애플리케이션 네트워킹 서비스로, 다양한 컴퓨팅 환경에서 애플리케이션 서비스를 연결, 보호 및 모니터링하는 통합 솔루션입니다. VPC Lattice는 단일 VPC 내에서는 물론, 계정 간 여러 VPC에 걸쳐 서비스를 연결하는 데 활용할 수 있습니다.

현대적 애플리케이션은 마이크로서비스 아키텍처를 통해 여러 개의 소규모 모듈형 서비스로 분할되어 개발되는 추세입니다. 이러한 접근 방식은 개발 속도와 확장성 측면에서 많은 이점을 제공하지만, 다양한 마이크로서비스 간의 효율적인 연결과 관리에 대한 새로운 네트워킹 문제를 야기합니다. Amazon VPC Lattice는 이러한 과제를 해결하기 위해 네트워크 액세스, 트래픽 관리, 모니터링에 대한 일관된 정책을 정의하여 EC2 인스턴스, EKS 컨테이너, Lambda 서버리스 함수 등 다양한 컴퓨팅 서비스 간에 간단하고 표준화된 연결 방식을 제공
Amazon VPC Lattice의 장점
- 여러 VPC, EC2 인스턴스, 컨테이너, 서버리스로 구성한 애플리케이션의 네트워크 구성을 중앙 집중화 할 수 있습니다.
- 별도의 사이드카 프록시를 구성할 필요가 없습니다. (+ 완전 관리형 서비스)
- 복잡한 네트워크 구성을 단순화 해서 쉽게 사용할 수 있습니다.
- IAM 및 SigV4를 통해 각 애플리케이션으로의 보안 구성을 손쉽게 적용 할 수 있습니다.
- CloudWatch, S3, Kinesis Data Firehose를 통해 쉽게 로깅, 트래픽 패턴 분석 등을 수행할 수 있습니다.
여러 AWS 리전에 걸친 애플리케이션 간의 연결(구성도)

참고 자료
- Amazon VPC Lattice Docs : https://docs.aws.amazon.com/ko_kr/vpc-lattice/latest/ug/what-is-vpc-lattice.html
- Amazon VPC Lattice Workshop : https://catalog.workshops.aws/handsonwithvpclattice/ko-KR
- https://docs.aws.amazon.com/ko_kr/vpc-lattice/latest/ug/how-it-works.html
- https://aws.amazon.com/ko/blogs/korea/simplify-service-to-service-connectivity-security-and-monitoring-with-amazon-vpc-lattice-now-generally-available/
- https://aws.amazon.com/ko/blogs/tech/amazon-vpc-vattice-modernize-and-simplify-your-enterprise-network-architectures/
- https://aws.amazon.com/blogs/containers/application-networking-with-amazon-vpc-lattice-and-amazon-eks/
- https://youtu.be/fRjD1JI0H5w?si=jtLssGaVfu8hnNUY
AWS Gateway API Controller
AWS Gateway API Controller는 Gateway API에 의해 정의된 사용자 지정 리소스를 확장하여 Kubernetes API를 사용하여 VPC Lattice 리소스를 생성합니다. 이 Controller가 클러스터에 설치되면 Controller는 Gateway API의 리소스(Gateway 및 Route)의 생성을 감시하고 적절한 Amazon VPC Lattice 오브젝트를 프로비저닝 합니다. 이를 통해 사용자는 커스텀 코드를 작성하거나 사이드카 프록시를 관리할 필요 없이 Kubernetes API를 사용하여 VPC Lattice Service, VPC Lattice Service Network 및 Target Group을 구성할 수 있습니다.
AWS Gateway API Controller는 Amazon VPC Lattice와 통합되어 다음 작업을 수행할 수 있습니다.
- VPC 및 계정 전반에 걸친 서비스 간 네트워크 연결을 원활하게 처리합니다.
- 여러 Kubernetes 클러스터에 걸쳐 있는 VPC Lattice Service를 검색합니다.
- 서비스 간 통신의 보안을 구성하기 위한 깊이 있는 방어 전략을 구현합니다.
- 서비스 간 요청/응답 트래픽을 관찰합니다.

3. Simple Client to Server Communication 실습
실습환경
- git clone https://github.com/aws-ia/terraform-aws-eks-blueprints.git
- cd terraform-aws-eks-blueprints/patterns/vpc-lattice/client-server-communication

| terraform init 모듈 프로비저닝 terraform apply -target="module.client_vpc" -auto-approve terraform apply -target="module.cluster_vpc" -auto-approve terraform apply -target=aws_route53_zone.primary -auto-approve terraform apply -target="module.client_sg" -auto-approve terraform apply -target="module.endpoint_sg" -auto-approve terraform apply -target="module.client" -auto-approve terraform apply -target="module.vpc_endpoints" -auto-approve terraform apply -target="module.eks" -auto-approve terraform apply -target="module.addons" -auto-approve terraform apply -auto-approve |
환경분석
client.tf 살펴보기client 모듈에서는 프로비저닝 할 EC2 인스턴스에 대한 명세가 적혀있습니다.
- 인스턴스 유형은 t2.micro 입니다.
- AmazonSSMManagedInstanceCore IAM Role을 설정합니다.
- client_sg 모듈을 참조하여 Security Group을 설정합니다.
module "client" {
source = "terraform-aws-modules/ec2-instance/aws"
version = "~> 5.0"
name = "client"
instance_type = "t2.micro"
subnet_id = module.client_vpc.private_subnets[0]
create_iam_instance_profile = true
iam_role_description = "IAM role for client"
iam_role_policies = {
AmazonSSMManagedInstanceCore = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
}
vpc_security_group_ids = [module.client_sg.security_group_id]
tags = local.tags
}
이어서 vpc_endpoints 모듈에서는 client에서 Systems Manager를 사용하기 위한 VPC Endpoint를 구성하기 위한 명세가 적혀있습니다.
- VPC Endpoint에서 구성할 서비스는 ssm, ssmmessages, ec2messages 입니다.
- 적용할 서브넷은 client_vpc 모듈을 참조하여 private_subnets을 대상으로 합니다.
- endpoint_sg 모듈을 참조하여 Security Group을 설정합니다.
module "vpc_endpoints" {
source = "terraform-aws-modules/vpc/aws//modules/vpc-endpoints"
version = "~> 5.0"
vpc_id = module.client_vpc.vpc_id
endpoints = { for service in toset(["ssm", "ssmmessages", "ec2messages"]) :
replace(service, ".", "_") =>
{
service = service
subnet_ids = module.client_vpc.private_subnets
private_dns_enabled = true
tags = { Name = "${local.name}-${service}" }
}
}
security_group_ids = [module.endpoint_sg.security_group_id]
tags = local.tags
}
그 다음으로는 client의 EC2 인스턴스와 VPC Endpoint에서 사용할 각각의 Security Group(모듈 client_sg 및 endpoint_sg)에 대한 명세가 적혀있습니다.
- client_sg 모듈에서는 EC2 인스턴스의 Egress 설정이 명세되어 있습니다.
- endpoint_sg 모듈에서는 client_vpc의 모듈을 참조하여 private_subnets_cidr_blocks 값에 대해 443 포트를 허용하는 Ingress 설정이 명세되어 있습니다.
module "client_sg" {
source = "terraform-aws-modules/security-group/aws"
version = "~> 5.0"
name = "client"
description = "Security Group for EC2 Instance Egress"
vpc_id = module.client_vpc.vpc_id
egress_with_cidr_blocks = [
{
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = "0.0.0.0/0"
},
]
tags = local.tags
}
module "endpoint_sg" {
source = "terraform-aws-modules/security-group/aws"
version = "~> 5.0"
name = "ssm-endpoint"
description = "Security Group for EC2 Instance Egress"
vpc_id = module.client_vpc.vpc_id
ingress_with_cidr_blocks = [for subnet in module.client_vpc.private_subnets_cidr_blocks :
{
from_port = 443
to_port = 443
protocol = "TCP"
cidr_blocks = subnet
}
]
tags = local.tags
}
마지막으로, client_vpc 모듈에서는 이 모든 client를 위한 리소스가 구성될 VPC에 대한 내용이 명세되어 있습니다.
- client vpc에 대한 cidr 값은 main.tf 내에 명세되어있는 client_vpc_cidr 값을 참조합니다.
- 가용영역(azs) 값도 마찬가지로 main.tf 내에 명세되어있는 azs 값을 참조합니다.
- terraform의 cidrsubnet 함수는 주어진 대역 내에서 새 비트 수에 따른 서브네팅을 수행합니다.
module "client_vpc" {
source = "terraform-aws-modules/vpc/aws"
version = "~> 5.0"
name = local.name
cidr = local.client_vpc_cidr
azs = local.azs
private_subnets = [for k, v in local.azs : cidrsubnet(local.client_vpc_cidr, 4, k)]
tags = local.tags
}
- client.tf 파일을 살펴보겠습니다. 이 파일에서는 VPC Lattice를 통해 EKS Cluster의 애플리케이션으로 요청을 전달하는 클라이언트 역할을 하는 리소스에 대한 명세가 작성되어 있습니다.
- eks.tf 살펴보기가장 첫번째로 볼 수 있는 eks 모듈은 EKS 클러스터에 대한 명세입니다.
- EKS 클러스터의 버전은 1.30 입니다.
- EKS 클러스터의 public access를 허용합니다.
- EKS 클러스터의 VPC 정보는 cluster_vpc 모듈을 참조합니다.
- 관리형 노드그룹을 구성하며, m5.large 인스턴스 유형을 사용하고 최소 3개, 최대 10개, 기본 3개의 노드 갯수를 설정합니다.
다음은 cluster_vpc 모듈입니다. 이 모듈에서는 EKS 클러스터가 프로비저닝 될 VPC에 대한 명세가 담겨있습니다.module "eks" { source = "terraform-aws-modules/eks/aws" version = "~> 20.11" cluster_name = local.name cluster_version = "1.30" cluster_endpoint_public_access = true # Give the Terraform identity admin access to the cluster # which will allow resources to be deployed into the cluster enable_cluster_creator_admin_permissions = true vpc_id = module.cluster_vpc.vpc_id subnet_ids = module.cluster_vpc.private_subnets eks_managed_node_groups = { initial = { instance_types = ["m5.large"] min_size = 3 max_size = 10 desired_size = 3 } } tags = local.tags }- 해당 VPC의 cidr 값은 main.tf 내에 명세되어있는 cluster_vpc_cidr 값을 참조합니다.
- NAT Gateway를 한 개만 프로비저닝 합니다.
- Ingress 구성을 위한 elb 태그를 추가합니다.
다음은 addons 모듈입니다. 이 모듈에서는 EKS 클러스터에 설치할 EKS Add-on에 대한 명세가 담겨있습니다. 해당 모듈을 통해서 AWS Gateway API Controller를 추가합니다.다음은 demo_application 리소스 입니다. 이 리소스를 통해서 EKS 클러스터 내에 간단한 데모 애플리케이션을 배포합니다.module "cluster_vpc" { source = "terraform-aws-modules/vpc/aws" version = "~> 5.0" name = local.name cidr = local.cluster_vpc_cidr azs = local.azs private_subnets = [for k, v in local.azs : cidrsubnet(local.cluster_vpc_cidr, 4, k)] public_subnets = [for k, v in local.azs : cidrsubnet(local.cluster_vpc_cidr, 8, k + 48)] enable_nat_gateway = true single_nat_gateway = true public_subnet_tags = { "kubernetes.io/role/elb" = 1 } private_subnet_tags = { "kubernetes.io/role/internal-elb" = 1 } tags = local.tags }- ./charts/demo-application 디렉터리 내의 yaml을 참조하여 데모 애플리케이션을 배포합니다.
- depends_on을 통해 addons 모듈이 구성되고 난 이후에 리소스를 배포하도록 설정합니다.
데모 애플리케이션에 대한 yaml 명세서를 간단히 살펴보겠습니다. charts/demo-application 폴더를 참조해주세요.마지막으로 아래 데이터 및 리소스를 통해 VPC Lattice에 대한 IPv4 주소의 EC2 Prefix List를 생성하고, 이 Prefix List에 대한 Security Group Ingress 규칙을 생성합니다.resource "helm_release" "demo_application" { name = "demo-application" chart = "./charts/demo-application" create_namespace = true namespace = "apps" depends_on = [module.addons] } - 이번에는 eks.tf 파일을 살펴보겠습니다. 이 파일에서는 VPC Lattice를 통해 서비스를 제공할 EKS 클러스터의 애플리케이션 및 그 인프라에 대한 명세가 작성되어 있습니다.
Lattice service network를 위한 리소스
- this 리소스에서는 my-services라는 이름의 VPC Lattice service network를 생성합니다.
- cluster_vpc 리소스에서는 앞서 만든 VPC Lattice service network에 cluster vpc를 association 합니다.
- client_vpc 리소스에서는 앞서 만든 VPC Lattice service network에 client vpc를 association 합니다.
- demo_application이 배포되고 난 이후 120초를 기다립니다.
resource "aws_vpclattice_service_network" "this" {
name = "my-services"
auth_type = "NONE"
tags = local.tags
}
resource "aws_vpclattice_service_network_vpc_association" "cluster_vpc" {
vpc_identifier = module.cluster_vpc.vpc_id
service_network_identifier = aws_vpclattice_service_network.this.id
}
resource "aws_vpclattice_service_network_vpc_association" "client_vpc" {
vpc_identifier = module.client_vpc.vpc_id
service_network_identifier = aws_vpclattice_service_network.this.id
}
resource "time_sleep" "wait_for_lattice_resources" {
depends_on = [helm_release.demo_application]
create_duration = "120s"
}
다음으로 VPC Lattice service를 위한 커스텀 도메인을 생성하는 부분을 살펴보겠습니다.
- example.com 이라는 명칭의 public hosted zone을 생성합니다.
- client vpc의 id 값을 hosted zone과 연결합니다.
- 여기서 records는 external-dns에서 HTTPRoute를 생성할 때, VPC Lattice Gateway API Copntroller에서 생성한 DNSEndpoint 객체를 사용해서 생성됩니다.
resource "aws_route53_zone" "primary" {
name = "example.com"
vpc {
vpc_id = module.client_vpc.vpc_id
}
tags = local.tags
}
lattice.tf 파일을 열어 VPC Lattice에 대한 구성을 살펴보겠습니다.
- this 리소스에서는 my-services라는 이름의 VPC Lattice service network를 생성합니다.
- cluster_vpc 리소스에서는 앞서 만든 VPC Lattice service network에 cluster vpc를 association 합니다.
- client_vpc 리소스에서는 앞서 만든 VPC Lattice service network에 client vpc를 association 합니다.
- demo_application이 배포되고 난 이후 120초를 기다립니다.
resource "aws_vpclattice_service_network" "this" {
name = "my-services"
auth_type = "NONE"
tags = local.tags
}
resource "aws_vpclattice_service_network_vpc_association" "cluster_vpc" {
vpc_identifier = module.cluster_vpc.vpc_id
service_network_identifier = aws_vpclattice_service_network.this.id
}
resource "aws_vpclattice_service_network_vpc_association" "client_vpc" {
vpc_identifier = module.client_vpc.vpc_id
service_network_identifier = aws_vpclattice_service_network.this.id
}
resource "time_sleep" "wait_for_lattice_resources" {
depends_on = [helm_release.demo_application]
create_duration = "120s"
}
다음으로 VPC Lattice service를 위한 커스텀 도메인을 생성하는 부분을 살펴보겠습니다.
- example.com 이라는 명칭의 public hosted zone을 생성합니다.
- client vpc의 id 값을 hosted zone과 연결합니다.
- 여기서 records는 external-dns에서 HTTPRoute를 생성할 때, VPC Lattice Gateway API Copntroller에서 생성한 DNSEndpoint 객체를 사용해서 생성됩니다.
resource "aws_route53_zone" "primary" {
name = "example.com"
vpc {
vpc_id = module.client_vpc.vpc_id
}
tags = local.tags
}
Terraform 용어 가이드
- 모듈(module) : 재사용 가능한 Terraform 코드 블록으로, 여러 리소스를 그룹화하여 하나의 템플릿으로 관리할 수 있습니다.
- 리소스(resource) : Terraform의 핵심 구성 요소로, 실제 인프라 리소스를 생성하거나 관리합니다.
- 데이터(data) : 이미 존재하는 인프라 리소스나 다른 Terraform 코드에서 생성된 리소스 정보를 가져오는 데 사용됩니다.
인프라확인


- client 측 워크로드로 1개의 ec2 인스턴스가 구성되어 있습니다.
- cluster 측 워크로드로 3개의 ec2 인스턴스(워커 노드)가 구성되어 있습니다.


pod

clinent ec2 에서 통신테스트
curl -i http://server.example.com

server 로그 확인
kubectl logs -f deployment/server -n apps --all-containers=true --since=1m

vpc Lattice 구성된 엔드포인트 조회

Amazon VPC Lattice 확인


Amazon VPC Lattice Target Group 확인
VPC Lattice Service의 세부 항목 중, Routing 섹션을 클릭하면 아래와 같은 Listener 규칙과 함께 대상 그룹을 확인할 수 있습니다. 대상 그룹의 세부 내용을 보기 위해서 아래 그림과 같이 Listener rules > Action > Forward to 순서로 찾아 대상 그룹을 클릭합니


AWS Gateway API Controller의 동작 체크
이렇게 VPC Lattice를 통해 EKS 클러스터 내의 server pod로 라우팅 할 수 있는 환경을 구성하기 위해서는 EKS 클러스터 내에 GatewayClass, Gateway, Route 리소스를 생성해야 합니다.
AWS Gateway API Controller는 생성된 GatewayClass, Gateway, Route 리소스를 참조하여 필요한 VPC Lattice 네트워크 환경을 구성하게 됩니다.
아래 kubectl 명령을 수행하여, AWS Gateway API Controller의 로그를 lattice.log라는 파일로 저장합니다
kubectl logs deployment/aws-gateway-api-controller-aws-gateway-controller-chart -n aws-application-networking-system --all-containers=true > lattice.log

- 로그를 보면, server라는 이름의 service와 my-services라는 이름의 gateway의 생성을 감지하여, reconcile 작업을 수행하는 것을 확인할 수 있습니다.
- 이어서 server-apps라는 이름(HTTPRoute의 metadata.name 및 metadata.namespace를 사용)으로 구성된 Route 대상에 라우팅 하기 위해 server.example.com이라는 사용자 지정 도메인 이름을 세팅하고, VPC Lattice Service를 구성합니다.
- 그리고 VPC Lattice Service에 대해 Listener rule을 생성하고 HTTPRoute 매니페스트 내용에 맞춰 PathPrefix를 구성하고, backendRefs에 대한 대상 그룹을 생성합니다.
- 대상 그룹에는 Service를 참조하여 라우팅 대상 Pod의 IP 주소 및 Port 번호를 세팅합니다.
리소스 정리
| terraform destroy -target="module.client_vpc" -auto-approve terraform destroy -target="module.cluster_vpc" -auto-approve terraform destroy -target=aws_route53_zone.primary -auto-approve terraform destroy -target="module.client_sg" -auto-approve terraform destroy -target="module.endpoint_sg" -auto-approve terraform destroy -target="module.client" -auto-approve terraform destroy -target="module.vpc_endpoints" -auto-approve terraform destroy -target="module.eks" -auto-approve terraform destroy -target="module.addons" -auto-approve terraform destroy -auto-approve |
쿠버네티스 환경의 네트워크 변화 과정을 살펴보고 기존 기술의 한계점을 바탕으로 Gateway API의 등장 배경 및
EKS에서 Amazon VPC Lattice를 활용해 앞서 설명한 복잡한 쿠버네티스 네트워크 환경의 한계점을 어떻게 극복방법을 확인하였다.