minikube service 외부 접속 안되는 이유

들어가며

최근 Kubernetes(K8S)를 공부하면서 Udemy 강의를 통해 로컬 환경에서 Minikube를 사용해 다양한 명령어와 기능을 배우고 있습니다. 제 환경은 macOS에서 Minikube를 Docker 드라이버로 실행하고 있는데, 이러한 환경에서 강사와 달리 예상치 못한 에러가 발생했습니다. 특히, NodePort로 노출한 서비스에 외부에서 접근이 되지 않는 문제가 있어 이를 공유하고자 합니다.

 

NodePort

Kubernetes에서 NodePort는 클러스터 외부에서 내부 서비스를 노출하기 위해 사용하는 가장 기본적인 방법 중 하나입니다. NodePort를 사용하면 클러스터 노드의 IP와 지정된 포트로 서비스를 노출할 수 있습니다. 이는 Kubernetes에서 가장 간단하게 서비스를 외부에 노출할 수 있는 방법이며, 클러스터 외부에서 직접 접근이 가능합니다.

하지만 제 macOS 환경에서는 NodePort로 서비스가 노출되었음에도 불구하고 외부에서 접근할 수 없는 문제가 발생했습니다. 그래서 이 문제의 원인과 해결 방법을 알아보았습니다.

 

Docker 드라이버의 특성

macOS에서 Minikube를 실행할 때 Docker 드라이버를 사용하는 경우, 클러스터는 사실상 Docker 컨테이너 내에서 실행됩니다. 이때, macOS에서 Docker는 Hypervisor Type 2를 사용하여 실행됩니다. Hypervisor Type 2는 호스트 OS 위에 VM을 올리고, 그 안에 게스트 OS를 설치하는 방식입니다. macOS에서는 HyperKit이라는 툴킷을 사용해 VM을 생성하고, 그 위에 경량화된 Linux OS를 올려 Docker를 실행합니다.

이 VM 내에서 Kubernetes 클러스터가 실행되며, 클러스터의 네트워크 설정 또한 VM 내에 존재합니다. 이로 인해 macOS 호스트에서 직접적으로 VM 내의 네트워크 리소스에 접근하는 데 제한이 발생합니다.

 

네트워크 제한

macOS에서 Docker는 기본적으로 L4(포트 바인딩) 연결을 지원하지만, L3(IP 주소 간 연결)는 지원하지 않습니다. 이 말은 macOS에서 Docker 컨테이너에 직접적인 IP 접근이 불가능하다는 의미입니다. Docker 컨테이너의 네트워크 인터페이스가 호스트의 네트워크 인터페이스와 직접적으로 연결되지 않기 때문에, NodePort를 사용하더라도 호스트 OS에서는 접근이 불가능하게 됩니다.

이러한 이유로, macOS에서는 minikube ip:NodePort로 서비스를 외부에 노출시키는 것이 불가능하고, 대신 kubectl port-forward를 사용하거나 minikube service 명령어로 터널링을 통해 서비스를 접근해야 합니다.

해결 방법

현재로서는 macOS에서 Minikube를 Docker 드라이버로 사용하여 NodePort를 통해 외부에서 서비스에 접근하는 것은 제한적입니다. 만약 로컬 개발 환경에서 이러한 문제를 해결하고 싶다면, 다른 드라이버(예: VirtualBox)를 사용하거나, minikube service 명령어로 터널링을 통해 접근하는 방법을 사용할 수 있습니다.

터널링

위의 경고문에서도 알려주듯 Docker 드라이버를 사용하고 있기 때문에 터미널을 열어줘야 실행 할 수 있다고 합니다.

결론

macOS에서 Docker 드라이버를 사용하는 Minikube 환경에서 NodePort를 통해 외부 접근이 불가능한 이유는 Docker의 네트워크 구조와 macOS의 네트워크 제약 때문입니다. 이러한 구조적 문제를 해결하기 위해선, Docker 드라이버 외의 다른 드라이버를 사용하는 방법을 고려하거나, minikube service 명령어를 통해 터널링하는 방식으로 접근해야 합니다.

Kubernetes를 학습하거나 개발할 때 이러한 macOS 특성을 이해하고, 환경에 맞는 적절한 해결 방법을 찾는 것이 중요합니다.