[Cluster Setup and Hardening] Kubernetes에서 Ingress 이해하기

IMKUNYOUNG·2024년 7월 6일
0

CKS

목록 보기
24/70

이번 글에서는 Kubernetes의 Ingress에 대해 다뤄보겠습니다.

서비스와 Ingress의 차이점

서비스

서비스는 Kubernetes에서 POD들 간의 네트워크 접근을 제공하는 기본 구성 요소입니다. 서비스는 다양한 유형이 있으며, 각각의 역할과 특징이 있습니다.

ClusterIP 서비스

ClusterIP 서비스는 클러스터 내부에서만 접근할 수 있는 내부 IP를 제공합니다. 예를 들어, MySQL 데이터베이스를 POD로 배포하고 mysql-service라는 ClusterIP 서비스를 생성하여 애플리케이션에서 데이터베이스에 접근할 수 있도록 합니다.

NodePort 서비스

NodePort 서비스는 클러스터의 각 노드에서 특정 포트를 열어 외부 트래픽을 받아들입니다. 예를 들어, 외부 세계에서 애플리케이션에 접근할 수 있도록 NodePort 서비스를 생성하여 클러스터의 노드에서 높은 포트를 통해 애플리케이션을 사용할 수 있게 합니다.

Ingress

Ingress는 외부 트래픽을 클러스터 내의 서비스로 라우팅하는 역할을 합니다. Ingress는 여러 서비스로 트래픽을 분산시키고 SSL 보안도 구현할 수 있는 7계층 로드 밸런서로 생각할 수 있습니다.

Ingress를 사용하면 클러스터 내의 다양한 서비스로 URL 경로에 따라 트래픽을 라우팅할 수 있습니다. 예를 들어, my-online-store.com/watch로 들어오는 트래픽은 비디오 스트리밍 서비스로, my-online-store.com/wear로 들어오는 트래픽은 의류 서비스로 라우팅할 수 있습니다.

Ingress의 필요성

문제 시나리오

온라인 상점을 위한 애플리케이션을 Kubernetes에 배포한다고 가정해보겠습니다. 애플리케이션은 my-online-store.com에서 사용 가능합니다.

  1. 애플리케이션을 Docker 이미지로 빌드하고 Kubernetes 클러스터에 POD로 배포합니다.
  2. MySQL 데이터베이스를 POD로 배포하고 mysql-service라는 ClusterIP 서비스를 생성합니다.
  3. 외부에서 애플리케이션에 접근할 수 있도록 NodePort 서비스를 생성하여 포트 38080을 할당합니다.
  4. 사용자는 노드의 IP와 포트 38080을 통해 애플리케이션에 접근합니다.

이 설정은 잘 동작하지만, 사용자가 매번 IP 주소와 포트 번호를 입력해야 하는 불편함이 있습니다. 이를 해결하기 위해 DNS 서버를 구성하고, 프록시 서버를 추가하여 포트 80의 요청을 노드의 포트 38080으로 프록시할 수 있습니다.

퍼블릭 클라우드 환경에서의 해결책

퍼블릭 클라우드 환경(Google Cloud Platform 등)에서는 NodePort 서비스 대신 LoadBalancer 서비스를 사용할 수 있습니다. Kubernetes는 Google Cloud Platform에 네트워크 로드 밸런서를 요청하고, 외부 IP를 제공하여 트래픽을 라우팅합니다.

여러 서비스의 도입

회사의 비즈니스가 성장하면서 새로운 서비스(예: 비디오 스트리밍 서비스)가 생깁니다. 새로운 서비스는 my-online-store.com/watch에서, 기존 서비스는 my-online-store.com/wear에서 접근할 수 있도록 설정해야 합니다. 각 서비스마다 LoadBalancer 서비스를 생성하면 비용이 증가합니다.

  • 로드밸런서 2개 사용

  • 로드밸런서 3개 사용 (단일 진입점을 제공하고자 나름 머리를 써봤을 때,,,, NodePort를 쓰면 노드를 유연하게 스케일 못함 so loadbalancer 3개로 구성해 놓은 것임)

  • 인그레스 + 로드밸런서 사용

Ingress로 해결하기

Ingress를 사용하면 단일 URL로 여러 서비스를 라우팅하고 SSL을 포함한 다양한 설정을 쉽게 관리할 수 있습니다. Ingress 컨트롤러를 통해 트래픽을 관리하고, URL 경로에 따라 트래픽을 분산시킬 수 있습니다.

Ingress 컨트롤러 배포

  1. NGINX Ingress 컨트롤러를 배포합니다.
  2. Ingress 리소스를 생성하여 URL 경로에 따른 트래픽 라우팅 규칙을 설정합니다.

Ingress 리소스 구성

Ingress 리소스는 Ingress 컨트롤러에 적용되는 규칙과 구성입니다. 예를 들어, my-online-store.com/wear로 들어오는 트래픽은 웨어 서비스로, my-online-store.com/watch로 들어오는 트래픽은 비디오 서비스로 라우팅하는 규칙을 설정할 수 있습니다.

예제: Ingress 리소스 정의

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
  - host: my-online-store.com
    http:
      paths:
      - path: /wear
        pathType: Prefix
        backend:
          service:
            name: wear-service
            port:
              number: 80
      - path: /watch
        pathType: Prefix
        backend:
          service:
            name: watch-service
            port:
              number: 80

위 예제는 my-online-store.com 도메인에서 /wear 경로로 들어오는 트래픽은 wear-service로, /watch 경로로 들어오는 트래픽은 watch-service로 라우팅하는 규칙을 정의합니다.

마무리

Ingress를 사용하면 Kubernetes 클러스터 내에서 다양한 서비스로 트래픽을 효과적으로 관리하고 SSL을 포함한 다양한 설정을 중앙에서 관리할 수 있습니다. Ingress를 통해 클라우드 비용을 절감하고, 트래픽 라우팅을 쉽게 관리할 수 있습니다.

0개의 댓글