[1주차] Kubernetes Gateway API를 활용한 Istio 외부 노출 구성 실습

y001·2025년 4월 13일

Istio 실전 스터디

목록 보기
2/26

기존에는 Istio의 Ingress Gateway와 VirtualService를 통해 외부 트래픽을 내부 서비스로 전달했다. 하지만 최근에는 Kubernetes의 표준 Gateway API를 활용해 VirtualService 없이도 외부 노출이 가능해졌다. 이번 실습에서는 Istio 1.25.1 버전과 Gateway API를 사용하여 httpbin 서비스에 접근하는 흐름을 구성해보았다.


1. 실습 목표

  • Kubernetes Gateway API 구조 이해
  • VirtualService 없이 httpbin에 외부에서 접근 가능하도록 구성
  • Istio가 Gateway API 리소스를 감지하고 정상 라우팅하는지 확인

2. 실습 환경

  • 클러스터: kind 0.20.0 (k8s 1.23.17)
  • Istio: 1.25.1
  • Gateway API CRD 포함
  • OS: macOS

3. Istio 설치 (Gateway API 지원 포함)

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

4. GatewayClass 생성

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

5. Gateway 리소스 정의

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

6. HTTPRoute 설정

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

7. httpbin 서비스 배포

Istio 공식 샘플을 통해 배포하였다.

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.25/samples/httpbin/httpbin.yaml

Pod와 Service가 정상적으로 생성되었는지 확인한다.


8. 외부 접속 테스트

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만으로 라우팅이 성공한 것이다.


9. VirtualService 미사용 확인

kubectl get virtualservices
출력 결과 없음  

→ 실제로 Gateway API 기반 리소스만으로 트래픽 라우팅이 가능하다는 것을 확인함.

0개의 댓글