쿠버네티스 인그레스(Ingress) - 클러스터 외부 트래픽 관리의 핵심 😎
쿠버네티스 세상을 여행 중인 여러분! 🚀 혹시 클러스터 외부에서 내부 서비스로 접근하는 방법을 설정하다가 머리가 복잡해진 경험 있으신가요? 마치 여러 개의 문을 관리하는 건물 경비원처럼, 여러 서비스를 외부 세계와 연결하는 것은 꽤 까다로운 일이죠. 오늘은 이 문제를 해결해 줄 쿠버네티스의 똑똑한 문지기, **인그레스(Ingress)에 대해 쉽고 재미있게 알아보겠습니다! 🎉
등장 배경: 옛날 옛적 트래픽 관리는... 🤔
쿠버네티스가 등장하기 전, 혹은 인그레스 개념이 정립되기 전에는 외부에서 클러스터 내부의 서비스에 접근하려면 주로 두 가지 방법을 사용했습니다.
- NodePort: 각 노드(서버)의 특정 포트를 열어서 외부 요청이 해당 포트로 들어오면 지정된 서비스로 전달하는 방식이에요. 마치 각 방마다 외부로 통하는 쪽문을 여러 개 내는 것과 같죠. 관리할 포트가 많아지고, 노드의 IP가 변경되면 외부에서도 접속 주소를 바꿔야 하는 번거로움이 있었습니다. 😥
- LoadBalancer (클라우드 제공): 클라우드 서비스 제공업체(AWS, GCP, Azure 등)의 로드 밸런서를 생성해서 외부 요청을 서비스로 분산하는 방식입니다. 가장 안정적이고 편리하지만, 서비스마다 별도의 로드 밸런서가 필요할 수 있어 비용 부담이 커질 수 있다는 단점이 있었죠. 💰
이런 방식들은 소규모 환경에서는 괜찮을 수 있지만, 서비스가 많아지고 복잡해질수록 관리 포인트가 늘어나고 비용 문제도 발생했습니다. "하나의 외부 IP와 포트로 들어오는 요청을 내부의 여러 서비스로 깔끔하게 나눠줄 수는 없을까?" 하는 고민에서 인그레스가 등장하게 됩니다! 🌟
인그레스의 특징/용도: 무엇을 해결해 주나요? 🧐
인그레스는 클러스터 외부에서 들어오는 HTTP/HTTPS 요청을 내부 서비스로 연결해주는 규칙들의 집합입니다. 마치 똑똑한 교통 경찰관처럼, 들어오는 요청의 주소(호스트 이름)나 경로(Path)를 보고 적절한 서비스로 안내하는 역할을 하죠. 인그레스가 해결해 주는 주요 문제들은 다음과 같습니다.
- 단일 진입점 (Single Entry Point) 제공: 여러 서비스가 각자의 외부 IP나 포트를 가질 필요 없이, 인그레스를 통해 단일 IP 주소와 포트로 외부 요청을 받습니다. 관리 포인트가 줄어들고 외부 노출을 최소화할 수 있습니다. 🚪➡️🏢
- URL 기반 라우팅 (Path/Host-based Routing): 요청 URL의 호스트 이름(
mysite.com
,api.mysite.com
)이나 경로(/login
,/products
)에 따라 다른 서비스로 요청을 전달할 수 있습니다. 예를 들어,mysite.com/login
은 로그인 서비스로,mysite.com/products
는 상품 목록 서비스로 보내는 식이죠. 🗺️ - SSL/TLS 종료 (Termination): HTTPS 요청을 인그레스 단계에서 처리하고, 클러스터 내부의 서비스와는 암호화되지 않은 HTTP 통신을 할 수 있습니다. 각 서비스마다 SSL 인증서를 설정하고 관리하는 부담을 덜어줍니다. 🔒➡️🔓
- 로드 밸런싱: 인그레스는 자체적으로 또는 연결된 서비스를 통해 들어온 요청을 여러 개의 파드(Pod)로 분산시키는 로드 밸런싱 기능을 수행합니다. 🚦
핵심 원리: 인그레스는 어떻게 작동할까요? ⚙️
인그레스가 실제로 작동하려면 두 가지 핵심 요소가 필요합니다.
- 인그레스 리소스 (Ingress Resource): 사용자가 생성하는 쿠버네티스 오브젝트입니다. 여기에는 외부 요청을 어떤 서비스로 라우팅할지에 대한 규칙(Rule)을 정의합니다. 예를 들어, "example.com/api 로 오는 요청은 api-service로 보내라" 와 같은 규칙을 YAML 파일로 작성하여 쿠버네티스에 적용합니다. 이건 일종의 '요청서'나 '설정 지침'이라고 생각할 수 있습니다. 📜
- 인그레스 컨트롤러 (Ingress Controller): 실제로 외부 요청을 받아서 인그레스 리소스에 정의된 규칙에 따라 트래픽을 라우팅하는 역할을 수행하는 _애플리케이션_입니다. 인그레스 리소스만 생성한다고 해서 아무 일도 일어나지 않아요! 반드시 이 컨트롤러가 클러스터 내에 실행되고 있어야 합니다. Nginx, HAProxy, Traefik 등 다양한 종류의 인그레스 컨트롤러가 있습니다. 이 컨트롤러는 보통 클러스터 외부에서 접근 가능한 IP를 갖는 로드 밸런서 서비스 뒤에서 실행됩니다. 👮♂️
작동 흐름 시각화:
# 외부 요청 (사용자)
External Request (User @ Internet)
|
v
+-----------------------+
| Load Balancer (Cloud)| <-- 인그레스 컨트롤러가 노출된 IP/Port
| (e.g., AWS ELB, GCP LB)|
+-----------------------+
|
v
+-------------------------------------------------+
| Kubernetes Cluster |
| +---------------------------------------------+ |
| | Ingress Controller (e.g., Nginx, Traefik) | | <--- 인그레스 리소스 규칙 확인
| | - Reads Ingress Resource Rules | |
| | - Routes traffic based on Host/Path | |
| +---------------------------------------------+ |
| | | | |
| v v v |
| +--------+ +--------+ +--------+ |
| | Service A| | Service B| | Service C| | <--- 규칙에 따라 트래픽 전달
| +--------+ +--------+ +--------+ |
+-------------------------------------------------+
인그레스 vs 다른 서비스 노출 방식 비교:
특징 | NodePort | LoadBalancer (클라우드) | Ingress |
주요 용도 | 개발/테스트, 간단한 노출 | 서비스별 외부 로드밸런서 필요 | HTTP/S 라우팅, 단일 진입점 |
외부 IP | 노드의 IP 사용 | 클라우드 제공 로드밸런서 IP | 인그레스 컨트롤러의 로드밸런서 IP (보통 1개) |
포트 관리 | 노드마다 포트 충돌 가능성 | 서비스별 로드밸런서 관리 | 주로 80/443 포트 사용 |
L7 라우팅 | 불가능 | 불가능 (L4 수준) | 가능 (Host, Path 기반) |
SSL/TLS 종료 | 불가능 (서비스 레벨에서 처리) | 가능 (로드밸런서 레벨) | 가능 (인그레스 컨트롤러 레벨) |
비용 | 낮음 | 서비스 수에 따라 증가 | 상대적으로 효율적 (로드밸런서 1개 공유) |
필수 컴포넌트 | 없음 | 클라우드 환경 | 인그레스 컨트롤러 |
주의사항 및 팁 💡
⚠️ 이것만은 주의하세요!
- 인그레스 컨트롤러는 필수!: 인그레스 리소스를 정의해도, 이를 해석하고 실행할 인그레스 컨트롤러가 클러스터에 설치 및 실행되고 있지 않으면 아무런 효과가 없습니다. 😱
- 상세 설명: 인그레스 컨트롤러는 별도로 배포해야 하는 컴포넌트입니다. Nginx Ingress Controller, Traefik, HAProxy Ingress 등 다양한 오픈소스 및 상용 솔루션이 있습니다. 클라우드 환경(EKS, GKE, AKS)에서는 관리형 컨트롤러를 제공하기도 합니다.
- 해결 방법: 사용 환경에 맞는 인그레스 컨트롤러를 선택하여 클러스터에 배포해야 합니다. 공식 문서를 참고하여 설치 가이드를 따르세요.
- 네트워킹 복잡성: 인그레스 설정은 때때로 복잡한 네트워킹 지식을 요구할 수 있습니다. 특히 SSL/TLS 설정, 리다이렉션, 인증 등의 고급 기능을 사용할 때는 더욱 그렇습니다. 🤔
- 상세 설명: 인그레스 규칙, 컨트롤러의 설정(어노테이션 등), 그리고 기본 네트워크 인프라(CNI 플러그인, 클라우드 로드밸런서 설정 등) 간의 상호작용을 이해해야 문제가 발생했을 때 해결하기 용이합니다.
- 해결 방법: 공식 문서와 커뮤니티 자료를 충분히 학습하고, 간단한 설정부터 시작하여 점진적으로 복잡한 기능을 적용해 보세요.
💡 꿀팁
- 어노테이션(Annotations) 활용: 인그레스 리소스의 어노테이션을 사용하면 인그레스 컨트롤러의 특정 동작(예: SSL 리다이렉션, CORS 설정, 타임아웃 설정 등)을 세밀하게 제어할 수 있습니다. 컨트롤러 종류마다 지원하는 어노테이션이 다르니, 사용하는 컨트롤러의 문서를 꼭 확인하세요! ⚙️
- 와일드카드 호스트:
*.example.com
과 같은 와일드카드 호스트를 사용하여 여러 서브도메인에 대한 규칙을 한 번에 정의할 수 있습니다. (단, 와일드카드 인증서 필요) ✨ - IngressClass 사용: 여러 종류의 인그레스 컨트롤러를 한 클러스터에서 사용하거나, 특정 인그레스 리소스가 어떤 컨트롤러에 의해 관리될지 명시적으로 지정하고 싶을 때
IngressClass
리소스를 활용하세요. 🏷️
마치며 🙋♀️
지금까지 쿠버네티스의 외부 트래픽 관리자, 인그레스에 대해 알아보았습니다. NodePort나 LoadBalancer 방식의 한계를 넘어, 더 유연하고 효율적으로 서비스를 외부에 노출하는 방법을 제공하죠. 특히 여러 서비스를 운영하거나, URL 기반 라우팅, SSL 관리 등이 필요할 때 인그레스는 강력한 해결책이 될 수 있습니다.
처음에는 인그레스 컨트롤러 개념과 리소스 정의가 조금 낯설 수 있지만, 직접 사용해보면서 그 편리함을 느껴보시길 바랍니다! 궁금한 점이나 더 알고 싶은 내용이 있다면 언제든지 댓글로 남겨주세요! 😊
참고 자료 🔖
- 쿠버네티스 공식 문서 - 인그레스: https://kubernetes.io/ko/docs/concepts/services-networking/ingress/
- 쿠버네티스 공식 문서 - 인그레스 컨트롤러: https://kubernetes.io/ko/docs/concepts/services-networking/ingress-controllers/
- Nginx Ingress Controller 문서: [invalid URL removed]
- (블로그) 쿠버네티스 인그레스란 무엇인가?: (검색 결과에 따라 적절한 블로그 링크 추가)
- (영상) Kubernetes Ingress Explained: (검색 결과에 따라 적절한 영상 링크 추가)
#Kubernetes #쿠버네티스 #Ingress #인그레스 #네트워킹 #클라우드 #DevOps #MSA