[Project] Multi-Tenant K8s Cluster on ARM64 - (13) [Refactor] Add web external port

developowl·2026년 3월 11일
post-thumbnail

현재 테넌트 서버에 접속 가능한 포트는 SSH 접속을 위한 포트뿐입니다. 테넌트 서버에 백엔드 서비스 혹은 모니터링 대시보드 등을 띄웠을 경우 외부 접속 포트가 없고, SSH 접속을 위한 포트로 접속 시 브라우저(HTTP)가 기대하는 응답 웹 프로토콜과 실제 응답으로 나가는 SSH 프로토콜이 충돌하는 상황 발생.


문제 상황

  • 웹 서비스용 외부 개방 포트 부재
  • 기존에 테넌트 서버당 하나씩 개방한 포트는 SSH 전용 포트이기에 요청-응답 프로토콜 간 충돌 발생

현재 테넌트 서버의 NodePort 관련 설정

  ports:
  - port: 2222           # 서비스 자체의 포트
    targetPort: 2222     # 파드 내부 컨테이너 포트
    nodePort: $NODEPORT  # 외부에서 노드로 들어오는 포트

📌 port, targetPort, nodePort 란?

port - 서비스 자체의 포트

  • 역할: 쿠버네티스 클러스터 내부에서 서비스 객체가 노출하는 포트
  • 설명: 클러스터 안의 다른 파드들이 이 서비스를 호출할 때 사용하는 포트. 즉, 서비스의 DNS 이름이나 ClusterIP를 통해 통신할 때 기준이 됨

targetPort - 파드 내부 컨테이너 포트

  • 역할: 트래픽이 최종적으로 도달하는 파드(애플리케이션) 내부의 포트
  • 설명: 실제 애플리케이션 코드가 수신 대기(Listen)하고 있는 포트 번호와 일치해야 함. selector 를 통해 연결된 파드로 트래픽을 전달하는 최종 목적지

nodePort - 외부에서 노드로 들어오는 포트

  • 역할: 클러스터 외부에서 각 워커 노드의 IP를 통해 접근할 때 사용하는 포트
  • 설명: 클러스터 외부의 사용자가 노드IP:nodePort 로 접속하면 트래픽이 쿠버네티스 내부로 유입
  • 범위: 기본적으로 30000~32767 사이의 포트번호 사용 (지정하지 않으면 범위 내에서 랜덤하게 할당됨)

해결 방안

  • 기존에 미리 선점(포트포워딩)해두었던 여분의 포트를 사용하여 각 테넌트 서버의 웹 서비스용 포트를 추가 지급
  • 환경변수를 사용하여 SSH_NODEPORTWEB_EXTERNAL_PORT 를 관리
spec:
  type: NodePort
  selector:
    app: <app 이름>
  ports:
  # SSH 접속 관련
  - name: ssh-access
    port: 2222
    targetPort: 2222
    nodePort: $SSH_NODEPORT # SSH 접속용 NodePort
	# 웹 접속 관련
  - name: web
    port: $WEB_EXTERNAL_PORT
    targetPort: $WEB_EXTERNAL_PORT
    nodePort: $WEB_NODEPORT

테스트

같은 스펙을 가진 테스트용 테넌트 서버에 간단한 nc 명령어로 접속 테스트

echo -e "Welcome to Test Tenant Server!" | nc -l -p <테넌트 서버의 웹 서비스용 포트>
  • http://<Public IP>:<웹 서비스용 포트> 로 접속
  • 결과 1
    (웹 서비스 전용 포트로 접속이 가능!)
  • 결과 2 (실제 테넌트 사용자)

  • 문제 상황을 제시해준 테넌트 사용자의 초기 목적대로 해당 팀의 Grafana 대시보드가 성공적으로 띄워졌음을 확인할 수 있습니다.

마무리

하나의 테넌트 서버에 용도가 다른 두 포트를 개방하며, 외부에서 트래픽이 들어왔을 때 내부에서 그 흐름을 파악할 수 있게 된 리팩토링이었던 것 같습니다. 네트워크 흐름에 대한 정리는 다음 포스팅에서 간단한 아키텍처와 함께 정리해보겠습니다.

profile
Don’t get mad at the computer.

0개의 댓글