IT/CKA

CKA 준비과정 - Networking (6) / Ingress

Primes 2023. 7. 19. 11:55
728x90

Ingress는 간단히 말하면, 클러스터 외부와 내부를 연결하는 경로이다. http와 https 경로를 노출하여 외부에서 클러스터 내로 접속할 수 있도록 한다.

강의에서는 온라인 쇼핑몰을 운영하는 회사를 가정한다.

 

앞서 학습한 대로, 외부에서 서비스로 접근을 할 수 있도록 하기 위해서 NodePort를 생성하고 포트 38080을 할당했다.

이제 외부에서 IP:38080 을 입력하여 서비스에 접속할 수 있다. 트래픽이 늘어나면 파드를 늘리고 부하 분산을 wear-service 서비스에서 처리한다.

외부에서 사용자는 IP:포트 방식을 입력하여 접속하지 않는다. 도메인으로 접속할 수 있도록 DNS 서버를 따로 구성한다. 

또한, 38080 포트를 통해 접속하는 것이 아닌 프록시 서버를 통해 일반적으로 접속하게 되는 http 80 포트 에 접속할 수 있도록 한다.

이렇게 구성하면, 외부 사용자는 도메인과 80 포트로 서비스에 접속하게 된다.

 

동일한 구성을 구글 클라우드에서 구성할 때를 확인해보자. 이때는 같은 역할을 하지만 구성요소가 조금 달라진다.

Nodeport 를 노드앞단에 설치하는 것이 아닌 LoadBalancer를 배치하여 부하분산 및 외부와 연결을 가능하도록 구성한다.

Proxy Server 대신 공인 IP를 가진 LB를 설치하고, LB의 공인 IP를 가리키도록 DNS 를 설정함으로써 외부 사용자가 최종 서비스에 접속할 수 있도록 구성할 수 있다.

 

같은 클러스터 내에서 다른 서비스를 제공하는 경우이다. 이 때 요구사항은 같은 도메인으로 접속하되, 하위 페이지에서 다른 서비스를 제공하는 케이스이다.

www.my-online-store.com/apparel => 웹사이트

www.my-online-store.com/video => 비디오 사이트  

클러스터 내에 새로운 LB를 생성하고, 38282 포트를 할당하여 외부 접속을 가능케 한다.

클러스터 외부에도 LB를 생성하고 새로 공인 IP를 부여받는다.

 

서비스를 운영하다 보면, 하위 서비스들이 이렇게 점점 늘어난다. 이에 따라 각 서비스로 트래픽을 분산하는 LB가 추가로 요구되어진다.

또한, SSL 프로토콜을 적용하여 HTTPS 통신이 가능하도록 해야 하는데, 이것은 서비스 레벨 또는 LB 레벨에서 적용이 가능하다. 하지만 고려해야 할 점은 관리가 용이하도록 해야 한다. 따라서 최상위 LB에서 ssl 프로토콜을 적용하여 하위 모든 url 접속 시 적용되도록 하는 것이 좋다. (SSL Offloading)

 

 

이러한 구성 과정을 정의 파일로 만들고 서비스 배포 파일과 같이 관리를 하도록 돕는 것이 Ingress 이다.

Ingress 는 사용자가 서비스에 액세스 하는 것을 돕는다. 외부 사용자가 공개된 하나의 url 로 접근했을 때, url 경로에 기반하여 클러스터 내 다양한 서비스들로 트래픽 라우팅을 설정할 수 있다. 또한, SSL 보안도 적용한다.

간단히 이해하자면, 클러스터 내에 L7 로드밸런서와 같은 역할을 한다.

 

L7 LB의 역할을 서비스의 형태로 구현하여 동작하는 것이므로, 외부에서 접근할 수 있도록 Nodeport 또는 LB를 통해 외부 IP, 포트를 노출시켜야 한다. 내부적으로 동작하는 라우팅, 부하 분산은 Ingress Controller 가 자동으로 진행한다.

Ingress는 배포를 담당하는 Ingress Controller와 리소스 구성을 담당하는 Ingress Resources 부분으로 나뉜다.

 

Ingress Controller 의 부하 분산 기능은, 외부 솔루션을 도입하여 사용한다.

대표적으로 CSP가 제공하는 LB 또는 Nginx, HAProxy 와 같은 솔루션이 있다.

 

Ingress Controller 를 yaml 파일로 정의한다.

예시에서는 쿠버네티스를 위한 nginx ingress 컨트롤러를 생성한다.

ConfigMap 개체를 따로 생성하게 되는데, 이 때 configmap 은 구성 내용을 가질 필요가 없다. 빈 개체로 놔둔 뒤 나중에 필요할 때 구성 설정을 수정하면 된다.

또한, POD_NAME, POD_NAMESPACE 환경변수를 정의해두어야 nginx서비스가 파드 내 구성 데이터를 읽어올 수 있다.

 ingress controller가 사용하는 포트(80, 443)를 명시하고, 외부에서 ingress controller로 접속할 수 있도록 Nodeport 서비스를 생성한다.

 

ingress controller는 각종 리소스를 제어하는 작업이 필요할 때가 있다. 따라서 적절한 권한을 가진 ServiceAccount 계정이 필요하다. 정리하자면, nginx ingress 이미지 배포와 외부와 연결할 수 있는 서비스, 그리고 권한을 가진 ServiceAccount까지 필요하다.

필요한 요소는 다음과 같다.

- L7 LB 역할을 할 nginx ingress controller

- 외부로부터 접속 가능하게 하기위한 service

- 리소스 구성을 위한 configmap

- 작업을 위해 적절한 권한을 가진 ServiceAccount

 

ingress resource 는 ingress controller에 적용된 규칙과 구성의 집합이다.

수신된 트래픽을 특정 서비스로만 전달하거나, URL에 근거해 여러 서비스들로 분산하거나 하는 라우팅 규칙들을 여기서 설정할 수 있다.

 

ingress resource는 yaml 파일로 정의한다.

강의에서의 ingress resource yaml 파일을 정의할 때는 apiVersion이 v1beta1 인데, 이는 쿠버네티스가 추후 업데이트되면 바뀔 것으로 보인다.

backend 필드에서 트래픽이 어디로 라우팅 될지를 정의한다.

kubectl create -f Ingress-wear.yaml

kubectl 명령어를 통해 ingress를 생성한다. 

 

각 도메인과 호스트의 트래픽에 대해 rule을 지정할 수 있다.

예를 들자면, www.my-online-store.com  의 하위 도메인에 경로에 따라 접근해야 할 pod를 다르게 설정한다.

또한 응답할 앱 서비스가 없다면 404 에러 페이지를 보여주도록 rule을 설정할 수도 있다.

 

 

반응형