본문 바로가기

Technical architecture/Kubernetes

Kubernetes로 대용량 오픈소스 웹 상용화하기 ④: Ingress로 외부통신 설정하기

외부 IP를 DNS 레코드(A레코드)에 등록합니다.

Kubernetes로 대용량 오픈소스 웹 상용화하기 시리즈 목차

  1. 대용량 트래픽을 고려한 오픈소스 선정 및 분석
  2. 컨테이너화와 Kubernetes 리소스 관리 (Pod, Deployment, StatefulSet)
  3. Helm chart로 Kubernetes에 오픈 소스 웹 배포하기
  4. Kubernetes 서비스(Service) 및 Ingress 관리 (HTTP 및 gRPC 프로토콜 이해)
  5. 보안 강화를 위한 인증서(Certificate) 관리
  6. 서비스 안정성을 위한 튜닝(성능테스트, HA 구성, 리소스 최적화)

[Technical architecture/Kubernetes] - Kubernetes로 대용량 오픈소스 웹 상용화하기 ③: Helm chart로 Kubernetes에 오픈 소스 웹 배포하기

 

Kubernetes로 대용량 오픈소스 웹 상용화하기 ③: Helm chart로 Kubernetes에 오픈 소스 웹 배포하기

Kubernetes로 대용량 오픈소스 웹 상용화하기 시리즈 목차대용량 트래픽을 고려한 오픈소스 선정 및 분석컨테이너화와 Kubernetes 리소스 관리 (Pod, Deployment, StatefulSet)Helm chart로 Kubernetes에 오픈 소스

develiro.tistory.com

서비스를 컨테이너로 배포했다고 바로 외부에서 접근할 수 있는 것은 아닙니다.
내부 서비스와 외부 사용자를 연결하려면 Kubernetes의 Ingress라는 개념과 이를 실제 라우팅으로 구현하는 Ingress Controller가 필요합니다.

 

이번 글에서는 Kubernetes에서 외부 사용자 요청이 내부 서비스까지 전달되는 과정을 구조적으로 이해하고, 실제 구현했던 nginx ingress 설정 방법과 HTTP 및 gRPC 트래픽 처리까지 다뤄보겠습니다.

쿠버네티스 서비스와 외부 통신

Kubernetes의 파드는 수시로 생성 및 삭제되어 IP 주소가 자주 바뀌기 때문에, 파드의 IP를 직접 사용하면 외부에서 접근이 어렵습니다. 이를 해결하는 방법으로 Kubernetes는 Service라는 자원을 제공합니다.

Kubernetes에서 제공하는 Service의 종류는 크게 세 가지입니다.

서비스 타입 외부 노출 여부 특징 및 용도
ClusterIP ❌ 불가능 클러스터 내부 통신 전용 서비스
NodePort ✅ 제한적으로 가능 각 노드의 특정 포트를 외부로 노출하여 접근 가능
LoadBalancer ✅ 가능 클라우드 제공자의 L4 로드밸런서를 통해 외부에 노출

개발환경이나 테스트 환경이라면 간단히 LoadBalancer를 사용해도 충분하지만, 실제 운영환경에서는 비용과 관리의 효율성을 위해서 Ingress를 사용하는 것이 일반적입니다.

운영환경에서 외부 노출을 위해 Ingress가 필요한 이유

운영 환경에서는 여러 서비스들이 동시에 외부에 노출되어야 합니다. 각 서비스를 모두 개별적인 LoadBalancer로 구성하면 다음과 같은 단점이 있습니다.

  • 서비스마다 별도의 공인 IP가 필요하여 비용이 증가합니다.
  • 관리해야 하는 IP와 서비스가 많아져 유지보수가 어렵습니다.

반면 Ingress를 사용하면 다음과 같은 장점이 있습니다.

  • 단 하나의 외부 IP로 여러 개의 서비스를 도메인이나 경로로 구분하여 제공할 수 있습니다.
  • 서비스가 많아져도 IP 관리가 쉽고, 비용도 절감할 수 있습니다.
  • TLS 인증서 관리 등 고급 기능까지 손쉽게 지원됩니다.

이러한 이유로 Kubernetes 환경에서 실제 운영 서비스는 Ingress를 이용한 외부 노출 방식을 선호합니다.

그렇다면 Ingress란?

Ingress는 Kubernetes 클러스터 외부에서 들어오는 요청을 내부 서비스로 연결해주는 라우팅 규칙을 정의하는 리소스입니다.

Ingress 리소스 자체는 실제 트래픽을 처리하지 않고, 규칙만 제공합니다. 규칙을 실제 라우팅으로 구현하는 것은 별도의 컴포넌트인 Ingress Controller가 수행합니다.

대표적인 Ingress Controller로는 nginx ingress controller가 있으며, HTTP는 물론 gRPC 등 다양한 프로토콜을 지원합니다.

Ingress를 사용한 Kubernetes의 기본 통신 구조

HTTP와 gRPC 프로토콜의 차이점과 특징 비교

Ingress를 구성할 때 흔히 접하는 프로토콜은 HTTPgRPC입니다. 두 프로토콜의 차이를 이해하면, Kubernetes 환경에서 서비스를 구성할 때 보다 적절한 설정을 선택할 수 있습니다.

구분 HTTP (REST API) gRPC
전송방식 텍스트 기반(JSON 등) 바이너리 기반(Protocol Buffers 사용)
전송 프로토콜 주로 HTTP/1.1 사용 HTTP/2 필수
성능 및 속도 상대적으로 느림 빠르고 효율적
데이터 직렬화 방식 JSON, XML (사람이 읽기 쉬움) Protocol Buffers (기계 친화적)
양방향 통신 지원 Polling 등 제한적인 방식으로 지원 양방향 Streaming 완벽 지원
개발 및 디버깅 쉽고 직관적 전용 도구(gRPCurl 등)가 필요
클라이언트 지원 언어 제한 없음 (모든 언어에서 가능) 지원 언어별 전용 클라이언트 필요
  • HTTP가 적합한 상황
    • 서비스가 외부에 널리 공개되어야 하는 경우
    • 브라우저 기반 클라이언트와 손쉽게 연동해야 하는 경우
    • 사람이 읽기 쉬운 API 정의와 디버깅 편의성을 중시할 때
  • gRPC가 적합한 상황
    • 내부 마이크로서비스 간 통신과 같이 성능이 중요한 환경
    • 낮은 지연시간(latency), 높은 처리량(throughput)이 필수적인 상황
    • 양방향 스트리밍 및 복잡한 데이터 통신이 필요한 환경

오픈소스 웹 Langfuse Ingress 설정하기

위의 배경지식을 바탕으로 운영환경 Langfuse 웹 UI를 개발자들에게 제공하기 위해 필요한 과정을 정리해보겠습니다.

쿠버네티스 환경에서 nginx ingress controller 설치하기

AKS라면 Azure 포탈에서 리소스를 생성할 때 nginx ingress 설치여부를 선택할 수 있습니다. 하지만 만약 직접 설치해야하는 상황이라면 아래 명령어로 Ingress Controller를 설치합니다.

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install nginx-ingress ingress-nginx/ingress-nginx \
  --namespace ingress-nginx --create-namespace \
  --set controller.service.type=LoadBalancer

 

외부 IP는 다음과 같이 확인 가능합니다.

kubectl get svc -n ingress-nginx

HTTP 서비스 외부 노출하기 (Service → Ingress 연결)

Ingress는 Service를 통해 파드에 접근하므로, 먼저 Service를 생성합니다. 일반적인 웹 서비스는 보통 ClusterIP 타입으로 구성합니다.

apiVersion: v1
kind: Service
metadata:
  name: langfuse-web
  namespace: langfuse
spec:
  type: ClusterIP
  ports:
    - name: http
      port: 3000
      targetPort: 3000
  selector:
    app: langfuse-web

 

  • Langfuse는 내부 3000 포트에서 HTTP를 제공합니다.
  • 외부로 노출하는 Ingress를 사용하므로 ClusterIP를 선택합니다.

 

nginx ingress를 통한 HTTP Ingress 구성

Langfuse는 HTTP 요청만 처리하므로, 별도 gRPC 설정이 필요하지 않고 간단한 HTTP 기반의 Ingress 설정이면 충분합니다.

참고: https://langfuse.com/integrations/native/opentelemetry#troubleshooting

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: langfuse-ingress
  namespace: langfuse
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  rules:
    - host: langfuse.example.com
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: langfuse-web
                port:
                  number: 3000

 

  • nginx ingress 기본 설정을 활용합니다.
  • rewrite-target으로 모든 요청을 루트로 전달합니다.

쿠버네티스에서 Public IP 및 도메인 설정

Ingress Controller 설치 후 할당된 외부 IP를 확인합니다.

kubectl get svc -n ingress-nginx

 

외부 IP를 DNS 레코드(A레코드)에 등록합니다.

langfuse.example.com → <Ingress 외부 IP>

 

 

이제 langfuse.example.com로 접속하면 사내망에서 웹 UI 접속이 가능하게 되었습니다!


다음 글 예고

지금까지는 Kubernetes에서 서비스와 Ingress를 이용한 외부 통신 구성 방법과 HTTP/gRPC 프로토콜의 특징을 이해하고 실제 설정해보았습니다. 하지만 아직 중요한 보안 작업이 빠져 있습니다. 외부에 서비스를 노출할 때는 반드시 안전한 HTTPS 연결을 구성해야 하며, 이를 위해서는 인증서(Certificate) 설정이 필수적입니다. 다음 글에서는 Ingress 환경에서의 HTTPS를 위한 인증서를 발급하고 관리하는 방법을 살펴보겠습니다.