HTTP 마이그레이션 예제

HTTP 마이그레이션 예제 (HTTP Migration Example)

이 예제는 기존 Ingress 구성을 동등한 Gateway API 리소스로 마이그레이션하는 방법을 보여드려요. Cilium Ingress HTTP 예제를 시작 Ingress 구성으로 사용하며, 같은 접근 방식이 다른 컨트롤러에도 적용돼요 (다만 각 Ingress 컨트롤러 구성은 다를 수 있어요).

출처: HTTP Migration Example

본문

이 예제는 기존 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)