8.2.4 [실습] 다양한 서비스 타입 생성 및 테스트
이론으로 쿠버네티스 서비스의 필요성과 다양한 타입(ClusterIP, NodePort, LoadBalancer, ExternalName), 그리고 서비스가 셀렉터를 통해 어떻게 파드와 연결되는지 자세히 살펴보았습니다. 이제는 직접 손으로 다양한 타입의 서비스를 만들어보고, 실제로 이 서비스들을 통해 애플리케이션에 접근해보면서 그 동작 방식을 체감해 볼 시간입니다! 이번 실습에서는 간단한 웹 애플리케이션을 배포하고, 이 애플리케이션을 위해 ClusterIP 타입과 NodePort 타입의 서비스를 각각 생성하여 어떻게 접근할 수 있는지 확인할 것입니다. (LoadBalancer 타입은 클라우드 환경이나 MetalLB와 같은 추가 구성이 필요하므로, 여기서는 기본적으로 테스트 가능한 두 가지 타입에 집중하겠습니다. 만약 환경이 지원된다면 LoadBalancer 타입도 동일한 방식으로 테스트해볼 수 있습니다.)
본 실습을 위해서는 이전 실습들과 마찬가지로 쿠버네티스 클러스터와 kubectl CLI가 준비되어 있어야 합니다. Minikube, kind, Docker Desktop의 쿠버네티스 기능 또는 클라우드 제공업체의 관리형 서비스를 사용하시면 됩니다. 실습을 위해 간단한 Nginx 웹 서버를 백엔드 파드로 사용할 것입니다.
자, 그럼 쿠버네티스 서비스의 마법을 직접 경험하러 떠나볼까요?
8.2.4.1 ClusterIP 서비스 생성 및 클러스터 내부에서 접속 확인 (exec 활용)
가장 먼저, 클러스터 내부에서만 접근 가능한 기본 서비스 타입인 ClusterIP 서비스를 생성해 보겠습니다. 이 서비스는 클러스터 내의 다른 파드들이 백엔드 Nginx 파드 그룹에 접근할 수 있는 안정적인 엔드포인트를 제공할 것입니다.
1단계: 백엔드 애플리케이션 배포 (디플로이먼트 생성)
먼저 서비스의 대상이 될 간단한 Nginx 웹 서버 파드들을 디플로이먼트를 사용하여 2개 생성하겠습니다. 이 디플로이먼트의 파드들은 app: my-nginx-app 이라는 레이블을 갖도록 설정합니다.
아래 내용을 my-nginx-deployment.yaml 파일로 저장해 주세요.
터미널에서 다음 명령어로 디플로이먼트를 생성합니다.
잠시 후 kubectl get pods -l app=my-nginx-app 명령으로 2개의 Nginx 파드가 Running 상태인지 확인합니다.
2단계: ClusterIP 서비스 생성
이제 위에서 배포한 Nginx 파드 그룹(app: my-nginx-app 레이블을 가진 파드들)을 위한 ClusterIP 타입의 서비스를 생성하겠습니다.
아래 내용을 my-clusterip-service.yaml 파일로 저장해 주세요.
터미널에서 다음 명령어로 서비스를 생성합니다.
“service/my-nginx-clusterip-svc created” 메시지가 출력되면 성공입니다. 생성된 서비스의 정보를 확인해 보겠습니다.
출력 결과를 보면 TYPE이 ClusterIP로 되어 있고, CLUSTER-IP 필드에 고유한 가상 IP 주소가 할당된 것을 확인할 수 있습니다. PORTS는 80/TCP로 표시될 것입니다.
3단계: 클러스터 내부에서 접속 확인 (exec 활용)
ClusterIP 서비스는 클러스터 외부에서는 직접 접근할 수 없습니다. 따라서 이 서비스가 제대로 동작하는지 확인하려면 클러스터 내부의 다른 파드에서 이 서비스로 접속을 시도해야 합니다. 이를 위해 우리는 kubectl exec 명령어를 사용하여, 임시로 실행되는 간단한 유틸리티 컨테이너(예: busybox) 내부에서 wget이나 curl과 같은 도구로 ClusterIP 서비스에 HTTP 요청을 보내볼 것입니다.
먼저, ClusterIP 서비스의 클러스터 IP 주소를 확인합니다 (위 kubectl get service 명령 결과에서 확인). 예를 들어 10.100.200.5라고 가정하겠습니다. (실제로는 DNS 이름을 사용하는 것이 더 좋습니다.)
이제 임시 busybox 파드를 실행하고, 그 파드 내부의 셸로 접속하여 wget 명령을 실행합니다. (이 명령은 파드를 만들고 바로 접속한 후, 종료하면 파드도 자동으로 삭제되는 방식입니다.)
위 명령을 실행하면 busybox 파드 내부의 셸 프롬프트 (/ #)가 나타날 것입니다. 여기서 다음 wget 명령을 실행하여 ClusterIP 서비스의 IP 주소와 80번 포트로 접속을 시도합니다. (만약 wget이 없다면 apk add –no-cache curl 등으로 curl을 설치 후 사용 가능합니다.)
성공적으로 접속되었다면, Nginx의 기본 환영 페이지 HTML 내용이 터미널에 출력될 것입니다. 이는 ClusterIP 서비스가 정상적으로 요청을 수신하여 백엔드 Nginx 파드 중 하나로 전달했음을 의미합니다. 여러 번 실행하면 로드 밸런싱되어 다른 Nginx 파드로 요청이 전달될 수도 있습니다 (단, Nginx 기본 페이지는 동일하므로 눈에 띄는 차이는 없을 수 있습니다).
exit 명령으로 busybox 셸을 빠져나오면 임시 파드는 자동으로 삭제됩니다. 이처럼 ClusterIP 서비스는 클러스터 내부 통신을 위한 안정적이고 편리한 방법을 제공합니다.
8.2.4.2 NodePort 서비스 생성 및 외부 브라우저/curl로 접속 확인
이번에는 클러스터 외부에서도 각 노드의 특정 포트를 통해 서비스에 접근할 수 있도록 하는 NodePort 타입의 서비스를 생성해 보겠습니다. 백엔드 애플리케이션은 앞서 8.2.4.1에서 배포한 my-nginx-deployment를 그대로 사용합니다.
1단계: NodePort 서비스 생성
app: my-nginx-app 레이블을 가진 Nginx 파드 그룹을 위한 NodePort 타입의 서비스를 생성합니다.
아래 내용을 my-nodeport-service.yaml 파일로 저장해 주세요.
터미널에서 다음 명령어로 서비스를 생성합니다.
“service/my-nginx-nodeport-svc created” 메시지가 출력됩니다. 생성된 서비스의 정보를 확인합니다.
출력 결과를 보면 TYPE이 NodePort로 되어 있고, CLUSTER-IP도 할당되어 있습니다. 가장 중요한 것은 PORT(S) 컬럼을 보면 80:<NodePort>/TCP 형태로 표시되는 부분입니다. 여기서 <NodePort>는 쿠버네티스가 자동으로 할당한 30000번대 포트 번호이거나, YAML 파일에서 직접 지정한 포트 번호일 것입니다. 이 <NodePort> 번호를 잘 기억해 두세요. 예를 들어 31234라고 가정하겠습니다.
2단계: 외부 브라우저 또는 curl로 접속 확인
이제 클러스터 외부에서 이 NodePort 서비스를 통해 Nginx 웹 서버에 접속해 보겠습니다. 이를 위해서는 클러스터 워커 노드 중 하나의 IP 주소를 알아야 합니다.
다음 명령어로 노드 목록과 IP 정보를 확인할 수 있습니다.
INTERNAL-IP 또는 EXTERNAL-IP (만약 외부에서 접근 가능한 IP가 있다면) 컬럼에서 워커 노드의 IP 주소를 확인합니다. (Minikube를 사용 중이라면 minikube ip 명령으로 클러스터 IP를 확인할 수 있고, 이 IP가 노드 IP 역할을 합니다. Docker Desktop의 경우 localhost로 접근 가능할 수 있습니다.)
확인된 노드 IP 주소 (예: 192.168.49.2 – Minikube 예시)와 앞서 확인한 <NodePort> 번호 (예: 31234)를 사용하여 웹 브라우저 주소창에 http://<노드_IP>:<NodePort> (예: http://192.168.49.2:31234)를 입력하거나, 터미널에서 curl 명령을 실행합니다.
성공적으로 접속되었다면, Nginx의 기본 환영 페이지가 보이거나 HTML 내용이 출력될 것입니다. 이는 외부에서 노드의 특정 포트(NodePort)를 통해 서비스에 접근했고, 서비스가 이 요청을 다시 백엔드 Nginx 파드로 전달했음을 의미합니다. 다른 워커 노드의 IP 주소와 동일한 <NodePort>를 사용해도 같은 결과가 나타나야 합니다 (모든 노드에 해당 NodePort가 열리기 때문입니다).
이처럼 NodePort 서비스는 클러스터 외부에서 애플리케이션에 접근할 수 있는 간단한 방법을 제공합니다. 하지만 앞서 언급했듯이, 프로덕션 환경에서는 보통 NodePort 앞에 외부 로드 밸런서를 두거나, LoadBalancer 타입의 서비스 또는 인그레스(Ingress)를 사용하는 것이 더 권장됩니다.
이번 실습을 통해 우리는 ClusterIP 서비스와 NodePort 서비스를 직접 생성하고, 각 타입의 서비스가 어떻게 동작하며 어떻게 접근할 수 있는지 확인했습니다. 이러한 경험은 쿠버네티스에서 애플리케이션을 배포하고 노출하는 다양한 시나리오에 대한 이해를 높이는 데 큰 도움이 될 것입니다. 만약 클라우드 환경을 사용하고 계신다면, type: LoadBalancer로 서비스를 생성하여 클라우드 로드밸런서가 프로비저닝되고 외부 IP가 할당되는 과정도 직접 확인해 보시길 권장합니다.
