구동중인 클러스터의 서비스를 외부 네트워크에 공개하기 위해 공유기 설정을 만져보려고 합니다.
공유기로 포트 포워딩
- iptime 공유기 설정 페이지 접속
- 로그인 후 관리 - 고급 설정 - 네트워크 관리 - DHCP 서버 설정으로 들어갑니다.
- 내 아이피를 확인합니다. 192.168.0.236
- 고급설정 - NAT/라우터 관리 - 포트포워드 설정
- 접근할 내부 IP와, 외부에서 접속할 포트, 내부로 연결될 포트를 설정합니다.
- 외부(175.209.x.x):<포트>로 접속했을 때 포워딩 될 내부IP:<포트>를 설정하는 겁니다.
- DMZ 설정
- DMZ는 외부IP:모든 포트로 접속했을 때 내부IP로 접속되도록 모든 포트를 개방하는 것입니다.
- 단 보안에 취약하니 가능하면 사용하지 마시고, 포트 포워드로 하나씩 개방하는 걸 추천드립니다.
SSH로 포트 포워딩
- ssh로 시도
공유기를 통하지 않고 ssh로 Local port forwarding, Remote port forwarding, Dynamic port forwarding이 가능합니다.
- 내부망에서 사용할 목적일 경우 유용합니다. 이 방법은 외부에서 공용IP로 접속하는 방법이 아닙니다.
제가 현재 로컬 포트 포워드만 사용할 계획이기 때문에 로컬 포트 포워딩을 기준으로 설명드리겠습니다.
- SSH 터널링 명령어 :
ssh -L [로컬에서 사용할 포트]:[최종 접근할 목적지] [SSH 서버 주소]
- 예)
ssh -L 2464:192.168.49.2:80 sysadmin@192.168.0.8
- 현재 내 로컬에서 localhost:2464로 요청할건데, ssh로 접근할 서버는 sysadmin@192.168.0.8(내 리눅스 서버)이고 최종 접근할 목적지는 192.168.49.2:80(리눅스 내 VM 클러스터 내 서비스의 external-ip)야.
- 내가 위의 명령어를 터미널에 입력하면 ssh 서버 주소로 접속해주고, 그 이후부터는 내 로컬에서 브라우저에 localhost:2464를 입력하면 192.168.49.2:80으로 포워딩해줘.
Kubeflow를 ssh로 포트 포워딩했을 때 이슈
- localhost로 접근은 가능하지만 pipeline, run 등이 unhealth 상태입니다.(정상 접근안됌)
- 목록을 볼 수도, 파이프라인을 업로드할 수도 없습니다.
- ssh -L 포워딩 시에 내부IP에 192.168.49.2:80포트로 접근할 것을 지시했는데, 192.168.49.2:*에 붙은 다양한 서비스로 연결되지 않는 것이 문제라고 생각했습니다.
- minikube에서 pods 상태를 살펴보니 minio와 ml-pipeline에 오류가 발생했습니다.
- ml-pipeline은 minio를 불러올 수 없어서 발생한 연쇄 오류였습니다.
- minio는
dial tcp connect connection refused
오류가 발생했습니다.
- 시도 1 :
minikube stop
, minikube start
: 미니쿠버 재시작
minikube를 재시작하니 해결되었습니다!
추가 : 서버 외부에서 ip에 어떻게 접근해야할까?
현재 서비스는 192.168.49.2(external-ip)를 통해서 서비스 중이다.(minikube tunnel 사용)
서버 내에서는 routeR3에 등록해놓은 것처럼 kubeflow2.rndfk.com으로 접근하면 192.168.49.2로 연결되어 접근할 수 있다.(그러니까 minikube를 구축한 서버 및 클러스터에서는 작동한다고 보면 되겠다.)
- 내 공유기 ip의 포트가 열려있는지 확인하자.
- 포트를 열어야 할 IP와 포트번호가 뭔지 정확히 알아야한다.
- 일단 서비스 관점에서 내 서비스는 192.158.49.2로 접속하고, 30247 포트로 접속하면 80포트로 포트포워딩된다.
- (서버에서)위의 external-ip로 접근하면 원하는 페이지를 얻어오는게 확인되지만 공유기 ip로는 불가능하다는 것을 확인했다.
- (같은 서브넷 내에서)같은 공유기를 사용하는 내 MAC에서 external-ip로 접근해도 접근이 불가능하다. 혹시 몰라서 MAC에서 external-ip의 포트를 확인해봤지만 80, 30247 모두 닫혀있다는 것을 알 수 있었다.
- curl -v로 접근했을 때 Trying이 오래 지속되고 실패하는 것은 방화벽이 열리지 않은 경우라고 한다.
- 특정 포트 열기 참고
- 이런 방식으로 포트를 열고 서비스하는게 정식적인 방법이겠지만, 아직 헷갈리는 부분이 있어서 잠시 중단합니다.
남은 궁금증
- 외부IP로 내부IP(특정 내부 서버)로 접근하는 것은 iptime의 포트포워딩 설정으로 가능하다.
- 예를 들어 외부ip:12345 포트로 접속하면 내부특정ip:80 포트로 포워딩하는 것이 가능
- 내부IP에서 클러스터 내부IP로 접근하는 것은 ssh 포트포워딩으로 가능하다.
- 예를 들어 localhost:1234로 192.168.0.8 서버의 192.168.49.2:80 서비스로 접근할 수 있다.
- 여기서 서버의 서비스는 쿠버네티스 클러스터 내에서 external-ip로 제공되는 서비스이다.
- 그럼 외부ip로 접속했을 때 서버 내부로, 서버 내부에서 클러스터 내부 서비스로 연결하는 것은 어떻게 하는가?