포트 포워딩으로 클러스터의 애플리케이션에 접근하기

포트 포워딩으로 클러스터의 애플리케이션에 접근하기 (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에 대한 getpods/portforward에 대한 create예요.

포트 포워딩은 워크로드에 직접적인 네트워크 접근을 제공하고 네트워크 수준 제어를 우회할 수 있으므로, 클러스터 관리자는 이러한 권한을 신중하게 제한해야 해요.

더 알아보기 (Learn more)