본문 바로가기

카테고리 없음

인그레스의 구조와 이해

인그레스란?

인그레스는 일반적으로 외부에서 내부로 향하는 것을 지칭하는 단어입니다. 예를 들어 그레스 트래픽은 외부에서 서버로 유입되는 트래픽을 말하며, 인그레스 네트워크는 인그레스 트래픽을 처리하기 위한 네트워크를 의미합니다. 이전에 사용해 봤던 서비스 오브젝트가 외부 요청을 받아들이기 위한 것이었다면 인그레스는 외부 요청을 어떻게 처리할 것인가? 네트워크 7계층 레벨에서 정의하는 쿠버네티스 오브젝트입니다. 여기서 처리한다는 문장에는 많은 기능이 내포되어있습니다. 인그레스 오브젝트가 담당할 수 있는 기본적인 기능만 간단히 나열해보면 다음과 같습니다.

① 외부 요청의 라우팅 : /apple,/apple/red 등과 같이 특정 경로로 들어온 요청을 어떠한 서비스로 전달할지 정의하는 라우팅 규칙을 설정할 수 있습니다.


② 가상호스트 기반의 요청 처리 : 같은 IP에 다른 도메인 이름으로 요청이 도착했을 때, 어떻게 처리할 것인지 정의할 수 있습니다.


③ SSL/TLS 보안 연결 처리 : 여러 개의 서비스로 요청을 라우팅할 때, 보안 연결을 위한 인증서를 쉽게 적용할 수 있습니다.

하지만 인그레스 기능이 위 기능에만 제한되는 것은 아니며, 여러분이 인그레스를 어떻게 활용하느냐에 따라 다양한 기능을 사용할 수 있습니다. 뒤에서 조금 더 자세히 설명하겠지만, 인그레스 자체의 기능은 비교적 정해져 있더라도 인그레스의 요청을 처리할 서버로 무엇을 선택하느냐에 따라 기능이 조금씩 달라집니다.

인그레스를 사용해야 되는 이유

위에서 설명한 기능들만 봤을 때 인그레스를 사용해야 되는 이유를 느끼지 못할 것입니다. 인그레스를 왜 사용해야 되는지 추가적인 설명을 해보겠습니다. 각 디플로이먼트를 외부에 노출해야 한다면 NodePort 또는 Load Balancer 타임의 서비스 3개를 생성하는 방법을 먼저 떠올릴 것입니다. 한마디로 왜 인그레스를 사용해야 되냐라고 정의를 해보겠습니다. 외부 요청에 대한 처리 규칙을 쿠버네티스 자체의 기능으로 편리하게 관리할 수 있어서 인그레스를 사용한다고 보시면 됩니다.

인그레스의 구조

인그레스는 쿠버네스트에서 ingress라는 이름으로 사용할 수 있으며, kubectl get ingress 명령어로 인그레스 목록을 확인할 수 있습니다. 여러분이 인그레스를 처음 사용해본다면 아직 인그레스가 존재하지 않을 것입니다.


kubectl get ingress

kubectl get ing # ing라는 이름으로도 사용 가능

No resources found.


인그레스를 정의하는 YAML 파일을 간단히 설명해보면 아래와 같습니다.

[1]host : 해당 도메인 이름으로 접근하는 요청에 대해서 처리 규칙을 적용합니다. 위 예시에서 alicek106.example.com이라는 도메인으로 접근하는 요청만 처리하지만, 여러 개의 host를 정의해 사용할 수 있습니다.


[2]path : 해당 경로에 들어온 요청을 어느 서비스로 전달할 것인지 정의합니다. 위 예시에서는 /echo-hostname이라는 경우로 요청을 backend에 정의된 서비스로 전달합니다. 여러 개의 path를 정의해 경로를 처리할 수도 있습니다.


[3]serviceName,servicePort : path로 들어온 요청이 전달될 서비스와 포트입니다. 

인그레서를 정의하는 YAML 파일 중에서 annotation 항복을 통해 인그레스의 추가적인 기능을 사용할 수 있으며, 위의 YAML 파일에서도 두 가지의 주석을 사용했습니다. ingress-example·yaml 파일로 인그레스를 생성한 다음, 인그레스의 목록을 확인해 보겠습니다.

kubectl apply -f ingress-example·yaml

ingress.networking.k8s.io/ingress-example created

kubectl get ingress

ingress-example이라는 이름의 인그레스를 생성했지만, 이것만으로는 아무 일도 일어나지 않습니다. 인그레스는 단지 요청을 처리하는 규칙을 정의하는 선언적인 오브젝트일뿐, 외부 요청을 받아들일 수 있는 실제 서버가 아니기 때문입니다. 인그레스는 인그레스 컨트롤러라고 하는 특수한 서버에 적용해야만 그 규칙을 사용할 수 있습니다. 즉 실제로 외부 요청을 받아들이는 것은 인그레스 컨트롤러 서버이고, 이 서버가 인그레스 규칙을 로드해 사용을 합니다. 따라서 쿠버네티스의 인그레스는 반드시 인그레스 컨트롤러라는 서버와 함께 사용해야 합니다. 인그레스 컨트롤러 서버는 여러 종류가 있으며, 필요에 따라 하나를 골라서 사용하면 됩니다. 대표적으로는 쿠버네티스 커뮤니티에서 활발히 사용되고 있는 Nginx 웹 서버 인그레스 컨트롤러가 있습니다. 

인그레스 컨트롤러의 동작 원리 이해

인그레스를 사용하는 방법을 순서대로 정리해보겠습니다.

① 공식 허브에서 제공되는 YAML 파일로 Nginx 인그레스 컨트롤러를 생성합니다.

② Nginx 인그레스 컨트롤러를 외부로 노출하기 위한 서비스를 생성합니다.

③ 요청 처리 규칙을 정의하는 인그레스 오브젝트를 생성합니다.

④ Niginx 인그레스 컨트롤러로 들어온 요청은 인그레스 규칙에 따라 적절한 서비스로 전달합니다.

위 과정 중 3번에서 인그레스를 생성하면 인그레스 컨트롤러는 자동으로 인그레스를 로드해 Nginx 웹 서버에 적용합니다. 이를 위해 Nginx 인그레스 컨트롤러는 항상 인그레스 리소스의 상태를 지켜보고 있으며, 기본적으로 모든 네임스페이스와 인그레스 리소스를 읽어와 규칙을 적용합니다. 특정 경로와 호스트 이름으로 들어온 요청은 인그레스에 정의된 규칙에 따라 서비스로 전달됩니다. 하지만 요청이 실제로 hostname-service라는 서비스로 전달되는 것은 아니며, Nginx 인그레스 컨트롤러는 서비스에 의해 생성된 엔트포인트로 요청을 직접 전달합니다. 즉 서비스의 Cluster IP가 아닌 엔트포인트의 실제 종착 지점들로 요청이 전달 되는셈입니다. 이러한 동작을 쿠버네티스에서는 바이패스라고 합니다.

Nginx 인그레스 컨트롤러에 SSL/TLS 보안 연결 적용

인그레스의 장점 중 하나는 쿠버네티스의 뒤쪽에 있는 디플로이먼트와 서비스가 아닌 앞쪽에 있는 인그레스 컨트롤러에서 편리하게 SSL/TLS 보안연결을 설정할 수 있다는 것입니다. 즉 인그레스 컨트롤러 지점에서 인증서를 적용해 두면 요청이 전달되는 애플리케이션에 대해 모두 인증서 처리를 할 수 있습니다. 따라서 인그레스 컨트롤러가 보안 연결을 수립하기 위한 일종의 게이트웨이 역할을 할 수 있습니다. Nginx 인그레스 컨트롤러 또한 인증서를 통한 보안 연결 기능을 제공하기 때문에 어렵지 않게 보안 연결을 설정할 수 있습니다. 

$ openssl req -x509 -nodes -days 365 -newkey ras:2048 \