3.3 컨테이너를 외부로 공개하기 위한 리소스
쿠버네티스 클러스터에서 동작하는 컨테이너를 클러스터 외부에서 접속할 수 있는 방법이다.
3.3.1 파드를 서비스로 묶기
쿠버네티스에서는 서비스(Service) 리소스를 이용하여 파드 여러 개를 하나의 DNS 이름으로 접속할 수 있다. 또한, 서비스를 이용하면 해당 서비스를 구성하는 파드 중 정상적으로 동작하는 파드에만 요청을 할당할 수 있다.
예제 애플리케이션에서 사용한 23_service_backend-app_k8s.yaml는 다음과 같다.
apiVersion: v1 # 서비스 리소스가 따르는 버전이다.
kind: Service # 이 yaml 파일이 서비스 파일이라는 것을 정의한다.
metadata:
name: backend-app-service # 서비스 리소스 이름이다. 이 이름이 DNS 이름으로 등록되어 클러스터 내부에서 참조할 수 있게 한다.
spec:
type: LoadBalancer # 서비스 종류다. (3.3.2 참고)
selector:
app: backend-app # 파드를 선택하기 위한 셀렉터 정의다.
ports: # 서비스에 접속하기 위한 정보다.
- protocol: TCP # 서비스에 접속하기 위한 프로토콜
port: 8080 # 서비스의 포트
targetPort: 8080 # 파드쪽의 포트
💡 TCP 프로토콜을 사용하고, 서비스에 8080 포트를 할당하면서 파드의 8080 포트에 매핑한다는 의미다.
3.3.2 서비스 리소스 타입
서비스 리소스의 타입과, 타입 각각을 설정한 경우 쿠버네트스 클러스터에서의 동작을 설명한다.
No. 설정값 동작
1 | ClusterIP | 서비스에 대해 클러스터 내부에서 유효한 IP 주소를 부여한다. 클러스터 외부에서는 접속할 수 없다. (사설 IP) |
2 | NodePort | 각 노드에서 해당 서비스에 접속하기 위한 포트를 열고 클러스터 외부에서 접속 가능하도록 한다. |
3 | LoadBalancer | NodePort에서 열린 노드 각각의 서비스 공개용 포트를 묶는 형태로 클러스터 외부에 로드밸런스를 구축한다. EKS의 경우 기본으로 CLB(Classic Load Balancer)가 생성된다. 설정에 따라 NLB(Network Load Balancer)로 변경가능 하다. 하지만, 단독으로 ALB(Application Load Balancer)는 사용할 수 없다. 인그레스 컨트롤러(Ingress Controller)를 사용해야 ALB를 사용할 수 있다. |
4 | ExternalName | 위 1~3과 달리 클러스터 내부에 파드를 공개하기 위한 리소스가 아닌 클러스터 외부의 엔드포인트를 클러스터 내부에 공개하기 위한 리소스 타입이다. 파드 각각이 외부 서비스를 직접 호출하지 않고 ExternalName으로 등록한 서비스에 접속하면 외부 서비스와 클러스터 내부 파드를 느슨한 결합으로 연결할 수 있다. |
Amazon EC2의 ‘로드밸런서’ 메뉴에서 ‘인스턴스’ 탭을 통해 등록된 로드밸런서 인스턴스를 확인할 수 있다.
예제 애플리케이션 생성 당시 생성한 노드 두 가지 상태가 InService인 것을 볼 수 있다.
서울 리전의 가용 영역이 세 개이기 때문에, 로브밸런서 가용 영역 역시 세 개 이다.
상태 검사 를 통해 Ping 대상, 제한 시간, 간격, 비정상 임계 값, 정상 임계 값을 볼 수 있다.
CLB를 AWS 관리 콘솔로 생성할 경우 ping 대상은 기본값으로 HTTP다. 하지만, 3.3.1에서 봤듯이 프로토콜을 TCP로 설정했기 때문에 TCP로 변경되었다. 만약 HTTP의 경우 정상 응답을 반환하는 경로(/index.html 등)를 설정해야 한다.
포트 번호 32780은 NodePort 타입의 서비스가 할당된 것이다. 생성된 서비스 타입은 LoadBalancer이지만, NodePort 타입이 할당되는 이유는 로드밸런서가 노드 포트를 각 인스턴스(노드)의 접속 경로로 설정하기 때문이다.
리스너 탭은 다음과 같다.
서비스 매니페스트의 Port에서 설정한 대로 로드밸런서로 수신한 포트는 8080이며 여기서 수신한 요청을 각 인스턴스(노드)의 32760번 포트로 전달하는 설정으로 되어 있다. 또, HTTPS를 사용하지 않으므로 ‘암호’, ‘SSL 인증서’ 항목은 해당 사항 없음으로 되어 있다.
3.3.3 컨테이너를 외부로 공개하는 또 하나의 방법
LoadBalancer 타입의 서비스를 만들면 EKS 클러스터의 컨테이너를 외부로 공개하여 인터넷에 접속할 수 있다. 하지만, 다음과 같은 두 가지 문제가 있다.
- 서비스 단위로 ELB가 생성되기 때문에 효율이 좋지 않다. (ELB 여러 개를 만들면 그만큼 비용이 발생한다.)
- HTTP/HTTPS 로드밸런서로 더 많은 기능이 있는 ALB(Application Load Balancer)를 사용할 수 없다.
LoadBalancer 타입을 서비스를 사용하는 방법 외에 인그레스(Ingress)를 사용하는 방법이 있다.
인그레이스는 쿠버네티스 클러스터로 접근하는 입구를 만들기 위한 리소스라고 할 수 있다. 동작 환경(AWS 등의 클라우드 환경 등)에 적합한 인그레스 컨트롤러(Ingress Controller)를 같이 사용하면 쿠버네티스 클러스터에 접근할 공통 입구를 만들고 애플리케이션 여러 개를 클러스터 외부에 공개할 수 있다. EKS에서는 인그레이스 컨트롤러로 AWS ALB 인그레스 컨트롤러가 제공된다. 이름 그래도 인그레스 컨트롤러를 사용하면 ALB를 사용할 수 있다.
💡 AWS에서 ALB를 사용하기 위해서는 별도의 도메인이 있어야 ALB를 사용할 수 있는 인증서를 발급받을 수 있다. (무료)
'쿠버네티스' 카테고리의 다른 글
3. 쿠버네티스에서 애플리케이션을 동작시키는 구조 - 5 (0) | 2023.04.21 |
---|---|
3. 쿠버네티스에서 애플리케이션을 동작시키는 구조 - 4 (0) | 2023.03.31 |
3. 쿠버네티스에서 애플리케이션을 동작시키는 구조 - 2 (0) | 2023.03.17 |
3. 쿠버네티스에서 애플리케이션을 동작시키는 구조 - 1 (0) | 2023.03.17 |
2. 쿠버네티스 환경 구축과 예제 애플리케이션 배포 - 3 (0) | 2023.03.10 |