개요
쿠버네티스 환경에서 동작하는 서비스를 외부에서 접근할 수 있도록 구성하는 방법은 여러 가지가 존재한다. 그중 2024.04.29-[Istio] Ingress Gateway - Gateway/VirtualService에서는 Gateway와 VirualService를 구성해 외부에서 서비스를 접근할 수 있도록 설정했었다.
이번 글에서는 https://killercoda.com/lorenzo-g의 Ingress - Kubernetes를 따라해보면서 Istio, Kubernetes Ingress 리소스를 구성하여 서비스를 접근할 수 있도록 구성하는 방법을 적어둔다. 아래 그림의 왼편에 해당된다.
애플리케이션 자체는 이미 동작 중인 환경이다.
Istio Gateway
VirtualService와 Gateway로 구성했을 때와 마찬가지로 Istio Gateway 자체는 필요한 것 같다.
실습 환경에는 LoadBalacner 타입으로 서비스가 구성되어 있는 상태였다.
Ingress Class
Kubernetes Ingres는 Ingress Class와 Ingress 리소스로 구성된다. 그중 Ingress Class는 nginx ingress controller나 istio controller 등과 같은 컨트롤러를 통해 지원된다.
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: istio
spec:
controller: istio.io/ingress-controller
Ingress Class는 쿠버네티스 1.18 이전에 Ingress에서 어노테이션으로 지원하던 kubernetes.io/ingress.class 항목을 대체한다.
apiVersion: v1
items:
- apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
meta.helm.sh/release-name: notebook
meta.helm.sh/release-namespace: notebook
nginx.ingress.kubernetes.io/proxy-body-size: 500m
만약 구성하는 Ingress Class을 기본값으로 사용하고 싶다면 어노테이션에 ingressclass.kubernetes.io/is-default-class를 true로 지정하면 된다.
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: istio
annotations:
ingressclass.kubernetes.io/is-default-class: "true"
spec:
controller: istio.io/ingress-controller
Ingress
Ingress Class를 생성했다면 Ingress를 리소스를 생성한다. 생성 시 필요한 정보는 기존과 다르지 않다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: booking-ingress
spec:
ingressClassName: istio
rules:
- host: booking.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: booking-service
port:
number: 80
접근 테스트
이제 구성한 도메인을 사용해 서비스에 접근할 수 있다. istio-ingressgateway가 외부 로드밸런서와 연결되지 않은 상태이므로 노드 포트를 통해 접근하도록 한다.
curl http://booking.example.com:30000/bookings; \
echo;
참고 문서
https://kube.academy/guides/service-routing-istio-refarch#ingress-controller-in-kubernetes-with-istio
https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/
https://kubernetes.io/docs/concepts/services-networking/ingress/#ingress-class