100===Dev Ops/Kubernetes

쿠버네티스 인그레스(Ingress) - 클러스터 외부 트래픽 관리의 핵심 😎

블로글러 2025. 4. 23. 13:29

쿠버네티스 세상을 여행 중인 여러분! 🚀 혹시 클러스터 외부에서 내부 서비스로 접근하는 방법을 설정하다가 머리가 복잡해진 경험 있으신가요? 마치 여러 개의 문을 관리하는 건물 경비원처럼, 여러 서비스를 외부 세계와 연결하는 것은 꽤 까다로운 일이죠. 오늘은 이 문제를 해결해 줄 쿠버네티스의 똑똑한 문지기, **인그레스(Ingress)에 대해 쉽고 재미있게 알아보겠습니다! 🎉

등장 배경: 옛날 옛적 트래픽 관리는... 🤔

쿠버네티스가 등장하기 전, 혹은 인그레스 개념이 정립되기 전에는 외부에서 클러스터 내부의 서비스에 접근하려면 주로 두 가지 방법을 사용했습니다.

  1. NodePort: 각 노드(서버)의 특정 포트를 열어서 외부 요청이 해당 포트로 들어오면 지정된 서비스로 전달하는 방식이에요. 마치 각 방마다 외부로 통하는 쪽문을 여러 개 내는 것과 같죠. 관리할 포트가 많아지고, 노드의 IP가 변경되면 외부에서도 접속 주소를 바꿔야 하는 번거로움이 있었습니다. 😥
  2. LoadBalancer (클라우드 제공): 클라우드 서비스 제공업체(AWS, GCP, Azure 등)의 로드 밸런서를 생성해서 외부 요청을 서비스로 분산하는 방식입니다. 가장 안정적이고 편리하지만, 서비스마다 별도의 로드 밸런서가 필요할 수 있어 비용 부담이 커질 수 있다는 단점이 있었죠. 💰

이런 방식들은 소규모 환경에서는 괜찮을 수 있지만, 서비스가 많아지고 복잡해질수록 관리 포인트가 늘어나고 비용 문제도 발생했습니다. "하나의 외부 IP와 포트로 들어오는 요청을 내부의 여러 서비스로 깔끔하게 나눠줄 수는 없을까?" 하는 고민에서 인그레스가 등장하게 됩니다! 🌟

인그레스의 특징/용도: 무엇을 해결해 주나요? 🧐

인그레스는 클러스터 외부에서 들어오는 HTTP/HTTPS 요청을 내부 서비스로 연결해주는 규칙들의 집합입니다. 마치 똑똑한 교통 경찰관처럼, 들어오는 요청의 주소(호스트 이름)나 경로(Path)를 보고 적절한 서비스로 안내하는 역할을 하죠. 인그레스가 해결해 주는 주요 문제들은 다음과 같습니다.

  1. 단일 진입점 (Single Entry Point) 제공: 여러 서비스가 각자의 외부 IP나 포트를 가질 필요 없이, 인그레스를 통해 단일 IP 주소와 포트로 외부 요청을 받습니다. 관리 포인트가 줄어들고 외부 노출을 최소화할 수 있습니다. 🚪➡️🏢
  2. URL 기반 라우팅 (Path/Host-based Routing): 요청 URL의 호스트 이름(mysite.com, api.mysite.com)이나 경로(/login, /products)에 따라 다른 서비스로 요청을 전달할 수 있습니다. 예를 들어, mysite.com/login은 로그인 서비스로, mysite.com/products는 상품 목록 서비스로 보내는 식이죠. 🗺️
  3. SSL/TLS 종료 (Termination): HTTPS 요청을 인그레스 단계에서 처리하고, 클러스터 내부의 서비스와는 암호화되지 않은 HTTP 통신을 할 수 있습니다. 각 서비스마다 SSL 인증서를 설정하고 관리하는 부담을 덜어줍니다. 🔒➡️🔓
  4. 로드 밸런싱: 인그레스는 자체적으로 또는 연결된 서비스를 통해 들어온 요청을 여러 개의 파드(Pod)로 분산시키는 로드 밸런싱 기능을 수행합니다. 🚦

핵심 원리: 인그레스는 어떻게 작동할까요? ⚙️

인그레스가 실제로 작동하려면 두 가지 핵심 요소가 필요합니다.

  1. 인그레스 리소스 (Ingress Resource): 사용자가 생성하는 쿠버네티스 오브젝트입니다. 여기에는 외부 요청을 어떤 서비스로 라우팅할지에 대한 규칙(Rule)을 정의합니다. 예를 들어, "example.com/api 로 오는 요청은 api-service로 보내라" 와 같은 규칙을 YAML 파일로 작성하여 쿠버네티스에 적용합니다. 이건 일종의 '요청서'나 '설정 지침'이라고 생각할 수 있습니다. 📜
  2. 인그레스 컨트롤러 (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개 공유)
필수 컴포넌트 없음 클라우드 환경 인그레스 컨트롤러

주의사항 및 팁 💡

⚠️ 이것만은 주의하세요!

  1. 인그레스 컨트롤러는 필수!: 인그레스 리소스를 정의해도, 이를 해석하고 실행할 인그레스 컨트롤러가 클러스터에 설치 및 실행되고 있지 않으면 아무런 효과가 없습니다. 😱
    • 상세 설명: 인그레스 컨트롤러는 별도로 배포해야 하는 컴포넌트입니다. Nginx Ingress Controller, Traefik, HAProxy Ingress 등 다양한 오픈소스 및 상용 솔루션이 있습니다. 클라우드 환경(EKS, GKE, AKS)에서는 관리형 컨트롤러를 제공하기도 합니다.
    • 해결 방법: 사용 환경에 맞는 인그레스 컨트롤러를 선택하여 클러스터에 배포해야 합니다. 공식 문서를 참고하여 설치 가이드를 따르세요.
  2. 네트워킹 복잡성: 인그레스 설정은 때때로 복잡한 네트워킹 지식을 요구할 수 있습니다. 특히 SSL/TLS 설정, 리다이렉션, 인증 등의 고급 기능을 사용할 때는 더욱 그렇습니다. 🤔
    • 상세 설명: 인그레스 규칙, 컨트롤러의 설정(어노테이션 등), 그리고 기본 네트워크 인프라(CNI 플러그인, 클라우드 로드밸런서 설정 등) 간의 상호작용을 이해해야 문제가 발생했을 때 해결하기 용이합니다.
    • 해결 방법: 공식 문서와 커뮤니티 자료를 충분히 학습하고, 간단한 설정부터 시작하여 점진적으로 복잡한 기능을 적용해 보세요.

💡 꿀팁

  • 어노테이션(Annotations) 활용: 인그레스 리소스의 어노테이션을 사용하면 인그레스 컨트롤러의 특정 동작(예: SSL 리다이렉션, CORS 설정, 타임아웃 설정 등)을 세밀하게 제어할 수 있습니다. 컨트롤러 종류마다 지원하는 어노테이션이 다르니, 사용하는 컨트롤러의 문서를 꼭 확인하세요! ⚙️
  • 와일드카드 호스트: *.example.com과 같은 와일드카드 호스트를 사용하여 여러 서브도메인에 대한 규칙을 한 번에 정의할 수 있습니다. (단, 와일드카드 인증서 필요) ✨
  • IngressClass 사용: 여러 종류의 인그레스 컨트롤러를 한 클러스터에서 사용하거나, 특정 인그레스 리소스가 어떤 컨트롤러에 의해 관리될지 명시적으로 지정하고 싶을 때 IngressClass 리소스를 활용하세요. 🏷️

마치며 🙋‍♀️

지금까지 쿠버네티스의 외부 트래픽 관리자, 인그레스에 대해 알아보았습니다. NodePort나 LoadBalancer 방식의 한계를 넘어, 더 유연하고 효율적으로 서비스를 외부에 노출하는 방법을 제공하죠. 특히 여러 서비스를 운영하거나, URL 기반 라우팅, SSL 관리 등이 필요할 때 인그레스는 강력한 해결책이 될 수 있습니다.

처음에는 인그레스 컨트롤러 개념과 리소스 정의가 조금 낯설 수 있지만, 직접 사용해보면서 그 편리함을 느껴보시길 바랍니다! 궁금한 점이나 더 알고 싶은 내용이 있다면 언제든지 댓글로 남겨주세요! 😊

참고 자료 🔖


#Kubernetes #쿠버네티스 #Ingress #인그레스 #네트워킹 #클라우드 #DevOps #MSA

728x90