Ingress의 뜻 : Ingress는 외부로부터 서버 내부로 유입되는 네트워크 트래픽.
Ingress는 서비스의 한 종류가 아니다. 여러 서비스들 앞에서 “스마트 라우터(smart router)” 역할을 하거나 클러스터의 진입점(entrypoint) 역할을 한다.
한 마디로 정리하면 Kubernetes 내의 서비스에 대한 외부 접근을 관리하는 API 오브젝트입니다.
그러면 Ingress와 서비스의 큰 차이가 무엇인지 의문점이 들 수 있다. 가장 큰 차이는 Service는 L4이고 Ingress L7이라는 것이다. 여기서 L4와 L7은 계층을 나타내며, OSI의 7Layer에 대한 네트워크의 지식이 필요하다. 좀 더 쉽게 말하면 계층에 따라 다룰 수 있는 영역이 달라지는데 L7인 Ingress는 훨씬 더 많은 것을 다룰 수 있기 때문에 보안 및 다양한 측면에서 이득을 가져 갈 수 있다.
- L4 Load Balancer는 IP, Port 를 기준으로 스케줄링 알고리즘을 통해 부하를 분산합니다. 클라이언트에서 로드밸런서(DNS)로 요청을 보냈을 때 최적의 서버로 요청을 전송하고 결과를 클라이언트에게 줍니다. 즉, 요청하는 서비스의 종류와 상관 없이 공장을 여러 개 돌리는 것입니다.
- L7 Load Balancer는 L7 위에서 동작하기 때문에 IP, Port 이외에도 URI, Payload, Http Header, Cookie 등의 내용을 기준으로 부하를 분산합니다. 그래서 콘텐츠 기반 스위칭이라고도 합니다.
궁극적으로 Ingress도 결국 서비스를 밖에 노출하며 트래픽을 효율적으로 할당하기 위한 API로 생각하면 편하다.
Ingress를 정의하는 위 YAML 파일은 매우 간단하다. [1] alicek106.com 이라는 호스트 명으로 접근하는 네트워크 요청에 대해서 Ingress 규칙을 적용하되, [2] http 프로토콜을 통해 [3] /api/hostname-service 라는 경로로 접근하는 요청을 [4] hostname-service 라는 이름의 Service의 80 포트로 전달하라는 뜻이다.
하지만 Ingress는 단순히 yaml 파일을 작성해준다고 생기지 않습니다. 그러면 무엇을 또 해야하나?
Ingress는 단지 Ingress 규칙을 정의하는 선언적인 오브젝트일 뿐, 외부 요청을 받아들이는 실제 서버가 아니기 때문이다. Ingress는 Ingress Controller라고 하는 특수한 서버 컨테이너에 적용되어야만 Ingress에 적용된 규칙이 활성화된다. 즉, Ingress Controller가 외부로부터 네트워크 요청을 수신했을 때, Ingress 규칙에 기반해 이 요청을 어떻게 처리할지를 결정한다.
Controller로는 클라우드 플랫폼에 위임하는 방법과 직접 운영하는 방법이 있습니다. 주로 대부분 Nginx Ingress Controller를 제일 많이 활용하고 있다.
Ingress뿐만 아니라 서비스끼리도 헷갈렸지만, 그래도 많이 정리된 느낌이다. 위의 그림을 보면 또 Ingress Controller를 사용하기 위해서 외부포트를 열어줘야하는데 그 과정에서 LoadBalancer 아니면 NodePort가 활용된다. 서로가 하는 역할과 차이점을 좀 더 잘 기억하고 가기를 바란다. 필자도 주기적으로 복습할 예정입니다. 다음 글은 AWS의 EC2또는 EKS에 대해 공부하고자 한다. 틈틈히 네트워크 지식도 정리해보도록 하겠습니다.