AWS 기술 블로그
AWS Gateway API 컨트롤러 소개: Amazon VPC Lattice 기반의 Kubernetes Gateway API 구현
이 글은 AWS for Containers 블로그에 게시된 글(Introducing AWS Gateway API controller for Amazon VPC Lattice, an implementation of Kubernetes Gateway API)를 한국어로 번역 및 편집하였습니다. 원문 블로그 게시 이후 변경된 사항을 반영해 수정했으며, 추가로 제공한 링크도 참고해 주시기 바랍니다. 영어 원문 블로그는 Sheetal Joshi와 Liwen Wu가 작성하였습니다.
소개
2023년 4월 3일 AWS는 Amazon Virtual Private Cloud(Amazon VPC)의 새로운 기능인 Amazon VPC Lattice의 정식 출시를 발표했습니다. Amazon VPC Lattice는 서비스 간의 통신을 연결하고, 보호하고, 모니터링할 수 있는 일관된 방법을 제공합니다. Amazon VPC Lattice 출시와 함께, Kubernetes Gateway API의 구현체인 AWS Gateway API 컨트롤러를 소개하게 되어 기쁩니다. Gateway API는 표현력 있고 확장 가능하며 역할 중심의 인터페이스를 통해 Kubernetes 애플리케이션 네트워킹을 가능하게 하는 오픈소스 표준 인터페이스입니다. AWS Gateway API 컨트롤러는 Gateway API에 의해 정의된 사용자 정의 리소스를 확장하여, Kubernetes API를 사용해 VPC Lattice 리소스를 생성할 수 있도록 합니다.
고객들은 Kubernetes를 통해 인프라와 운영을 현대화하면서 모놀리스 애플리케이션(monolith applications)을 마이크로서비스로 설계하는 경향이 증가하고 있습니다. 이러한 분리(디커플링)된 설계는 민첩성을 제공하고 더 빈번한 배포를 가능하게 하지만, 애플리케이션 트래픽 검색, 보안, 모니터링 및 라우팅과 관련된 새로운 문제들도 수반합니다. 고객들은 인그레스 전반에 걸친 이러한 요구사항들을 충족시키기 위해 로드 밸런서, 서비스 디스커버리, 서비스 메시, 모니터링 에이전트와 같은 여러 도구들을 결합하여 사용합니다.
인그레스는 일반적으로 ‘North-South’ 통신이라고도 알려진 내/외부 간의 통신과 ‘East-West’ 통신이라고도 알려진 서비스 간 통신을 지칭하며, 이는 주로 애플리케이션 네트워킹 사용 사례로 분류됩니다. 이러한 사용 사례들은 보통 Kubernetes에서 사이드카 패턴을 사용하여 애플리케이션 컨테이너와 함께 네트워킹 프록시를 배포하는 방식으로 구현됩니다.
Amazon VPC Lattice는 AWS 네트워크 인프라에 직접 구축된 완전 관리형 서비스입니다. Amazon VPC Lattice를 통해 다음과 같은 작업이 가능하며, 아래에서 설명한 기능들을 구현하기 위해 사용자 지정 코드를 개발하거나 Kubernetes 사이드카 프록시를 관리할 필요가 없습니다.
- VPC와 계정 전반에 걸친 서비스 간 네트워크 연결을 원활하게 처리
- 여러 Kubernetes 클러스터에 걸쳐 있는 서비스들을 검색
- 해당 서비스들 간의 통신을 보호하기 위한 심층 방어 전략 구현
- 서비스 간의 요청/응답 트래픽을 모니터링
이 게시물에서는 Gateway API 컨트롤러를 설치하고 컨트롤러에 의해 구현된 Gateway 클래스를 사용하여 Amazon VPC Lattice 서비스 네트워크를 구성하는 방법을 보여드립니다. 또한 Gateway API 리소스와 이들이 Amazon VPC Lattice 객체에 매핑되는 방식을 설명합니다. 마지막으로, Amazon Elastic Kubernetes Service(Amazon EKS) 클러스터 내의 서비스 간 간단한 트래픽 라우팅 사용 사례를 구현합니다.
Kubernetes Gateway API를 Amazon VPC Lattice 객체에 매핑하기
Kubernetes Gateway API 문서는 다음과 같이 설명합니다.
Gateway API는 Kubernetes 네트워킹 커뮤니티가 관리하는 오픈 소스 프로젝트입니다. 이는 Kubernetes에서 애플리케이션 네트워킹을 모델링하는 리소스의 집합입니다. Gateway API는 많은 벤더들이 구현하고 업계의 광범위한 지원을 받고 있는 GatewayClass, Gateway, Route 등의 리소스를 지원합니다.
Gateway API는 잘 알려진 Ingress API의 후속작으로 구상되었으며, Gateway API의 대표적인 장점으로는 일반적으로 사용되는 네트워킹 프로토콜에 대한 명시적 지원과 전송 계층 보안(TLS)에 대한 긴밀한 통합 지원 등이 있습니다.

AWS에서는 Amazon VPC Lattice와의 통합을 위해 Gateway API를 구현합니다. AWS Gateway API 컨트롤러는 오픈소스 프로젝트이며 Amazon이 완벽하게 지원합니다. AWS Gateway API 컨트롤러가 클러스터에 설치되면, 이 컨트롤러는 Gateway와 Routes와 같은 Gateway API 리소스의 생성을 감시하고, 위 그림에서 표시된 것처럼 해당하는 Amazon VPC Lattice 객체들을 프로비저닝합니다. VPC Lattice 구성 요소에 대해 자세히 알아보시려면 Amazon VPC Lattice 사용자 가이드를 참조하시기 바랍니다.
AWS에서 Gateway API 시작하기
시작하려면 Amazon EKS 클러스터를 생성하고 그 위에 Gateway API 컨트롤러를 설치해야 합니다. 필수 도구인 AWS Command Line Interface(AWS CLI), kubectl, eksctl을 설치해야 합니다. 이러한 도구들을 설정한 후, Lattice 문서에 나열된 단계에 따라 클러스터를 생성하십시오.
Amazon EKS 워커 노드가 VPC Lattice 제어 플레인에서 트래픽을 수신할 수 있도록 보안 그룹을 허용해야 합니다. 문서에 언급된 단계에 따라 VPC Lattice와 통신하는 모든 포드가 Amazon 관리형 접두사 목록의 모든 포트에서 트래픽을 허용하도록 보안 그룹을 설정해야 합니다.
그 다음, Gateway API 컨트롤러가 Amazon VPC Lattice 객체를 생성할 수 있는 권한을 얻도록 문서에 따라 AWS IAM Roles for Service Accounts(IRSA)를 사용하여 필요한 AWS Identity and Access Management(AWS IAM) 리소스를 생성해야 합니다. 이제 아래 명령어를 사용하여 컨트롤러를 배포할 수 있습니다. 이 컨트롤러는 Gateway API CRD(CustomResourceDefinitions)를 설치합니다.
(이하 본 블로그에서 다루는 명령어 및 script의 내용은 AWS Gateway API 컨트롤러의 Getting Started 문서를 참고해주시기 바랍니다.)
kubectl apply -f files/examples/my-hotel-gateway.yaml
Gateway API 컨트롤러가 활성화되어 이제 Lattice 구성 요소를 생성할 준비가 되었습니다. 애플리케이션 네트워킹 기능을 시연하기 위해 사용할 배포를 통해 샘플 애플리케이션을 생성하십시오.
kubectl apply -f files/examples/parking.yaml
kubectl apply -f files/examples/review.yaml
kubectl apply -f files/examples/inventory-ver1.yaml
Amazon VPC Lattice Controller의 작동 방식
GatewayClass
AWS Gateway API 컨트롤러는 amazon-vpc-lattice라는 새로운 GatewayClass를 도입합니다. 이를 통해 Kubernetes 사용자는 Amazon VPC Lattice 서비스를 이용할 수 있습니다. GatewayClass는 클러스터 범위 리소스로, 일반적으로 AWS와 같은 인프라 제공자가 정의합니다.
apiVersion: gateway.networking.k8s.io/v1beta1
kind: GatewayClass
metadata:
name: amazon-vpc-lattice
spec:
controllerName: application-networking.k8s.aws/gateway-api-controller
kubectl apply -f https://raw.githubusercontent.com/aws/aws-application-networking-k8s/main/files/controller-installation/gatewayclass.yaml
Gateway
Gateway는 트래픽이 클러스터 내부의 서비스에 어떻게 매핑될 수 있는지 지정합니다. Amazon VPC Lattice는 클러스터의 기본 네임스페이스에 Gateway를 생성할 것을 권장합니다. 일반적으로 Kubernetes 클러스터 운영자가 Gateway 생성을 담당합니다.
Gateway를 생성하고 Kubernetes 클러스터 VPC를 서비스 네트워크와 연결할 때, 서비스 네트워크가 존재하지 않는 경우 Gateway API 컨트롤러가 이를 생성합니다. 서비스 네트워크는 서비스 디스커버리와 연결성을 자동으로 구현하고, 서비스 모음에 대한 접근 및 관찰 가능성 정책을 적용하는 데 사용되는 논리적 경계입니다. VPC 내에서 HTTP, HTTPS 및 gRPC 프로토콜을 통한 애플리케이션 간 연결을 제공합니다. 현재 컨트롤러는 HTTP와 HTTPS를 지원합니다.
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: my-hotel
spec:
gatewayClassName: amazon-vpc-lattice
listeners:
- name: http
protocol: HTTP
port: 80
kubectl apply -f examples/my-hotel-gateway.yaml
HTTPRoute
애플리케이션 개발자나 서비스 소유자는 백엔드 서비스로의 트래픽 라우팅 방식을 정의하는 HTTP 라우트를 생성합니다. Gateway API 컨트롤러는 클러스터에 HTTPRoute를 적용할 때 하나 이상의 리스너로 서비스를 구성합니다. Amazon VPC Lattice에서 서비스는 모든 VPC나 계정에 존재할 수 있는 논리적 구성 요소입니다. 리스너는 서비스가 트래픽을 수신할 것으로 예상되는 포트와 프로토콜을 정의합니다. 컨트롤러는 라우트에서 백엔드 참조로 정의된 Kubernetes 서비스를 대상 그룹으로, 그리고 파드를 대상으로 등록합니다.
다음은 Kubernetes 사용자가 HTTPRoute를 사용하여 동일한 클러스터에서 실행 중인 서비스에 라우팅하고자 하는 의도를 지정하는 방법을 보여주는 예시입니다.
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: inventory
spec:
parentRefs:
- name: my-hotel
sectionName: http
rules:
- backendRefs:
- name: inventory-ver1
kind: Service
port: 80
weight: 10
아래 명령어를 사용하여 HTTPRoute를 생성하면 Amazon VPC Lattice가 서비스에 DNS 이름을 할당하고, 컨트롤러가 경로 리소스에 DNS 이름을 annotation으로 처리합니다.
kubectl apply -f examples/rate-route-path.yaml
kubectl apply -f files/examples/inventory-route.yaml
다음 명령어를 사용하여 DNS 이름을 찾을 수 있습니다.
ratesFQDN=$(kubectl get httproute rates -o json | jq -r '.metadata.annotations."application-networking.k8s.aws/lattice-assigned-domain-name"')
inventoryFQDN=$(kubectl get httproute inventory -o json | jq -r '.metadata.annotations."application-networking.k8s.aws/lattice-assigned-domain-name"')
echo "$ratesFQDN \n$inventoryFQDN"
parking 서비스와 inventory 서비스가 동일한 서비스 네트워크에 속해 있으므로, parking 서비스 내에서 inventory 서비스에 접근할 수 있어야 합니다. 이제 parking 서비스와 inventory 서비스 간의 트래픽 라우팅을 검토할 수 있습니다.
parking 파드 내부에서 inventory 서비스에 연결할 수 있습니다.
kubectl exec deploy/parking -- curl -s $inventoryFQDN
Requsting to Pod(inventory-ver1-xxxxx-xxxxx): Inventory-ver1 handler pod
더불어 아래 명령을 통해 inventory-ver1 서비스와 parking 및 review 서비스 간의 연결 상태를 확인할 수 있습니다.
kubectl exec deploy/inventory-ver1 -- curl -s $ratesFQDN/parking $ratesFQDN/review
Requsting to Pod(parking-aaaaaaaa-aaaaa): parking handler pod
Requsting to Pod(review-bbbbbbbb-bbbbb): review handler pod
이제 클러스터 내 서비스 간 통신이 예상대로 작동하는지 확인할 수 있습니다.
리소스 정리
요금이 발생하지 않도록 하려면 이 게시물의 실습 과정에서 생성된 모든 리소스를 삭제하세요. Amazon EKS 클러스터를 삭제하기 전에 Kubernetes API를 사용하여 HTTPRoutes 및 Gateway 리소스를 삭제하는 것이 좋습니다. Amazon VPC 콘솔에 로그인하여 리소스가 삭제되었는지 확인하세요.
결론
이 글에서는 Amazon VPC Lattice용 AWS Gateway API 컨트롤러가 애플리케이션 네트워킹을 지원하기 위해 Kubernetes Gateway API 표준을 어떻게 지원하는지 설명했습니다. 또한 Gateway API 항목과 Amazon VPC Lattice 리소스 간의 매핑에 대해서도 자세히 논의했습니다. Kubernetes API를 사용하여 Amazon VPC Lattice 서비스 네트워크를 생성하고, 서비스를 연결하며, 타깃을 등록하고, 리스너를 구성할 수 있습니다. HTTP 애플리케이션 간 서비스 검색 및 클러스터 내 통신이라는 기본적인 사용 사례를 논의했습니다. AWS Gateway API 컨트롤러 문서에는 설치 지침과 추가 사용 사례 구현에 대한 정보가 포함되어 있습니다.
AWS Gateway API 컨트롤러는 추가 비용 없이 이용 가능합니다. 그러나, Amazon VPC Lattice에서 생성된 구성 요소와 Lattice를 통해 전송된 데이터에 대해서는 요금이 부과됩니다. 자세한 내용 및 요금 관련 지원은 Amazon VPC Lattice 요금 페이지를 참조하십시오.
다음 블로그에서는 컨트롤러가 클러스터 간 통신을 가능하게 하는 방법을 살펴보겠습니다. 또한 보안, 인증 및 권한 부여에 대한 자세한 내용과 서비스에 대한 사용자 지정 도메인 이름 지원에 대해서도 다룹니다. 더불어 AWS Gateway API 컨트롤러는 Kubernetes 멀티 클러스터 서비스 API를 구현하여 클러스터 간 Kubernetes 서비스 내보내기를 지원합니다. 가져온 서비스를 HTTPRoute 아래의 백엔드 참조로 사용하는 방법에 대한 자세한 내용은 예제를 참조하세요.
요청사항
AWS Gateway API 컨트롤러는 Apache License 2.0으로 라이선스된 오픈소스 프로젝트입니다. 사용해 보시고 관심 있는 기능에 대해 알려주세요. 버그 보고, 신규 기능 제안, 수정 사항 또는 추가 문서화 등 모든 기여를 환영합니다.
Amazon VPC Lattice에 대해 자세히 알아보려면 AWS re:Invent 2022의 문서와 데모 동영상을 참조하십시오.