포트 포워딩을 사용해서 클러스터 내 애플리케이션에 접근하기
이 페이지는 kubectl port-forward
를 사용해서 쿠버네티스 클러스터 내에서
실행중인 Redis 서버에 연결하는 방법을 보여준다. 이 유형의 연결은 데이터베이스
디버깅에 유용할 수 있다.
시작하기 전에
-
쿠버네티스 클러스터가 필요하고, kubectl 커맨드-라인 툴이 클러스터와 통신할 수 있도록 설정되어 있어야 한다. 만약, 아직 클러스터를 가지고 있지 않다면, minikube를 사용해서 생성하거나 다음의 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있다.
쿠버네티스 서버의 버전은 다음과 같거나 더 높아야 함. 버전: v1.10. 버전 확인을 위해서, 다음 커맨드를 실행kubectl version
. -
redis-cli를 설치한다.
Redis 디플로이먼트와 서비스 생성하기
-
Redis를 실행하기 위해 디플로이먼트를 생성한다.
kubectl apply -f https://k8s.io/examples/application/guestbook/redis-master-deployment.yaml
성공적인 명령어의 출력은 디플로이먼트가 생성됐다는 것을 확인해준다.
deployment.apps/redis-master created
파드 상태를 조회하여 파드가 준비되었는지 확인한다.
kubectl get pods
출력은 파드가 생성되었다는 것을 보여준다.
NAME READY STATUS RESTARTS AGE redis-master-765d459796-258hz 1/1 Running 0 50s
디플로이먼트 상태를 조회한다.
kubectl get deployment
출력은 디플로이먼트가 생성되었다는 것을 보여준다.
NAME READY UP-TO-DATE AVAILABLE AGE redis-master 1/1 1 1 55s
아래의 명령어를 사용하여 레플리카셋 상태를 조회한다.
kubectl get rs
출력은 레플리카셋이 생성되었다는 것을 보여준다.
NAME DESIRED CURRENT READY AGE redis-master-765d459796 1 1 1 1m
-
Redis를 네트워크에 노출시키기 위해 서비스를 생성한다.
kubectl apply -f https://k8s.io/examples/application/guestbook/redis-master-service.yaml
성공적인 커맨드의 출력은 서비스가 생성되었다는 것을 확인해준다.
service/redis-master created
서비스가 생성되었는지 확인한다.
kubectl get svc | grep redis
출력은 서비스가 생성되었다는 것을 보여준다.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE redis-master ClusterIP 10.0.0.213 <none> 6379/TCP 27s
-
Redis 서버가 파드 안에서 실행되고 있고, 6379번 포트에서 수신하고 있는지 확인한다.
# redis-master-765d459796-258hz 를 파드 이름으로 변경한다. kubectl get pod redis-master-765d459796-258hz --template='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}'
출력은 파드 내 Redis 포트 번호를 보여준다.
6379
(이 TCP 포트는 Redis가 인터넷에 할당된 것이다).
파드의 포트를 로컬 포트로 포워딩하기
-
`kubectl port-forward` 명령어는 파드 이름과 같이 리소스 이름을 사용하여 일치하는 파드를 선택해 포트 포워딩하는 것을 허용한다.
# redis-master-765d459796-258hz 를 파드 이름으로 변경한다. kubectl port-forward redis-master-765d459796-258hz 7000:6379
이것은
kubectl port-forward pods/redis-master-765d459796-258hz 7000:6379
또는
kubectl port-forward deployment/redis-master 7000:6379
또는
kubectl port-forward rs/redis-master 7000:6379
또는 다음과 같다.
kubectl port-forward service/redis-master 7000:redis
위의 명령어들은 모두 동일하게 동작한다. 이와 유사하게 출력된다.
Forwarding from 127.0.0.1:7000 -> 6379 Forwarding from [::1]:7000 -> 6379
참고:kubectl port-forward
는 프롬프트를 리턴하지 않으므로, 이 연습을 계속하려면 다른 터미널을 열어야 한다.
-
Redis 커맨드라인 인터페이스를 실행한다.
redis-cli -p 7000
-
Redis 커맨드라인 프롬프트에
ping
명령을 입력한다.ping
성공적인 핑 요청을 반환한다.
PONG
선택적으로 kubectl 이 로컬 포트를 선택하게 하기
만약 특정 로컬 포트가 필요하지 않다면, kubectl
이 로컬 포트를 선택 및 할당하게 하여,
조금 더 단순한 문법으로 로컬 포트 충돌 관리를 위한
부담을 줄일 수 있다.
kubectl port-forward deployment/redis-master :6379
kubectl
도구는 사용 중이 아닌 로컬 포트 번호를 찾는다. (낮은 포트 번호는
다른 애플리케이션에서 사용될 것이므로, 낮은 포트 번호를 피해서) 출력은 다음과 같을 것이다.
Forwarding from 127.0.0.1:62162 -> 6379
Forwarding from [::1]:62162 -> 6379
토의
로컬 7000 포트에 대한 연결은 Redis 서버가 실행중인 파드의 6379 포트로 포워딩된다. 이 연결로 로컬 워크스테이션에서 파드 안에서 실행 중인 데이터베이스를 디버깅하는데 사용할 수 있다.
참고:kubectl port-forward
는 TCP 포트에서만 구현된다. UDP 프로토콜에 대한 지원은 이슈 47862에서 추적되고 있다.
다음 내용
kubectl port-forward에 대해 더 알아본다.