포트 포워딩으로 클러스터의 애플리케이션에 접근하기
포트 포워딩으로 클러스터의 애플리케이션에 접근하기 (Use Port Forwarding to Access Applications in a Cluster)
이 페이지는 kubectl port-forward를 사용해 쿠버네티스 클러스터에서 실행 중인 MongoDB 서버에 연결하는 방법을 보여 줘요. 이런 유형의 연결은 데이터베이스 디버깅에 유용할 수 있어요.
출처: 문서
본문
시작하기 전에
- 쿠버네티스 클러스터가 필요하고,
kubectl명령줄 도구가 클러스터와 통신하도록 설정돼 있어야 해요. 이 튜토리얼은 제어 플레인 호스트 역할을 하지 않는 노드가 최소 두 개 있는 클러스터에서 실행하는 것을 권장해요. 아직 클러스터가 없다면 minikube를 사용하거나 다음 쿠버네티스 플레이그라운드 중 하나를 사용해 만들 수 있어요.- iximiuz Labs
- Killercoda
- KodeKloud
- 쿠버네티스 서버는 버전 v1.10 이상이어야 해요. 버전을 확인하려면
kubectl version을 입력하세요. - MongoDB Shell을 설치하세요.
MongoDB deployment와 service 만들기
MongoDB를 실행하는 Deployment를 만들어요.
kubectl apply -f https://k8s.io/examples/application/mongodb/mongo-deployment.yaml
성공한 명령의 출력은 deployment가 만들어졌음을 확인해 줘요.
deployment.apps/mongo created
준비되었는지 확인하기 위해 파드 상태를 확인해요.
kubectl get pods
출력은 만들어진 파드를 보여 줘요.
NAME READY STATUS RESTARTS AGE
mongo-75f59d57f4-4nd6q 1/1 Running 0 2m4s
Deployment의 상태를 확인해요.
kubectl get deployment
출력은 Deployment가 만들어졌음을 보여 줘요.
NAME READY UP-TO-DATE AVAILABLE AGE
mongo 1/1 1 1 2m21s
Deployment는 ReplicaSet을 자동으로 관리해요. ReplicaSet 상태를 확인해요.
kubectl get replicaset
출력은 ReplicaSet이 만들어졌음을 보여 줘요.
NAME DESIRED CURRENT READY AGE
mongo-75f59d57f4 1 1 1 3m12s
네트워크에 MongoDB를 노출하는 Service를 만들어요.
kubectl apply -f https://k8s.io/examples/application/mongodb/mongo-service.yaml
성공한 명령의 출력은 Service가 만들어졌음을 확인해 줘요.
service/mongo created
만들어진 Service를 확인해요.
kubectl get service mongo
출력은 만들어진 서비스를 보여 줘요.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mongo ClusterIP 10.96.41.183 <none> 27017/TCP 11s
MongoDB 서버가 파드에서 실행 중이고 포트 27017에서 수신 대기 중인지 확인해요.
# mongo-75f59d57f4-4nd6q 를 파드의 이름으로 변경하세요
kubectl get pod mongo-75f59d57f4-4nd6q --template='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}'
출력은 그 파드의 MongoDB 포트를 보여 줘요.
27017
27017은 MongoDB의 공식 TCP 포트예요.
로컬 포트를 파드의 포트로 포워딩하기
kubectl port-forward는 파드 이름 같은 리소스 이름을 사용해 포트 포워딩할 일치하는 파드를 선택할 수 있게 해줘요.
# mongo-75f59d57f4-4nd6q 를 파드의 이름으로 변경하세요
kubectl port-forward mongo-75f59d57f4-4nd6q 28015:27017
이는 다음과 같아요.
kubectl port-forward pods/mongo-75f59d57f4-4nd6q 28015:27017
또는
kubectl port-forward deployment/mongo 28015:27017
또는
kubectl port-forward replicaset/mongo-75f59d57f4 28015:27017
또는
kubectl port-forward service/mongo 28015:27017
위 명령 중 아무거나 동작해요. 출력은 다음과 비슷해요.
Forwarding from 127.0.0.1:28015 -> 27017
Forwarding from [::1]:28015 -> 27017
참고:
kubectl port-forward는 반환되지 않아요. 연습을 계속하려면 다른 터미널을 열어야 해요.
MongoDB 명령줄 인터페이스를 시작해요.
mongosh --port 28015
MongoDB 명령줄 프롬프트에서 ping 명령을 입력해요.
db.runCommand( { ping: 1 } )
성공적인 ping 요청은 다음을 반환해요.
{ ok: 1 }
선택적으로 kubectl이 로컬 포트를 선택하게 하기
특정 로컬 포트가 필요하지 않다면, kubectl이 로컬 포트를 선택하고 할당하게 해서 로컬 포트 충돌을 관리할 필요를 덜 수 있어요. 구문은 조금 더 간단해요.
kubectl port-forward deployment/mongo :27017
kubectl 도구는 사용 중이 아닌 로컬 포트 번호를 찾아요(다른 애플리케이션이 사용할 수 있는 낮은 포트 번호는 피해요). 출력은 다음과 비슷해요.
Forwarding from 127.0.0.1:63753 -> 27017
Forwarding from [::1]:63753 -> 27017
논의 (Discussion)
로컬 포트 28015에 대한 연결은 MongoDB 서버를 실행하는 파드의 포트 27017로 포워딩돼요. 이 연결이 있으면 로컬 워크스테이션을 사용해 파드에서 실행 중인 데이터베이스를 디버깅할 수 있어요.
참고:
권한 부여와 보안 고려 사항
kubectl port-forward에 대한 접근은 RBAC(역할 기반 접근 제어) 같은 쿠버네티스 권한 부여 메커니즘으로 제어돼요. 권한 부여는 kubectl 클라이언트가 아니라 쿠버네티스 API 서버가 집행해요.
kubectl port-forward를 사용하려면 사용자가 대상 리소스(예: 파드 또는 Service)와 portforward 하위 리소스에 접근할 권한이 있어야 해요. 일반적으로 필요한 권한은 pods에 대한 get과 pods/portforward에 대한 create예요.
포트 포워딩은 워크로드에 직접적인 네트워크 접근을 제공하고 네트워크 수준 제어를 우회할 수 있으므로, 클러스터 관리자는 이러한 권한을 신중하게 제한해야 해요.
더 알아보기 (Learn more)
- kubectl port-forward에 대해 더 배워 보세요.