회원가입을 하면 원하는 문장을
저장할 수 있어요!
다음
AWS 이용 중이라면 최대 700만 원 지원받으세요
최근 컨테이너 환경에서의 애플리케이션 개발과 인프라 운영이 늘어나고 있습니다. 쿠버네티스는 수많은 컨테이너를 관리하기 위한 도구 중에 가장 많이 사용되는 플랫폼입니다.
회원가입을 하면 원하는 문장을
저장할 수 있어요!
다음
회원가입을 하면
성장에 도움이 되는 콘텐츠를
스크랩할 수 있어요!
확인
최근 컨테이너 환경에서의 애플리케이션 개발과 인프라 운영이 늘어나고 있습니다. 쿠버네티스는 수많은 컨테이너를 관리하기 위한 도구 중에 가장 많이 사용되는 플랫폼입니다.
쿠버네티스는 컨테이너를 관리(orchestration)하는 도구로 잘 알려져 있습니다. 이러한 관리 기능뿐만 아니라 컨테이너 기반 애플리케이션 배포와 오토스케일링 등의 기능까지 수행합니다. 애플리케이션을 독립적인 컨테이너로 구성하며, 클러스터를 통해 이를 쉽게 관리할 수 있도록 지원합니다.
이번 글에서는 쿠버네티스 클러스터 내부 혹은 외부에서 컨테이너 형태의 애플리케이션에 접속하기 위한 대표적인 통신 방법에 대해 알아봅니다.
쿠버네티스 환경에서 일반적인 통신 방법은 아래와 같습니다.
파드는 쿠버네티스의 가장 기본적인 워크로드 단위입니다. 세 번째, 네 번째 항목에서 언급한 서비스는 '기능 제공'이라는 일반적인 의미의 서비스가 아닙니다. 쿠버네티스 클러스터는 외부에서 접속하는 트래픽을 처리하기 위해 여러 가지 방법을 제공하는데, 그중 대표적인 방법이 ‘서비스’입니다.
쿠버네티스의 각 파드에는 프라이빗 한 사설(private) IP가 할당되기 때문에, 클러스터 내부 혹은 외부와의 통신에 많은 제약이 따릅니다. 서비스는 이를 해결하기 위해서 같은 목적을 수행하는 하나 혹은 여러 개의 파드를 하나의 Endpoint로 묶고 로드밸런싱을 적용하는 접속 방식을 사용합니다.
파드는 일회성 자원이기 때문에 언제든지 소멸되고 생성될 수 있습니다. 소멸된 파드를 대체하기 위해 새롭게 생성된 파드의 IP 주소는 그전 IP 주소와 다를 수 있기 때문에, 각 파드의 IP 주소를 Endpoint로 사용하여 통신하는 것은 적합하지 않습니다. 고정 주소를 가진 네트워크 컴포넌트인 서비스는 이를 해결하기 위해 파드 앞단에서 외부 사용자의 요청을 내부의 적절한 파드로 분배하는 프록시 같은 역할을 합니다.
쿠버네티스 서비스의 대표적인 구현 방법은 다음과 같습니다.
이 방식은 쿠버네티스의 기본 서비스 유형이고, 클러스터 내부에서만 접근 가능한 서비스 타입입니다. 서비스는 클러스터 내부 IP를 가지게 되어 외부에서는 접근할 수 없습니다. 즉 내부 통신 용도로만 사용합니다.
클러스터 IP 타입의 서비스를 생성하는 YAML 형식의 메타 파일을 먼저 보겠습니다.
apiVersion: v1
kind: Service
metadata:
name: my-web-service
spec:
type: ClusterIP
selector:
app: web
ports:
- protocol: TCP
port: 80
targetPort: 80
포트(port)는 서비스 쪽에서 해당 파드를 향해 열린 포트를 말하고, 타깃 포트(targetport)는 서비스가 접근할 파드의 포트입니다. app=web이라는 레이블(label)을 가진 셀렉터(selector) 값을 통해 파드의 80 포트를 서비스가 접근할 대상으로 지정했습니다. 쿠버네티스는 서비스 프록시가 사용할 ClusterIP 주소를 이 서비스에 할당합니다. 셀렉터 컨트롤러는 셀렉터와 일치하는 파드가 새롭게 생성되었는지 혹은 기존 것이 삭제되었는지 지속적으로 확인하면서 my-web-service라는 서비스에 대한 운영을 지원합니다.
위의 메타 파일을 적용하면 생성된 클러스터 IP 서비스가 조회됩니다.
$kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-web-service ClusterIP 10.128.218.27 <none> 80/TCP 1m18s
…(이하 생략)
노드포트 방식은 외부 진입점 역할을 하는 서비스입니다. 이 방식은 앞에서 언급한 ClusterIP와 함께 외부에서 접근 가능한 포트 번호(30000 ~ 32767 사이에서 할당)를 클러스터의 모든 노드에 할당합니다. IP와 포트 번호를 사용하여 셀렉터에서 지정된 파드에 외부에서 접속이 가능하고, 해당 포트로 전송된 모든 트래픽은 서비스로 전달됩니다. 모든 작업자 노드는 할당된 노드포트에서 서비스에 대한 수신 요청을 대기합니다.
이 방식은 클라우드 서비스 제공사의 로드밸런서 상품을 통해 외부 접속을 쿠버네티스 내부의 자원으로 연결하는 서비스입니다. 마찬가지로 클러스터 IP와 노드포트를 생성하여, 또 다른 로드밸런서에 할당합니다. 현업에서 많이 쓰는 방식이므로 다음 문단에서 좀 더 자세히 살펴보겠습니다.
로드밸런서는 외부 요청을 서비스로 라우팅하는 컨트롤러 역할을 하며, 이를 통해 요청을 분산 처리할 수 있습니다. 클라우드 서비스 제공사의 로드밸런서를 사용할 때는 쿠버네티스에서 로드밸런서 타입의 서비스를 생성하여 사용합니다. 예를 들어, AWS의 ELB, GCP의 GCE, Azure의 Azure Load Balancer, Akamai 클라우드의 NodeBalancer를 사용할 수 있습니다.
다음은 로드밸런서 타입의 서비스를 생성하는 메타 파일 예제입니다.
apiVersion: v1
kind: Service
metadata:
name: my-web-service-lb
spec:
selector:
app: web
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
위의 메타 파일을 적용하면 새롭게 생성된 서비스까지 조회됩니다.
$kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-web-service ClusterIP 10.128.16.17 <none> 80/TCP 8m46s
my-web-service-lb LoadBalancer 10.128.156.12 139.162.92.40 80:30421/TCP 7
…(이하 생략)
클러스터 IP와 달리 외부에서 접속 가능한 EXTERNAL-IP가 할당되었음을 알 수 있습니다. Port 컬럼의 ‘80:30421’의 의미는 외부에서 TCP 80 포트로 접속했을 때, 내부 클러스터의 30421 포트로 접속하라는 의미입니다.
메타 파일의 셀렉터에서는 ‘app=web’라는 레이블을 가진 리소스를 서비스 대상으로 지정하고 있습니다. 로드밸런서 타입의 서비스는 클라우드 제공사가 로드밸런서를 만들어주는 방식이고, 메타 파일 적용 이후에 클라우드 웹 콘솔에서 생성된 로드밸런서를 확인할 수 있습니다. 필자의 경우는 Akamai 클라우드의 쿠버네티스 엔진을 사용하여 실습했고, 다음과 같은 결과를 얻었습니다.
로드밸런서의 구성을 웹 콘솔에서 좀 더 살펴보면, 쿠버네티스 클러스터의 워커 노드들이 30401 포트를 통해 로드밸런서 뒤단에 연결되어 있음을 확인할 수 있습니다.
결과적으로 외부 IP를 보유한 로드밸런서로 들어온 트래픽은 백엔드 쪽 워커 노드에서 운영 중인 파드로 전달됩니다. 이때 기본적으로 모든 파드에 트래픽이 균등하게 나누어지는 방식을 사용하지만, 클라우드 제공사는 자신들만의 로드밸런싱 방식에 대한 옵션을 추가하기도 합니다.
일부 클라우드 서비스 제공사는 로드밸런서 IP 속성을 메타 파일에서 지정할 수 있도록 허용합니다. 로드밸런서 IP 필드가 지정되지 않으면, 무작위로 IP 주소가 설정됩니다. 클라우드 서비스 제공사가 이 기능을 지원하지 않는 경우, 이 값을 지정하더라도 설정한 로드밸런서 IP 필드는 무시됩니다.
로드밸런서 서비스는 클라우드 플랫폼에서 제공하는 로드밸런서를 이용하여 요청을 분산 처리하는 간편한 기능을 제공합니다. 하지만 클라우드마다 서로 다른 트래픽 분배 알고리즘으로 작동하고, 어느 경우엔 별도의 비용이 발생할 수도 있습니다. 따라서 이런 부분을 사전에 잘 파악하고 사용하는 것이 좋습니다.
지금까지 쿠버네티스의 대표적인 통신 방법을 내부 통신과 외부 통신 방식으로 나누어 알아보았습니다. 다음 편에서는 외부 사용자를 위한 웹 서비스에 적합한 인그레스(Ingress) 통신 방식에 대해 알아보겠습니다.
글 테크유람
편집 오신엽 객원 에디터
요즘IT의 모든 콘텐츠는 저작권법의 보호를 받는 바, 무단 전재와 복사, 배포 등을 금합니다.