DevOps/K8S

[Kubernetes] 인그레스(Ingress)란 무엇인가?

IT록흐 2023. 10. 11. 22:25
반응형

 

인그레스(Ingress)란?

 

쿠버네티스 인그레스의 정의는 아래와 같다.

 

Kubernetes Ingress is an API object that shows how traffic from the internet should reach internal Kubernetes cluster Services that send requests to groups of Pods. The Ingress itself has no power.  ( 출처 )

 

 

 

 

서비스(Service)는 외부포트와 Pod포트를 포워딩하여 Pod에 트래픽이 전달되도록 한다. 그런데 한 가지 문제가 있다. 다양한 서비스가 존재하므로 다양한 포트가 외부로 노출되고 클라이언트는 서비스별로 포트번호를 달리하여 접근해야 한다.

 

이런 불편을 해결하기 위해 등장한 것이 '프록시 서버'이다.

 

 

 

클라이언트가 프록시 서버에 요청을 보내면 프록시 서버는 경로를 기준으로 서비스를 구분한다. 클라이언트는 포트구분 없이 원하는 서비스에 접근이 가능해진다. 이때의 프록시 서버를 시스템 내부로 가져올 수 있는데, 이를 '리버스 프록시 서버(Reverse Proxy Server )라 부른다.

 

그리고 쿠버네티스 클러스터 내부 존재하는 리버스 프록시 서버를 두고 '인그레스(Ingress)'라 부른다. 

 

 

 

 

 

인그레스 컨트롤러(Ingress Controller) 란?

 

Ingress controllers are not started automatically with a cluster. Use this page to choose the ingress controller implementation that best fits your cluster. ( 출처 )

 

쿠버네티스 API에 인그레스는 존재하지만 인그레스 컨트롤러는 생성되지 않는다. 클러스터가 어떤 환경이냐에 따라 적용가능한 인그레스 클러스터가 달라지기 때문이다. 

 

 

인그레스는 일종의 그릇이다. 인그레스가 어떤 방식으로 동작할지는 인그레스 컨트롤러에 따라 달라진다. 인그레스를 동작시킬 구현체가 인그레스 컨트롤러인 것이다. 인그레스는 이런 다형성을 지니기에, 여러 개의 인그레스 컨트롤러를 배포하여 사용할 수 있다. 

 

If you do not specify an IngressClass for an Ingress, and your cluster has exactly one IngressClass marked as default, then Kubernetes applies the cluster's default IngressClass to the Ingress. ( 출처 )

 

여러 개의 인그레스 컨트롤러를 사용하는 경우, 한 가지 인그레스 컨트롤러를 디폴트로 지정해두어야 한다. 만약 인그레스에 인그레스 클래스, 즉 인그레스 컨트롤러가 지정되지 않으면 디폴트로 설정된 인그레스 컨트롤러가 지정되어 사용된다. 

 

 

인그레스 룰 ( Ingress Rule )

 

인그레스를 동작시킬 인그레스 컨트롤러가 정해지면 어떤 방식으로 라우팅할지 룰(Rule)을 정해야 한다. /service1의 경로로 들어오면 Service1으로, /service2로 들어오면 Service2로 라우팅 될 수 있도록 라우팅 룰을 정해주어야 한다.

 

인그레스 리소스 ( Ingress Resource )

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: simple-fanout-example
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /foo
        pathType: Prefix
        backend:
          service:
            name: service1
            port:
              number: 4200
      - path: /bar
        pathType: Prefix
        backend:
          service:
            name: service2
            port:
              number: 8080

 

 

인그레스 규칙은 인그레스 리소스 파일(yaml)에 적혀있다. 인그레스 컨트롤러가 인그레스 규칙에 맞게 동작할 수 있도록 인그레스 리소스를 인그레스 컨트롤러에 적용해야 한다. 

 

kubectl apply -f ingress-resouce.yaml 

 

kubectl apply 명령어로 인그레스 리소스를 인그레스 컨트롤러에 적용하면 라우팅 룰이 적용된다. 그러면 인그레스로 들어온 트래픽은 라우팅룰에 따라 컨트롤러에 의해 특정한 서비스로 전달된다. 

 

정리하면,

쿠버네티스 클러스터가 구성되면 쿠버네티스 API에 인그레스가 생성된다. 인그레스는 마치 빈그릇과 같은데, 개발자가 선택한 환경에 따라 적합한 형태로 동작하도록 인그레스 구현체를 선택할 수 있다. 이때의 인그레스 구현체가 인그레스 컨트롤러이다. 환경에 적합한 인그레스 컨트롤러가 배포되면 인그레스 컨트롤러에 라우팅룰을 적용해야 한다. 라우팅룰이 저장된 인그레스 리소스를 kubectl apply 명령어 인그레스 컨트롤러에 적용한다. 그러면 인그레스가 리버스 프록시 서버로 동작할 준비가 완료된다. 

 

다음 포스팅에서는 minikube를 활용하여 실제 인그레스를 구현해보고 path로 라우팅이 되도록 실습해보겠다. 

 

 


 

 

참고자료

 

What is a Kubernetes Ingress Controller | Traefik Labs

A Kubernetes Ingress and ingress controller enable traffic from the internet to reach internal cluster Services. Let's look into what they are and how they work.

traefik.io

 

Ingress

Make your HTTP (or HTTPS) network service available using a protocol-aware configuration mechanism, that understands web concepts like URIs, hostnames, paths, and more. The Ingress concept lets you map traffic to different backends based on rules you defin

kubernetes.io

 

What is a difference between Ingress and Ingress controller?

I'm using k8s on GCP. It is required to set ingress to setup TLS connection so I set ingress for my application, it works !!! BTW what is Ingress controller like as Nginx Ingress Controller? I'm...

stackoverflow.com

 

반응형