Search
Duplicate

Ingress + API Gateway = Kubernetes Gateway API

Category
as a S/W 엔지니어
Tags
k8s
API Gateway
Kubernetes
Gateway API
ingress
Istio
Kubernetes Gateway API
Created time
2023/09/24
Gateway API 기반 k8s resources(Gateway, HTTPRoute)와 타 k8s resources(Service, Pod)와의 관계 이미지 출처 : https://gateway-api.sigs.k8s.io/api-types/httproute/

Introduction

k8s ingress의 superset에 해당하는 Kubernetes Gateway API에 대해 논한다. 사실 상 Kubernetes Gateway API 공식 문서인 https://gateway-api.sigs.k8s.io/를 주로 참조한 개념적 요약이다.

Motivation

Network topology 관점에서 보자면 ingress와 API Gateway 모두는 L7 load balancer에 해당한다(k8s 외부로의 단일 접점 제공, L7 기반 부하 분산). 따라서 이들 둘을 별도로 운용하는 것은 비효율적이다. (이로 인해, 일반적으로는 L4 Load balancer에 API Gateway를 붙여 사용하리라 예상한다).
Service Mesh, 예컨데 istio의 경우, internet facing service에 대해 virtual service에 기반한 traffic 관리를 위해서는 istio ingress gateway가 필요하다. 이는 명칭에도 보듯 아키텍처 상 API Gateway와 또 다른 중복이다.
Kubernetes Gateway API는 이들 문제에 대한 해결안이다.

What is k8s Gateway API?

Gateway API는 SIG-NETWORK 커뮤니티 에서 관리하는 오픈 소스 프로젝트로서, Kubernetes에서 서비스 네트워킹을 모델링하는 API(리소스 모음)입니다… 이전 Ingress API 에 익숙하다면 Gateway API를 해당 API의 더욱 표현력이 풍부한 차세대 버전과 유사하다고 생각할 수 있습니다. from k8s Gateway API 공식 site
위의 공식 site의 정의 중 둘째 문장이 중요한데, Gateway API는 ingress API를 사실 상 대체 가능한 superset임을 암시한다. 참고로, ingress와 API Gateway 모두는 Network 관점에서 보면 L7 Load balancer에 해당하지만, API Gateway는 ingress와는 달리 L7 protocol(e.g. HTTP)에 특화된 다양한 작업을 수행 가능하다.
한마디로 말해, k8s Gateway API란 ingress + API Gateway인 셈이다.

k8s Gateway API의 resources 및 이들 간 관계

다음 그림은 Gateway API의 주요 resources 식별 및 resource 간의 관계 및 담당자를 보여준다. 주목할 점으로 resource 별 담당자의 역할 분배를 고려했음이 보인다. ingress와는 달리 k8s Gateway API는 단일 runtime에 대해(API Gateway - ingress) GatewayHTTPRoute 라는 두 개의 resource로 나누어, Cluster와 application level 담당자를 분리 가능하도록 함과 동시에 application level 내에서도 각기 담당하는 resource를 분리 가능하도록 한다.
GatewayClass : 인프라 제공자가 정의하는 클러스터 범위의 resource로서 생성 가능한 gateway를 정의한다. ingress의 networking.IngressClass 에 해당한다.
manifest example
apiVersion: gateway.networking.k8s.io/v1beta1 kind: GatewayClass metadata: name: istio-gateway # Gateway resource에서 사용할 이름 spec: controllerName: "istio.io/gateway-controller" # istio의 gateway class를 추가
YAML
복사
Gateway : GatewayClass 에 의해 Gateway를 provisioning한다.
manifest example
apiVersion: gateway.networking.k8s.io/v1beta1 kind: Gateway metadata: name: mygateway # HTTPRoute resource에서 사용할 이름 namespace: mysystem spec: gatewayClassName: istio-gateway # GatewayClass resource의 name 참조 listeners: - name: http-a # 80 port의 HTTP로 a.example.com의 host traffic을 수신 hostname: "a.example.com" port: 80 protocol: HTTP - name: https-b # 443 port의 HTTPS로 b.example.com의 host traffic을 수신 hostname: "b.example.com" port: 443 protocol: HTTPS tls: # mygateway-credential secret에 저장된 certificate 적용 mode: Terminate certificateRefs: - name: mygateway-credential
YAML
복사
HTTPRoute : HTTP request를 서비스로 routing을 위한 규칙이다. GatewayClass, Gateway 까지는 gateway의 설치에 해당한다면, HTTPRoute 는 gateway가 갖는 다양한 기능을 적용하는 부분이다.
주요 기능 : route by path/header, redirect, URL rewrite, header modification, traffic splitting, cross namespace routing
manifest example
apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute metadata: name: httpbin spec: parentRefs: - name: mygateway # Gateway resource의 name 참조 namespace: mysystem hostnames: - "a.example.com" # rule 적용 대상 incoming host rules: - matches: - path: # /status path를 prefix로 하는 traffic에 대해 적용 type: PathPrefix value: /status - path: # /delay path를 prefix로 하는 traffic에 대해 적용 type: PathPrefix value: /delay backendRefs: # httpbin service의 8000 port로 traffic을 routing - name: httpbin port: 8000
YAML
복사
추가로, HTTPRoute 와 동일 선상에서 gRPC을 대응하는 GRPCRoute나 TCP, UDP에 대응하는 TCPRoute , UDPRoute , HTTPS를 지원하는 TLSRoute 가 있으나 이들은 23.09.24 현재 alpha 버전이며, 이들을 지원하지 않는 제품이 상당하다.
이외에 타 namespace의 Gateway API를 참조하도록 하는 ReferenceGrant 가 있으며 이에 대해서는 https://gateway-api.sigs.k8s.io/api-types/referencegrant/를 참조한다.

Wrap-up

간단히 Kubernetes Gateway API에 대해 알아보았으며 핵심은 ingress + API Gateway에 있다. 또한 담당자 별 역할 기반 resource 분리를 이루기에 역할 분리의 관리적 이점을 얻는다. 한편, Motivation에서 제기한 Service Mesh의 gateway와의 중복 이슈에 대해서는 본 post에서 논하지 않았는데, 이에 대해서는 API Gateway + Service Mesh = Kubernetes Gateway API에서 다룬다.

References

gateway-api
kubernetes-sigs