일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
- 백준
- JIRA
- 스프링시큐리티
- 도커
- 국제화
- oauth2
- 스프링
- docker
- 오블완
- 액세스토큰
- springdataredis
- 스프링부트
- yaml-resource-bundle
- 재갱신
- AWS
- 프로그래머스
- 소셜로그인
- 티스토리챌린지
- 트랜잭션
- githubactions
- CI/CD
- Spring
- 토이프로젝트
- 메시지
- java
- springsecurityoauth2client
- springsecurity
- 파이썬
- 리프레시토큰
- 데이터베이스
- Today
- Total
땃쥐네
[Kubernetes] 파드-쿠버네티스 네트워크, 파드 외부에서 접속하기 본문
파드를 실행했으나 접속할 수 없음
지난 글에서, tomcat 파드를 8080 포트에서 실행을 했으나 localhost:8080 으로 접근 불가능한 문제가 있었다.
왜 이 주소로 접속했을 때 tomcat 에 접속할 수 없는 지 문제의 원인을 파악하고, 해결해봐야한다.
무엇이 문제의 원인인 지는, 파드 내부와 쿠버네티스 네트워크의 관계에 대한 이해가 먼저 필요하다.
파드와 쿠버네티스 네트워크
각 파드는 하나의 고유한 IP 주소를 가지고 있고, 이 IP는 해당 파드 내의 모든 컨테이너가 공유한다.
이들은 같은 호스트네임을 공유한다.
이들 컨테이너는 동일한 IP 주소를 사용하여 서로 통신하므로, 내부망에서 통신한다고 할 수 있다.
그런데, 파드 내의 컨테이너들은 동일한 IP를 공유하므로, 각 파드내에서 동일한 포트 번호는 단 한 번만 사용할 수 있다.
예를 들어 파드 내에서 컨테이너1이 8080 포트를 사용하고 있다면, 같은 파드 내의 다른 컨테이너는 8080 포트를 사용할 수 없다.
파드 네트워크는 쿠버네티스 내부 네트워크에 소속되어 있다.
쿠버네티스 내부에서 고유한 IP 주소를 가지고 있으므로, 다른 파드들과 자유롭게 통신할 수 있다.
그림자료에서의 왼쪽에 있는 파드와 오른쪽에 있는 파드는 서로 같은 쿠버네티스 내부 네트워크에서 연결되어 있으므로 통신이 자유롭다. 그러면서 서로 독립적인 IP를 가지므로, 두 네트워크는 격리되어 있다고 말할 수 있다. 격리 되어 있기 때문에, 포트충돌이 일어나지 않는다. 왼쪽 파드에서 8080 포트에 컨테이너1이 실행됐고, 오른쪽 파드에서 8080 포트에 컨테이너3이 실행됐으나 이들은 충돌되지 않는다.
또한 쿠버네티스 내부 네트워크는 기본적으로 인터넷과 기본적으로 연결되어 있다.
쿠버네티스 네트워크에 속한 파드들은 외부 인터넷에 접근하는 것은 가능하지만, 외부 인터넷에서 쿠버네티스 네트워크에 직접적으로 접근할 수는 없다.
외부 인터넷에서 쿠버네티스에 위치한 파드에 접속하려면 별도의 쿠버네티스 기능을 사용해야한다.
톰캣 파드의 현재 상황
다시 현재 가지고 문제 상황을 돌이켜보면, 톰캣 파드에서 '톰캣 컨테이너'는 8080에서 실행되고 있고,
이 파드 내부 네트워크는 외부망과 사실상 독립되어 있다.
호스트 머신에 해당하는 로컬 컴퓨터가 속한 네트워크는 쿠버네티스 내부 네트워크 관점에서는 외부 네트워크이므로, 직접 접속할 수 없다.
그래서 파드 외부, 더 나아가 쿠버네티스 네트워크 외부에 위치한 로컬 컴퓨터에서 바로 접속할 수 없었던 것이다.
로컬 컴퓨터 입장에서는 파드에 어떻게 접속할까?
결국 로컬컴퓨터의 네트워크는 파드의 네트워크와 독립적으로 분리되어 있어서 기본적으로는 바로 톰캣 컨테이너에 요청을 보낼 수 없었다.
이 문제를 해결하는 방법은 크게 세 가지가 존재한다.
1. 로컬 컴퓨터(쿠버네티스 외부)에서 파드 내부로 들어가고, 파드 내부에서 톰캣 컨테이너에 요청을 보내는 방법
2. 로컬 컴퓨터(쿠버네티스 외부)에서 파드 내부 네트워크의 특정 포트로 접속할 수 있게 포트포워딩하는 방법
3. 별도로 쿠버네티스 제공하는 기능(서비스, ...)을 통해 파드에 접속하는 방법
여기서 3번째 내용은 여기서 다루지 않고 1,2 의 경우만 다뤄보도록 하겠다.
파드 내부에 직접 들어가서, 파드 내부에서 톰캣 컨테이너에 요청을 보내는 방법
# kubectl exec -it [파드명] -- bash
# 도커에서 컨테이너로 접속하는 명령어(docker exec -it [컨테이너 ID] bash)와 비슷하다.
$ kubectl exec -it tomcat-pod -- bash # tomcat-pod 내부 환경으로 접속
# ---Pod 내부---
$ curl localhost:8080 # Tomcat 으로 요청보내기
kubectl exec -it 파드명 -- bash 명령을 통해 파드에 직접 접속할 수 있다. (여기서 bash 가 안 되는 경우는 sh 를 사용하면 된다.)
Docker를 사용해봤다면 docker exec -it [컨테이너 ID] bash 명령을 통해 컨테이너에 접속해봤을텐데, 쿠버네티스에서도 비슷한 방식으로 파드에 접속하는 것이 가능하다.
파드 입장에서는 Tomcat 컨테이너가 자기 내부망에 연결된 애플리케이션이므로, curl 명령을 통해 localhost:8080 에 접속하면 톰캣 컨테이너로부터 응답이 오게 된다.
파드 내부 네트워크의 특정 포트로 접속할 수 있게 포트포워딩하는 방법
# kubectl port-forward pod/[파드명] [로컬에서의 포트]/[파드에서의 포트]
kubectl port-forward pod/tomcat-pod 8080:8080
로컬 컴퓨터의 8080 포트로 접속했을 때, tomcat-pod 내부의 8080 포트로 포트포워딩 시키려면 위 명령을 입력하면 된다.
이제 로컬 컴퓨터측에서 내부포트 8080 포트로 요청을 보내면, 해당 요청은 tomcat-pod 의 8080 포트로 포워딩된다.
curl 명령을 통해 localhost:8080 에 요청을 보내면 응답이 오며,
브라우저 상에서 localhost:8080 으로 접속하면 톰캣 페이지가 응답이 와서 렌더링된다. (404 페이지가 뜨는 것은 무시해도 된다. 일단 tomcat 에 접속이 됐다는 것이다.)
참고로 로컬 컴퓨터에서 쿠버네티스의 파드에 접속한 것은 로컬컴퓨터 네트워크의 8080 포트를 파드의 8080 포트로 포트 포워딩한 것이지 외부 인터넷의 트래픽을 이쪽으로는 포워딩 시킬 수 없다. 실제 외부 인터넷의 트래픽을 파드 내부의 8080 으로 포워딩 시키려면 다른 기능을 사용해야 한다.
파드 삭제
# kubectl delete pod [파드명]
$ kubectl delete pod tomcat-pod # tomcat-pod라는 파드 삭제
$ kubectl get pods # 파드가 잘 삭제됐는 지 확인
마지막으로, tomcat-pod 는 더 이상 필요 없으니 지워주면 된다.
'DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] 파드(Pod) 디버깅하는 방법 (0) | 2025.03.02 |
---|---|
[Kubernetes] 스프링부트 파드 실행 (+ ImagePullPolicy 주의점) (1) | 2025.03.02 |
[Kubernetes] 파드(Pod) 생성 및 목록 조회 (0) | 2025.02.26 |
[Kubernetes] 파드(Pod) (0) | 2025.02.26 |
[Kubernetes] Windows 로컬 환경에서 쿠버네티스 설치 (0) | 2025.02.25 |