기존에는 Istio의 Ingress Gateway와 VirtualService를 통해 외부 트래픽을 내부 서비스로 전달했다. 하지만 최근에는 Kubernetes의 표준 Gateway API를 활용해 VirtualService 없이도 외부 노출이 가능해졌다. 이번 실습에서는 Istio 1.25.1 버전과 Gateway API를 사용하여 httpbin 서비스에 접근하는 흐름을 구성해보았다.
Istio 설치 전, 최신 Gateway API CRD가 설치된 상태를 유지해야 한다.
이후 istioctl로 demo profile을 이용하여 설치하였다.
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.25.1 sh -
cd istio-1.25.1
export PATH=$PWD/bin:$PATH
istioctl install --set profile=demo -y
Istio는 Gateway API 리소스를 감지하기 위해 controllerName을 지정한다.
apiVersion: gateway.networking.k8s.io/v1beta1
kind: GatewayClass
metadata:
name: istio
spec:
controllerName: istio.io/gateway-controller
kubectl apply -f gatewayclass.yaml
Gateway 리소스를 통해 외부 트래픽이 들어올 entry point를 정의한다.
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
name: httpbin-gateway
namespace: default
spec:
gatewayClassName: istio
listeners:
- name: http
port: 80
protocol: HTTP
allowedRoutes:
namespaces:
from: Same
kubectl apply -f gateway.yaml
VirtualService 없이 HTTPRoute만으로 라우팅을 설정한다.
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
name: httpbin-route
namespace: default
spec:
parentRefs:
- name: httpbin-gateway
rules:
- matches:
- path:
type: PathPrefix
value: /status
backendRefs:
- name: httpbin
port: 8000
kubectl apply -f httproute.yaml
Istio 공식 샘플을 통해 배포하였다.
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.25/samples/httpbin/httpbin.yaml
Pod와 Service가 정상적으로 생성되었는지 확인한다.
Ingress Gateway의 EXTERNAL-IP 또는 NodePort 주소를 확인하고, curl 요청을 보낸다.
kubectl get svc istio-ingressgateway -n istio-system
export INGRESS_HOST=<확인된 IP>
curl http://$INGRESS_HOST/status/200
응답이 정상적으로 도달하면 Gateway + HTTPRoute만으로 라우팅이 성공한 것이다.
kubectl get virtualservices
출력 결과 없음
→ 실제로 Gateway API 기반 리소스만으로 트래픽 라우팅이 가능하다는 것을 확인함.