인그레스(Ingress)란?
쿠버네티스 인그레스의 정의는 아래와 같다.
A Kubernetes Ingress is an API object that shows how traffic from the internet should reach internal Kubernetes cluster Services that send requests to groups of Pods. The Ingress itself has no power. ( 출처 )
서비스(Service)는 외부포트와 Pod포트를 포워딩하여 Pod에 트래픽이 전달되도록 한다. 그런데 한 가지 문제가 있다. 다양한 서비스가 존재하므로 다양한 포트가 외부로 노출되고 클라이언트는 서비스별로 포트번호를 달리하여 접근해야 한다.
이런 불편을 해결하기 위해 등장한 것이 '프록시 서버'이다.
클라이언트가 프록시 서버에 요청을 보내면 프록시 서버는 경로를 기준으로 서비스를 구분한다. 클라이언트는 포트구분 없이 원하는 서비스에 접근이 가능해진다. 이때의 프록시 서버를 시스템 내부로 가져올 수 있는데, 이를 '리버스 프록시 서버(Reverse Proxy Server )라 부른다.
그리고 쿠버네티스 클러스터 내부 존재하는 리버스 프록시 서버를 두고 '인그레스(Ingress)'라 부른다.
인그레스 컨트롤러(Ingress Controller) 란?
Ingress controllers are not started automatically with a cluster. Use this page to choose the ingress controller implementation that best fits your cluster. ( 출처 )
쿠버네티스 API에 인그레스는 존재하지만 인그레스 컨트롤러는 생성되지 않는다. 클러스터가 어떤 환경이냐에 따라 적용가능한 인그레스 클러스터가 달라지기 때문이다.
인그레스는 일종의 그릇이다. 인그레스가 어떤 방식으로 동작할지는 인그레스 컨트롤러에 따라 달라진다. 인그레스를 동작시킬 구현체가 인그레스 컨트롤러인 것이다. 인그레스는 이런 다형성을 지니기에, 여러 개의 인그레스 컨트롤러를 배포하여 사용할 수 있다.
If you do not specify an IngressClass for an Ingress, and your cluster has exactly one IngressClass marked as default, then Kubernetes applies the cluster's default IngressClass to the Ingress. ( 출처 )
여러 개의 인그레스 컨트롤러를 사용하는 경우, 한 가지 인그레스 컨트롤러를 디폴트로 지정해두어야 한다. 만약 인그레스에 인그레스 클래스, 즉 인그레스 컨트롤러가 지정되지 않으면 디폴트로 설정된 인그레스 컨트롤러가 지정되어 사용된다.
인그레스 룰 ( Ingress Rule )
인그레스를 동작시킬 인그레스 컨트롤러가 정해지면 어떤 방식으로 라우팅할지 룰(Rule)을 정해야 한다. /service1의 경로로 들어오면 Service1으로, /service2로 들어오면 Service2로 라우팅 될 수 있도록 라우팅 룰을 정해주어야 한다.
인그레스 리소스 ( Ingress Resource )
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: simple-fanout-example
spec:
rules:
- host: foo.bar.com
http:
paths:
- path: /foo
pathType: Prefix
backend:
service:
name: service1
port:
number: 4200
- path: /bar
pathType: Prefix
backend:
service:
name: service2
port:
number: 8080
인그레스 규칙은 인그레스 리소스 파일(yaml)에 적혀있다. 인그레스 컨트롤러가 인그레스 규칙에 맞게 동작할 수 있도록 인그레스 리소스를 인그레스 컨트롤러에 적용해야 한다.
kubectl apply -f ingress-resouce.yaml
kubectl apply 명령어로 인그레스 리소스를 인그레스 컨트롤러에 적용하면 라우팅 룰이 적용된다. 그러면 인그레스로 들어온 트래픽은 라우팅룰에 따라 컨트롤러에 의해 특정한 서비스로 전달된다.
정리하면,
쿠버네티스 클러스터가 구성되면 쿠버네티스 API에 인그레스가 생성된다. 인그레스는 마치 빈그릇과 같은데, 개발자가 선택한 환경에 따라 적합한 형태로 동작하도록 인그레스 구현체를 선택할 수 있다. 이때의 인그레스 구현체가 인그레스 컨트롤러이다. 환경에 적합한 인그레스 컨트롤러가 배포되면 인그레스 컨트롤러에 라우팅룰을 적용해야 한다. 라우팅룰이 저장된 인그레스 리소스를 kubectl apply 명령어 인그레스 컨트롤러에 적용한다. 그러면 인그레스가 리버스 프록시 서버로 동작할 준비가 완료된다.
다음 포스팅에서는 minikube를 활용하여 실제 인그레스를 구현해보고 path로 라우팅이 되도록 실습해보겠다.
참고자료
'DevOps > K8S' 카테고리의 다른 글
[Kubernetes] 프론트엔드, 백엔드 서비스 및 디플로이먼트 생성하기 (0) | 2023.10.12 |
---|---|
[Kubernetes] Minikube 설치 및 인그레스 설치 및 설정하기 (0) | 2023.10.12 |
[Kubernetes] 우분투 환경에서 클러스터 구성하기(4) - 마스터노드, 워커노드 구성하기 (0) | 2023.09.26 |
[Kubernetes] 우분투 환경에서 클러스터 구성하기(3) - 넷필터 브릿지 (0) | 2023.09.25 |
[Kubernetes] 우분투 환경에서 클러스터 구성하기(2) - kubeadm, kubelet, kubectl (0) | 2023.09.22 |