2025-11-12 4:20 PM
요약: “Nginx Ingress가 당장 ‘갑자기’ 사라진다”기보다는, Kubernetes 네트워킹 표준이 Ingress → Gateway API로 이동하고 있고, 일부 배포판/조합에서는 Ingress 컨트롤러 유지보수·정책 변화·운영 부담이 커지면서 Gateway API 기반으로의 전환이 점점 더 합리적인 선택이 되고 있습니다.
이 글은 NGINX Ingress(ingress-nginx) 사용 클러스터를 기준으로, Gateway API(Gateway/HTTPRoute) 로 안전하게 이관하는 실전 가이드입니다.
Ingress는 “간단한 HTTP 라우팅”에는 좋지만, 다음과 같은 한계가 있습니다.
Gateway API는 이를 개선합니다.
GatewayClass, Gateway, HTTPRoute, ReferenceGrant 등Gateway/LB/인증서, 앱 팀은 HTTPRoute이관 전에 “우리가 무엇을 쓰고 있는지”를 먼저 명확히 해야 합니다.
kubectl get ingress -A
kubectl get ingress -A -o yaml > all-ingress.yaml예:
nginx.ingress.kubernetes.io/rewrite-targetnginx.ingress.kubernetes.io/ssl-redirectnginx.ingress.kubernetes.io/proxy-body-sizenginx.ingress.kubernetes.io/canary, canary-weightnginx.ingress.kubernetes.io/auth-* (basic, oauth2-proxy)이 annotation들이 Gateway API에서 어떤 표준/확장 기능으로 치환되는지가 핵심입니다.
Gateway API는 CRD만 설치한다고 동작하지 않습니다. Gateway API를 구현하는 컨트롤러가 필요합니다.
여기서는 “개념과 매니페스트 구조”를 기준으로 설명합니다. 실제 컨트롤러 설치 방식(Helm 값 등)은 사용 솔루션에 맞춰 적용하세요.
spec.rules.host)spec.rules.http.paths)spec.tls)GatewayClass: 어떤 컨트롤러가 관리하는지Gateway: 실제 “진입점”(Listener: HTTP/HTTPS, port, hostname)HTTPRoute: 라우팅 규칙(호스트/경로/헤더/백엔드)apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app
namespace: app
spec:
ingressClassName: nginx
rules:
- host: app.example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: app-svc
port:
number: 80
tls:
- hosts:
- app.example.com
secretName: app-tlsapiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: my-gwclass
spec:
controllerName: example.io/gateway-controller
controllerName은 사용하는 Gateway 컨트롤러 문서에 맞춰야 합니다.
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: edge
namespace: gateway
spec:
gatewayClassName: my-gwclass
listeners:
- name: https
protocol: HTTPS
port: 443
hostname: app.example.com
tls:
mode: Terminate
certificateRefs:
- kind: Secret
name: app-tls
namespace: app주의: 다른 네임스페이스의 Secret을 참조하려면 컨트롤러/정책에 따라 ReferenceGrant가 필요할 수 있습니다.
apiVersion: gateway.networking.k8s.io/v1beta1
kind: ReferenceGrant
metadata:
name: allow-gateway-to-app-tls
namespace: app
spec:
from:
- group: gateway.networking.k8s.io
kind: Gateway
namespace: gateway
to:
- group: ""
kind: SecretapiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: app-route
namespace: app
spec:
parentRefs:
- name: edge
namespace: gateway
hostnames:
- app.example.com
rules:
- matches:
- path:
type: PathPrefix
value: /api
backendRefs:
- name: app-svc
port: 80nginx.ingress.kubernetes.io/ssl-redirect: "true"패턴
Gateway에 HTTP(80) + HTTPS(443) 둘 다 Listener를 만들고Redirect는 표준화 진행 중인 영역이거나 컨트롤러별 Policy로 제공됩니다.
rewrite-target: /$1 등URLRewrite 필터로 처리(지원 컨트롤러일 때)filters:
- type: URLRewrite
urlRewrite:
path:
type: ReplacePrefixMatch
replacePrefixMatch: /backendRefs에 weight로 트래픽 분할backendRefs:
- name: app-svc
port: 80
weight: 90
- name: app-svc-canary
port: 80
weight: 10Ingress는 여전히 널리 쓰이지만, 표준화·확장성·역할 분리 측면에서 Gateway API가 점점 더 주류가 되고 있습니다.
다음 글에서는 실제로 ingress-nginx → (예: Envoy Gateway / Cilium Gateway API / NGINX Gateway Fabric) 중 하나를 선택해, Helm 값과 실운영 구성을 좀 더 “현실적인 매니페스트”로 정리해 보겠습니다.