Orchestration/Kubernates (k8s)

[Mac OS] 인그레스 란? (Ingress 실습, Ingress 필요성, ingress controller)

chanstory 2023. 2. 15. 23:34
반응형

 


인그레스 란?

- 클러스터 내부의 서비스에 대한 외부 액세스를 제공하는 Kubernetes 오브젝트 임

   => 즉, Kubernetes 클러스터 내에서 실행중인 서비스에 대한 외부 HTTP(S) 및 TCP 액세스를 관리함

제공 기능

- 클라우드에서 호스팅되는 어플리케이션을 위한 라우팅, 로드밸렁싱, SSL 종료와 같은 기능을 제공

   ( SSL (Secure Sockets Layer) = 데이터를 안전하게 전송하기 위한 프로토콜)

   => 일반적으로 인그레스 컨트롤러는 외부에서 들어오는 HTTPS 요청에 대해 SSL 인증서를 제공함

         이를 사용해 요청을 수신하여 내부의 HTTP 서비스로 전달함

         이때 SSL 인증서의 유효성을 검증하고 요청 전달하기 전 요청을 복호화 함

          *** 이로써 클라이언트와 서버 간의 통신은 암호화되며, 데이터를 보호한다 

 

- Ingress 컨트롤러는 Ingress 규칙을 기반으로 들어오는 요청을 수신하고, 요청을 클러스터 내부의 적절한 서비스로 라우팅

- Ingress 는 어플리케이션의 라우팅 규칙을 중앙 집중적으로 관리

   => 어플리케이션의 엔드포인트 변경이나 로드 밸런싱 전략의 변경에 따라 불필요한 수정 없이 어플리케이션에 대한

         외부 액세스를 쉽게 조정 함

 

 

 

 

 


인그레스 실습

- 인그레스 생성 및 적용

- 기존 서비스 타입을 LoadBalancer로 Cluster IP로 바꾸고 적용한다

- Cluster IP는 클러스터 내에서만 접근이 가능하다

   => 더이상 EXTERNAL-IP는 사용할 수 없다

 

제공 소스

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx
  namespace: default
spec:
  rules:
  - host: localhost
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx
            port:
              number: 80

 

실습 시작

 

1. 인그레스 생성 및 조회

% open -a Docker 
% minikube start

% kubectl apply -f <.yaml 파일명>
응답
ingress.networking.k8s.io/nginx created

% kubectl get all,ingresses
응답
NAME                              CLASS    HOSTS       ADDRESS   PORTS   AGE
ingress.networking.k8s.io/nginx   <none>   localhost             80      76s

위 응답 처럼 ingress 생성을 확인할 수 있다

 

 

2. 인그레컨트롤러 설치 (nginx 인그레스 컨트롤러)

minikube 사용시 아래 링크 참고

https://kubernetes.io/ko/docs/tasks/access-application-cluster/ingress-minikube/

 

NGINX 인그레스(Ingress) 컨트롤러로 Minikube에서 인그레스 설정하기

인그레스는 클러스터의 서비스에 대한 외부 액세스를 허용하는 규칙을 정의하는 API 객체이다. 인그레스 컨트롤러는 인그레스에 설정된 규칙을 이행한다. 이 페이지에서는 HTTP URI에 따라 요청을

kubernetes.io

 

% minikube addons enable ingress       // nginx 인그레스 컨트롤러 활성화
응답

% kubectl get pods -n ingress-nginx         // 인그레스 컨트롤러 실행 확인 (minikube v1.19 or later)

응답
NAME                                       READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-ltwzz       0/1     Completed   0          9m
ingress-nginx-admission-patch-t9hct        0/1     Completed   1          9m
ingress-nginx-controller-77669ff58-zfsfk   1/1     Running     0   

localhost 접속

 


인그레스 필요성

- 어플리케이션을 외부에 노출 시킬때의 서비스를 실습해보았고, 외부 IP주소를 할당해주는 서비스와 로드밸런서를 생성해보았다.

   근데 왜 인그레스를 별도로 사용해야 할까?

 

=> 인그레스 리소스는 로드밸런싱과 더불어 호스트 기반 라우팅을 지원하기 때문이다.

        (웹 서버에서 요청된 호스트 이름을 기반으로 요청을 적절한 백엔드 서버로 라우팅하는 방식)

 

앞서 만든 서비스는 LoadBalancer에서 ClusterIP로 바꿨기 때문에 인그레스가 로드 밸런서의 역할을 수행해야 합니다.
아주 단순한 애플리케이션도 서비스는 두 개 이상의 HTTP 요청을 가지는 것이 보통입니다. 보통 각각 Web Server와 WAS로 대표됩니다. 이러한 서비스의 접근을 별도의 포트로 구분하여 접속하게 할 수도 있지만, 하나의 호스트 상에서 라우팅으로 구분하면 보다 유연한 서비스를 만들 수 있습니다.
예를 들어, Web Server는 /로, WAS는 /api로 라우팅 할 수 있습니다.YAML 파일에서 spec.rules.host 에 별도의 호스트를 지정하여 Web Server는 www.mydomain.click, WAS는 api.mydomain.click으로 설정하는 것도 가능합니다.
그렇다면 인그레스 컨트롤러는 무엇일까요? 인그레스 컨트롤러라고 해서 뭔가 특별한 프로그램은 아닙니다. 우리가 흔히 잘 알고 있는 nginx와 같은 애플리케이션이 바로 인그레스 컨트롤러입니다. (nginx가 하는 일이 결국 호스트 기반 라우팅과 로드 밸런싱이라는 점을 기억하세요) 즉 인그레스 컨트롤러는 규칙을 이행하는 실질적인 애플리케이션 컨테이너입니다.

 

 

 

 

 

 

반응형