회원가입을 하면 원하는 문장을
저장할 수 있어요!
다음
AWS 이용 중이라면 최대 700만 원 지원받으세요
지난 1편에서는 쿠버네티스 클러스터 내부 혹은 외부에서 통신하기 위한 서비스에 대해 살펴봤습니다. 이번 편에서 다룰 ‘인그레스(Ingress)’는 서비스와 마찬가지로 외부 사용자와 쿠버네티스 내부로 들어오는 요청을 처리하기 위한 방법입니다. 서비스와는 다른 목적과 차별점이 있으니 함께 알아보겠습니다.
회원가입을 하면 원하는 문장을
저장할 수 있어요!
다음
회원가입을 하면
성장에 도움이 되는 콘텐츠를
스크랩할 수 있어요!
확인
지난 1편에서는 쿠버네티스 클러스터 내부 혹은 외부에서 통신하기 위한 서비스에 대해 살펴봤습니다. 이번 편에서 다룰 ‘인그레스(Ingress)’는 서비스와 마찬가지로 외부 사용자와 쿠버네티스 내부로 들어오는 요청을 처리하기 위한 방법입니다. 서비스와는 다른 목적과 차별점이 있으니 함께 알아보겠습니다.
일반적으로 네트워크 트래픽은 인그레스와 이그레스로 나눠집니다. 인그레스란 외부에서 내부로 들어오는 트래픽을 의미하고 반대로 이그레스는 내부에서 외부로 나가는 트래픽을 의미합니다. 쿠버네티스에서 인그레스는 외부로부터의 접근을 관리하는 API 오브젝트입니다. 즉, URL을 통해 HTTP(S) 접근 경로를 만들어서 외부 트래픽이 내부의 어디에 도달해야 하는지에 대해 정의된 규칙 모음입니다.
이전 글에서도 설명했듯이 로드밸런서(LoadBalacner) 타입의 서비스는 클라우드 서비스 제공사의 로드밸런서에 할당된 공인 IP와 포트를 통해 내부 통신을 지원합니다. 인그레스는 서비스의 기능 외에도 아래와 같은 추가적인 기능을 더 제공합니다.
첫 번째 항목의 가상 호스팅이란 같은 IP에 대해 다른 도메인 이름으로 요청이 도착했을 때, 어떻게 처리할 것인지 정의하는 것을 의미합니다. 두 번째 항목의 URL별 트래픽 분배 기능(로드밸런싱)은 쿠버네티스 환경에서 마이크로 서비스 아키텍처(MSA)를 구현한 서비스에 적합합니다. 따라서 인그레스는 엔터프라이즈 환경의 애플리케이션에서 특히 중요한 서비스입니다. 두 경우의 자세한 예제는 뒤에서 알아보겠습니다.
또한 네트워크 계층에 따른 차이점이 있습니다. 서비스는 여러 파드(pod)로 들어오기 위한 고정 IP 주소와 포트를 제공합니다. 이는 네트워크 7계층에서 IP와 포트를 기반으로 한 TCP/UDP 프로토콜인 L4 계층에 해당합니다. 따라서 서비스는 L4 스위치 역할에 해당합니다.
인그레스는 URL을 제공하여 IP가 아닌 경로를 통해 통신합니다. 이는 HTTP(S)를 기반으로 처리하는 L7 계층에 해당합니다. 따라서 경로 기반의 정교한 HTTP(S) 요청이 가능합니다.
인그레스 컨트롤러는 앞서 말한 기능들을 인그레스 리소스에 따라 HTTP 로드밸런서를 구성하고 실제로 기능을 수행하는 애플리케이션입니다. 외부 접속을 위한 IP와 포트를 생성해 노출하고 내부적으로는 라우팅 규칙에 따라 작동합니다. 따라서 인그레스가 작동하려면 인그레스 컨트롤러가 반드시 필요합니다.
인그레스 컨트롤러에서 정의하는 로드밸런서는 클러스터 내에서 소프트웨어 형식의 로드밸런서로 구현되거나, 외부에서 실행되는 하드웨어 또는 클라우드 형태의 로드밸런서일 수도 있습니다.
인그레스 컨트롤러에는 여러 종류가 있으며 클라우드 서비스 제공사가 제공하는 로드밸런서 형태, 네트워크 회사들이 제공하는 컨트롤러, 오픈소스 기반의 프록시 형태 컨트롤러 등이 있지만, 대표적으로 웹 서버로 유명한 Nginx를 사용한 Nginx 인그레스 컨트롤러가 많이 사용됩니다. Nginx 인그레스 컨트롤러는 Nginx 소프트웨어 자체를 리버스 프록시와 로드밸런서로 활용하며 포드에 배포됩니다.
인그레스를 정의하는 yaml 형식의 메타파일을 보겠습니다. hello-one과 hello-two라는 목적지로 라우팅 되기 위해서 아래와 같이 정의합니다. 인그레스는 미리 생성해둔 Nginx 인그레스 컨트롤러를 사용합니다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: vhosting-ingress
annotations:
kubernetes.io/ingress.class: nginx
spec:
#① 인그레스 라우팅 규칙 시작
rules:
#② 라우팅 규칙을 적용할 호스트(도메인) 이름
- host: hello1.example.com
http:
paths:
- pathType: Prefix
#③ 라우팅 규칙을 적용할 경로
path: "/"
backend:
service:
#④ 라우팅 목적지 서비스 이름
name: hello-one
#⑤ 라우팅 목적지 서비스 포트
port:
number: 80
#⑥ 규칙을 적용할 두 번째 호스트(도메인) 이름
- host: hello2.example.com
http:
paths:
- pathType: Prefix
path: "/"
backend:
service:
name: hello-two
port:
number: 80
항목별 세부적인 내용은 아래와 같습니다.
①: rules 태그를 시작으로 인그레스에서 사용할 라우팅 규칙을 선언합니다.
②: 요청한 호스트(도메인) 이름을 검사하여 해당하는 하위 규칙을 적용합니다.
③: 사용자가 요청한 호스트(도메인)와 요청 경로를 검사합니다. 위 파일에서는 인덱스 페이지( "host:ip/" )인지를 검사합니다.
④: 여기까지 조건이 맞는다면 이 요청은 hello-one 서비스로 연결됩니다.
⑤: hello-one 서비스의 80 포트로 연결합니다.
⑥: 인그레스에서 작동할 두 번째 규칙 역시 호스트(도메인) 조건으로 정의했습니다.
두 규칙 모두 요청한 호스트 이름과 일치하는 하위 규칙을 적용하여 라우팅하겠다는 의미입니다. 즉, 동일한 쿠버네티스 클러스터에서 각각 다른 도메인 이름 (“hello1.example.com”, “hello2.example.com”)으로 서비스를 구분하는 가상 호스팅의 예시입니다. 이 흐름은 아래와 같이 표현할 수 있습니다.
이번에는 동일한 호스트지만 경로에 따라 다른 서비스를 연결하는 인그레스의 메타파일을 보겠습니다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: fanout-ingress
spec:
ingressClassName: nginx
#① 인그레스 라우팅 규칙 시작
rules:
#② 라우팅 규칙을 적용할 호스트(도메인) 이름
- host: hello1.example.com
http:
paths:
#③ 라우팅 규칙을 적용할 경로
- path: /foo
pathType: Prefix
backend:
service:
#④ 라우팅 목적지 서비스 이름
name: hello-one
#⑤ 라우팅 목적지 서비스 포트
port:
number: 4400
#⑥ 라우팅 규칙을 적용할 두 번째 경로
- path: /bar
pathType: Prefix
backend:
service:
name: hello-two
port:
number: 8800
위 구성대로 인그레스를 생성한 내용은 아래와 같습니다.
$kubectl create -f fanout-example.yaml
ingress.networking.k8s.io/fanout-ingress created
$kubectl describe ingress fanout-ingress
Name: fanout-ingress
Labels: <none>
Namespace: default
Address:
Ingress Class: <none>
Default backend: <default>
Rules:
Host Path Backends
---- ---- --------
hello1.example.com
/foo hello-one:4400 (10.2.0.8:80,10.2.1.8:80,10.2.2.7:80)
/bar hello-two:8800 (10.2.0.9:80,10.2.1.9:80,10.2.2.8:80)
Annotations: <none>
Events: <none>
위 내용을 보면 동일한 host로 들어온 요청이 두 개의 경로(“/foo”, “/bar”)에 의해 라우팅 되는 규칙을 따르고 있습니다. 각각의 요청은 4400, 8800 포트의 서비스로 연결되고 80포트를 통해 3개의 파드 중 하나에 접속합니다.
지금까지 인그레스와 인그레스 컨트롤러의 의미를 동일한 호스트에 다른 도메인 이름으로 접근하는 가상 호스팅 방식과 동일한 호스트지만 경로가 다른 방식으로 나누어 살펴봤습니다.쿠버네티스 클러스터에 애플리케이션이 많아지면 외부와의 통신이 복잡해집니다. 이런 상황을 만나게 된다면 앞서 설명한 예제를 참고하여 인그레스를 잘 활용해 보시기 바랍니다.
글 테크유람
편집 오신엽 객원 에디터
요즘IT의 모든 콘텐츠는 저작권법의 보호를 받는 바, 무단 전재와 복사, 배포 등을 금합니다.