분명 Nodeport로 하면 외부접속이 된다고 했는데 외부접속이 안되는 문제가 발생했다....
다시 하나씩 진행해서 해결한 과정을 적어보려고 합니다,,,
1. 실습 환경
- 호스트 PC: 제가 실제로 작업하는 컴퓨터 (Windows 또는 macOS 등)
- 가상 머신 (VM): 호스트 PC 위에 설치된 Ubuntu Server (저는 VirtualBox 사용)
- Kind 클러스터: 이 Ubuntu VM 안에 Docker가 설치되어 있고, 그 Docker 위에서 Kind Kubernetes 클러스터를 실행했습니다.
- Kind는 Kubernetes 노드를 Docker 컨테이너로 띄워서 경량 클러스터를 제공해요.
- 배포된 애플리케이션: 클러스터 내에 MySQL, MongoDB 같은 데이터베이스와 Java 애플리케이션을 Pod 형태로 배포했습니다.
- 접속 목표: 호스트 PC에서 브라우저를 통해 VM 내부 Kind 클러스터의 Java 애플리케이션(NodePort 30080)에 접속하는 것이 목표입니다.
2. NodePort로 외부 접속 과정
[호스트 PC 사용자] --(1. VM 포트 포워딩)--> [VM (Ubuntu Server)] --(2. Kind extraPortMappings)--> [Kind 노드 컨테이너] --(3. K8s NodePort Service)--> [애플리케이션 Pod]
3. 외부 접속이 안됐던 원인
kind를 사용하면 extraPortMapping를 해줘야 외부 접속이 가능하다.
일반적인 온프레미스 Kubernetes 클러스터나 클라우드 기반 클러스터에서는 NodePort 서비스를 배포하면 클러스터 노드의 특정 포트가 바로 외부에 열립니다.
4. Kind cluster의 특징
Kind는 이름처럼 Docker in Kubernetes, 즉 Docker 컨테이너 안에 Kubernetes 노드를 실행하는 방식입니다.
- 일반 Kubernetes 노드: 물리 서버나 가상 머신(VM) 자체가 노드입니다. 여기에 NodePort 서비스를 배포하면, 해당 노드(서버/VM)의 IP 주소와 NodePort를 통해 바로 접근할 수 있습니다.
- Kind Kubernetes 노드: VM 안에 있는 Docker 컨테이너가 노드 역할을 합니다. 이 Docker 컨테이너는 VM 내부의 별도 네트워크 브릿지(Docker Bridge Network)에 연결되어 있어요. 기본적으로 VM 외부에서 이 Docker 컨테이너의 네트워크로 직접 접근할 수 없습니다. Docker 컨테이너는 VM 내에서 격리되어 있기 때문이다.
바로 이 지점에서 extraPortMappings가 필요합니다. extraPortMappings는 Kind 클러스터를 생성할 때, VM의 포트를 Kind 노드 컨테이너의 포트로 매핑해주는 역할을 합니다.
- 없다면: VM 포트로 들어온 트래픽이 Docker 컨테이너 안의 NodePort로 전달될 방법이 없습니다. 트래픽은 VM에 도달하지만, 컨테이너의 벽을 넘지 못하고 갇히게 됩니다.
- 있다면: kind-config.yaml에 hostPort와 containerPort를 지정함으로써, VM의 특정 포트(hostPort)로 들어온 트래픽을 Kind 노드 컨테이너 내부의 동일한 포트(containerPort, 즉 NodePort)로 넘겨줄 통로를 만들어주는 것입니다.
이 extraPortMappings 설정은 클러스터를 처음 생성할 때만 적용할 수 있으며, 한 번 생성된 클러스터는 이 설정을 변경하려면 클러스터를 삭제하고 다시 만들어야 합니다.
5. kind cluster 생성
# kind-config.yaml
# Kind 클러스터 구성의 API 버전 및 종류
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
# 클러스터 노드 구성
nodes:
- role: control-plane # 이 노드를 컨트롤 플레인(마스터) 노드로 설정
# 호스트(VM)에서 Kind 노드 컨테이너로 포트를 매핑합니다.
# 외부에서 NodePort 서비스로 접근하기 위해 필수적입니다.
extraPortMappings:
# NodePort 30080을 외부(VM)에 노출하는 설정
- containerPort: 30080 # Kind 노드 컨테이너 내부의 포트 (Kubernetes NodePort)
hostPort: 30080 # VM의 포트 (이 포트로 VM에 접근)
listenAddress: "0.0.0.0" # VM의 모든 네트워크 인터페이스에서 수신
protocol: TCP # TCP 프로토콜 사용
sudo kind create cluster --name my-java-app-cluster --config kind-config.yaml
6. VM 포트 포워딩 설정
extraPortMappings와 NodePort에서 열어주었던 30080 포트를 vm 포트포워딩하여 로컬에서도 접속 할 수 있도록 열어줍니다.
호스트 IP는 로컬에서 접속 할 수 있도록 127.0.0.1
게스트 IP는 10.0.2.15 ( vm 머신에서 ip a 명령어를 실행했을 때 나오는 vm의 IP)
7. 로컬에서 접속
'Cloud' 카테고리의 다른 글
Kubernetese Conifg , Secret 실습 및 정리 (2) | 2025.07.11 |
---|---|
Kubernetes RollingUpdate, Rollback 실습 (3) | 2025.07.11 |
Spring boot Docker와 Kubernetes 활용하여 배포하기 (3) | 2025.07.09 |