HTTP 마이그레이션 예제
HTTP 마이그레이션 예제 (HTTP Migration Example)
이 예제는 기존 Ingress 구성을 동등한 Gateway API 리소스로 마이그레이션하는 방법을 보여드려요. Cilium Ingress HTTP 예제를 시작 Ingress 구성으로 사용하며, 같은 접근 방식이 다른 컨트롤러에도 적용돼요 (다만 각 Ingress 컨트롤러 구성은 다를 수 있어요).
본문
이 예제는 기존 Ingress 구성을 동등한 Gateway API 리소스로 마이그레이션하는 방법을 보여드려요.
Cilium Ingress HTTP 예제가 시작 Ingress 구성으로 사용돼요. 각 Ingress 컨트롤러 구성은 다르지만, 같은 접근 방식이 다른 컨트롤러에도 적용돼요.
예시 Ingress 구성은 Istio 프로젝트의 bookinfo 데모 마이크로서비스 앱의 백엔드 서비스로 트래픽을 라우팅해요.
Ingress 구성 검토하기 (Review Ingress Configuration)
예시 Ingress 정의는 basic-ingress.yaml에서 찾을 수 있어요.
# Basic ingress for istio bookinfo demo application, which can be found in below
# https://raw.githubusercontent.com/istio/istio/release-1.11/samples/bookinfo/platform/kube/bookinfo.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: basic-ingress
namespace: default
spec:
ingressClassName: cilium
rules:
- http:
paths:
- backend:
service:
name: details
port:
number: 9080
path: /details
pathType: Prefix
- backend:
service:
name: productpage
port:
number: 9080
path: /
pathType: Prefix
이 예제는 포트 80의 트래픽을 수신하고, /details 경로에 대한 요청을 details 서비스로, /를 productpage 서비스로 라우팅해요.
동등한 Gateway 구성 만들기 (Create Equivalent Gateway Configuration)
동등한 Gateway 구성을 만들려면 다음을 고려해주세요:
-
진입점 (Entry Point)
-
진입점은 외부 클라이언트가 데이터 플레인에 접근하는 IP 주소와 포트의 조합이에요.
-
Ingress: 모든 Ingress 리소스에는 HTTP용과 HTTPS용 두 개의 암시적 진입점이 있어요. Ingress 컨트롤러가 진입점을 제공해요. 보통 진입점은 모든 Ingress 리소스가 공유하거나, 각 Ingress 리소스가 전용 진입점을 가져요.
apiVersion: networking.k8s.io/v1 kind: Ingress spec: ingressClassName: cilium -
Gateway API: Gateway API에서는 진입점을 Gateway 리소스에 명시적으로 정의해야 해요. 예를 들어 데이터 플레인이 포트 80의 HTTP 트래픽을 처리하려면 그 트래픽에 대한 리스너를 정의해야 해요. 보통 Gateway 구현은 각 Gateway 리소스에 전용 데이터 플레인을 제공해요.
apiVersion: gateway.networking.k8s.io/v1beta1 kind: Gateway metadata: name: cilium-gateway spec: gatewayClassName: cilium listeners: - name: http port: 80 protocol: HTTP
-
-
라우팅 규칙 (Routing Rules)
-
Ingress나 Gateway API를 사용할 때는 애플리케이션을 그 진입점에 붙이기 위해 라우팅 규칙을 정의해야 해요.
-
Ingress: 경로 기반 라우팅 규칙은 Ingress 리소스에 구성돼요. Ingress 리소스에서 각 호스트 이름에는 별도의 라우팅 규칙이 있어요:
apiVersion: networking.k8s.io/v1 kind: Ingress [...] rules: - http: paths: - backend: service: name: details port: number: 9080 path: /details pathType: Prefix - backend: service: name: productpage port: number: 9080 path: / pathType: Prefix -
Gateway API: 라우팅 규칙은 HTTPRoute에 구성돼요.
--- apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute spec: parentRefs: - name: cilium-gateway rules: - matches: - path: type: PathPrefix value: / backendRefs: - name: productpage port: 9080 - matches: - path: type: PathPrefix value: /details backendRefs: - name: details port: 9080
-
-
붙을 데이터 플레인 선택하기 (Selecting Data Plane to Attach to)
-
Ingress와 Gateway API 리소스 모두 명시적으로 Dataplane에 붙어야 해요.
-
Ingress: Ingress 리소스는 어떤 Ingress 컨트롤러를 사용할지 선택하는 클래스를 지정해야 해요.
apiVersion: networking.k8s.io/v1 kind: Ingress spec: ingressClassName: cilium -
Gateway API: Gateway 리소스도 클래스를 지정해야 해요. 이 예제에서는 항상
cilium클래스예요. HTTPRoute는parentRef로 어떤 Gateway(들)에 붙을지 지정해야 해요.apiVersion: gateway.networking.k8s.io/v1beta1 kind: Gateway metadata: name: cilium-gateway namespace: default spec: gatewayClassName: cilium [...] --- apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute spec: parentRefs: - name: cilium-gateway
-
동등한 Gateway 구성 검토하기 (Review Equivalent Gateway Configuration)
동등한 최종 Gateway와 HTTPRoute 정의는 http-migration.yaml에서 찾을 수 있어요.
---
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
name: cilium-gateway
namespace: default
spec:
gatewayClassName: cilium
listeners:
- name: http
port: 80
protocol: HTTP
---
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
name: all-hosts
namespace: default
spec:
parentRefs:
- name: cilium-gateway
rules:
- matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: productpage
port: 9080
- matches:
- path:
type: PathPrefix
value: /details
backendRefs:
- name: details
port: 9080
앞선 예제는 포트 80의 HTTP 트래픽을 수신하는 cilium-gateway라는 Gateway를 만들어요. /details에 대해 details 서비스로, /에 대해 productpage 서비스로 가는 두 개의 라우트가 정의돼요.
리소스를 배포하고 HTTP 요청이 서비스로 성공적으로 라우팅되는지 확인해보세요. 자세한 내용은 Gateway API HTTP 예제를 참고해주세요.
더 알아보기 (Learn more)
- Ingress에서 Gateway로 마이그레이션 — 마이그레이션 개요
- TLS 마이그레이션 — TLS 설정 마이그레이션
- Gateway API (HTTP) — HTTP Gateway 예제