인그레스는 클러스터 내의 서비스에 대한 외부 접근을 관리하는 API 게이트웨이이다.
일반적으로 HTTP를 관리하며 로드 밸런서, SSL Termination(클러스터 내에서는 HTTP로만 통신하게 하는 전환 과정), 가상 호스팅을 제공한다.
실습으로 인그레스를 만들고 적용해보자.
1. 먼저 기존 서비스 타입을 LoadBalancer로 ClusterIP로 바꾸고 적용한다.
ClusterIP는 클러스터 내에서만 접근 가능하다.
더 이상 EXTERNAL-IP는 사용할 수 없다.
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
spec:
selector:
app: nginx
type: ClusterIP
ports:
- name: nginx
protocol: TCP
port: 80
targetPort: 80
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 92s
service/nginx ClusterIP 10.99.173.242 <none> 80/TCP 58s
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx
namespace: default
spec:
rules:
- host: localhost
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx
port:
number: 80
kubectl get all
로는 조회가 안되므로 kubectl get all,ingress
로 조회한다.NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-85996f8dbd-dmg8n 1/1 Running 0 69s
pod/nginx-deployment-85996f8dbd-dst2r 1/1 Running 0 69s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 92s
service/nginx ClusterIP 10.99.173.242 <none> 80/TCP 58s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 2/2 2 2 69s
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deployment-85996f8dbd 2 2 2 69s
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress.networking.k8s.io/nginx <none> localhost 80 15s
인그레스는 인그레스 리소스(정책 그 자체) 외에도 인그레스 컨트롤러(정책을 실행시키는 도구)가 반드시 필요하다.
minikube를 사용하는 경우, 인그레스 컨트롤러는 애드온으로 별도의 설치가 필요하다.
공식 문서
터널을 열고, http://localhost 에 접속해본다.
애플리케이션을 외부에 노출시키는 방법으로 앞서 서비스를 배웠다.
외부 IP 주소를 할당해주는 서비스와 로드 밸런서를 생성하고 컨테이너로 트래픽을 보내는 방법을 이용한다.
이렇게 파드를 노출시킬 수 있는데 왜 인그레스를 별도로 사용해야 할까?
바로 인그레스 리소스는 로드밸런싱과 더불어 호스트 기반 라우팅을 지원하기 때문이다.
앞서 서비스를 LoadBalancer에서 ClusterIP로 바꿨기 때문에 인그레스가 로드 밸런서의 역할을 수행해야 한다.
아주 단순한 애플리케이션도 서비스는 두 개 이상의 HTTP 요청을 가지는 것이 보통이다.
보통 각각 Web Server와 WAS로 대표된다.
이러한 서비스의 접근을 별도의 포트로 구분하여 접속하게 할 수도 있지만, 하나의 호스트 상에서 라우팅으로 구분하면 보다 유연한 서비스를 만들 수 있다.
예를 들어 Web Server는
/
로 WAS는/api
로 라우팅 할 수 있다.
YAML 파일에서spec.rules.host
에 별도의 호스트를 지정하여 Web Server는www.mydomain.click
, WAS는api.mydomain.click
으로 설정하는 것도 가능하다.
그렇다면 인그레스 컨트롤러는 무엇일까?
인그레스 컨트롤러라고 해서 뭔가 특별한 프로그램은 아니다.
우리가 흔히 잘 알고 있는 nginx와 같은 애플리케이션이다. (nginx가 하는 일이 결국 호스트 기반 라우팅과 로드 밸런싱이라는 점과 같다.)
즉 인그레스 컨트롤러는 규칙을 이행하는 실질적인 애플리케이션 컨테이너다.