본문 바로가기
Development, Architecture/Docker, k8s

[쿠버네티스] 인그레스 알아보기

by ggyongi 2024. 8. 8.
반응형

인그레스란

상황: 여러분이 쿠버네티스 클러스터 안에 두 개의 웹 애플리케이션을 가지고 있다고 가정해봅시다. 
하나는 쇼핑몰 서비스, 다른 하나는 블로그 서비스입니다. 
두 서비스 모두 클러스터 내부에서만 접근이 가능하지만, 
외부 사용자들이 이 두 서비스를 각각 사용할 수 있도록 하고 싶습니다.

문제: 외부 사용자가 shop.example.com으로 접속하면 쇼핑몰 서비스로, 
blog.example.com으로 접속하면 블로그 서비스로 연결되게 하려면 어떻게 해야 할까요?

 

인그레스 객체에는 라우팅 규칙이 일반적인 형태로 기술되어있고 컨트롤러가 이 규칙을 컨트롤러의 프록시에 적용한다.

  • shop.example.com으로 들어오는 요청은 쇼핑몰 서비스로 라우팅
  • blog.example.com으로 들어오는 요청은 블로그 서비스로 라우팅

 

인그레스 컨트롤러는 위에서 설정한 인그레스 객체의 라우팅 규칙을 실제로 실행합니다. 클러스터로 진입하는 입구역할을 하며

외부의 모든 요청을 받고 이에 따라 적절한 서비스로 트래픽을 전달한다.

인그레스 컨트롤러는 리버스 프록시로 동작한다. 즉, 사용자는 서버에 직접 접속하는게 아니라 프록시 서버를 통해 접속하게 된다.

인그레스 컨트롤러는 인그레스 객체를 감시하다 어떤 변경이 감지되면 프록시에 변경된 규칙을 적용한다.

 

인그레스 객체 명세 예시

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  namespace: default
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: shop.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: shop-service
            port:
              number: 80
  - host: blog.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: blog-service
            port:
              number: 80
  tls:
  - hosts:
    - shop.example.com
    - blog.example.com
    secretName: example-tls

 

 

인그레스 객체에서는 호스트기반 라우팅(host) + 경로기반 라우팅(path) 규칙을 통해 어떤 서비스로 트래픽을 전달할지 정한다.

spec:

  • rules:
    • 이 부분은 인그레스 객체의 핵심으로, 호스트와 경로에 따라 트래픽이 라우팅될 규칙을 정의합니다.
    • host: shop.example.com: 이 호스트로 들어오는 요청은 shop-service로 라우팅됩니다.
    • host: blog.example.com: 이 호스트로 들어오는 요청은 blog-service로 라우팅됩니다.
    • http:
      • paths: 이 규칙 아래 정의된 경로에 따라 트래픽이 라우팅됩니다.
      • path: /: 이 경로는 모든 요청을 의미하며, 이 경로에 따라 서비스가 선택됩니다.
      • pathType: Prefix: 경로가 특정 접두사로 시작하는지 확인하는 규칙입니다.
      • backend: 백엔드 서비스 정보로, 라우팅될 서비스의 이름과 포트가 포함됩니다.
      • 예시에서는 shop-service와 blog-service 두 개의 서비스가 각각 80번 포트로 설정되어 있습니다.

*위와 같은 방식을 활용하여 클러스터 외부로 노출되면 안되는 경로를 인그레스 정의에 포함하지 않는 방법으로 외부 접근을 차단시킬 수도 있다

 

 

인그레스 컨트롤러의 기능과 역할

1. HTTPS 적용

인그레스 컨트롤러는 HTTPS(암호화된 HTTP) 연결을 지원합니다. 이는 웹사이트와 사용자의 통신을 보호하여 해커가 데이터를 가로채거나 변조하지 못하게 합니다.

예시:

예를 들어, 여러분의 웹사이트가 https://secure.example.com으로 접근할 수 있도록 하려면, 인그레스 컨트롤러는 TLS(SSL) 인증서를 사용해 HTTPS 연결을 설정할 수 있습니다. 이렇게 하면 사용자가 해당 웹사이트를 방문할 때 모든 데이터가 암호화된 상태로 전송됩니다.

 

2. 방화벽 지원

인그레스 컨트롤러는 방화벽과 같은 보안 기능도 지원합니다. 방화벽은 특정 유형의 트래픽을 차단하거나 허용하는 기능을 합니다. 이를 통해 인그레스 컨트롤러는 애플리케이션을 보호할 수 있습니다.

예시:

여러분이 운영하는 웹 애플리케이션이 SQL 인젝션과 같은 공격에 노출될 위험이 있다고 가정해봅시다. SQL 인젝션은 공격자가 데이터베이스를 조작하기 위해 악의적인 코드를 삽입하는 방식의 공격입니다. 인그레스 컨트롤러는 이러한 공격을 방어하기 위해 방화벽 규칙을 설정해, 의심스러운 요청을 차단할 수 있습니다.

 

3. 캐싱 프록시

일부 인그레스 컨트롤러는 캐싱 프록시 기능도 제공합니다. 캐싱은 자주 요청되는 데이터를 미리 저장해 두어, 사용자가 요청할 때마다 빠르게 제공하는 기능입니다. 이는 웹사이트의 성능을 크게 향상시킬 수 있습니다.

예시:

만약 여러분의 웹사이트가 자주 업데이트되지 않는 정적 콘텐츠(예: 이미지, CSS 파일 등)를 많이 포함하고 있다면, 인그레스 컨트롤러는 이러한 콘텐츠를 캐싱할 수 있습니다. 이렇게 하면 동일한 콘텐츠에 대한 요청이 반복될 때마다 애플리케이션 서버로 요청을 전달하지 않고, 미리 캐싱해 둔 데이터를 사용자에게 빠르게 전달합니다. 이는 서버의 부하를 줄이고 응답 시간을 단축시킵니다.

 

4. 스티키 세션

(* 옛날 유상태 애플리케이션에서나 많이 사용함. 지금은 대부분이 무상태 애플리케이션임)

스티키 세션은 사용자가 동일한 서버에 계속 연결되도록 하여 세션 상태를 유지하게 합니다. 이를 통해 사용자는 로그인 정보나 장바구니 데이터와 같은 상태를 잃지 않고, 일관된 사용자 경험을 제공받을 수 있습니다. 인그레스 컨트롤러는 쿠키를 기반으로 스티키 세션을 설정하여, 사용자의 요청이 항상 동일한 서버로 전달되도록 관리합니다. 사용자 경험을 향상시킬 수 있는 반면 특정 서버로 트래픽이 몰려 부하 불균형이 일어날 수 있는 단점도 존재합니다.

 

 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글