포트 포워딩을 사용해 클러스터 내 애플리케이션에 접근하기

d4v1d·2022년 3월 7일
1

Docker & Kubernetes

목록 보기
7/8

개요

포트 포워딩을 사용해 현재 구동되고 있는 클러스터 내의 나의 애플리케이션에 접속하는 방법을 정리한 포스트입니다. 🥁

현재 구동되고 있는 서비스 정보 확인하기

현재 쿠버네티스를 통해 서비스가 배포되어 있다고 가정해봅시다.
해당 서비스를 제공하는 포트 번호를 알아내기 위해서는 yaml 파일을 확인하든가, 아니면 kubectl get service 명령어를 통해 확인할 수 있습니다.
아래 예시는 Flask를 이용한 웹 API 서버를 쿠버네티스를 이용해 배포한 후, 포트 포워딩을 통해 로컬호스트에서 Flask 서버에 접속해보는 과정입니다!

Flask API 서버 코드

from flask import Flask

app = Flask(__name__)
host_addr = "0.0.0.0"
host_port = 80

@app.route('/')
def hello():
    return "try /ping!"

@app.route('/ping')
def ping():
    return {'response': 'pong'}
   

if __name__ == "__main__":
    app.run(debug=True, 
            host=host_addr,
            port=host_port)

yaml 파일 확인

» cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  ...
spec:
  ...
  template:
    ...
    spec:
      containers:
        - name: flask-api-container
          image: <이미지 저장소>:<이미지 태그>
          imagePullPolicy: Always
          ports:
            - containerPort: 80 # 서버 프로그램에 접속하기 위한 포트 번호
---
apiVersion: v1
kind: Service
metadata:
  ...
spec:
  ports:
    - port: 3000 # 이 서비스를 3000번 포트로 제공하겠음!
      protocol: TCP
      targetPort: 80 # 이 서비스에 접속하면 배포된 서버의 80번 포트로 연결됨!
  selector:
    app: flask-api-server

kubectl get service로 확인

» kubectl get service
NAME                TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
flask-api-service   ClusterIP   10.xxx.xxx.xxx   <none>        3000/TCP   27m
...

위 두 가지 방법을 통해, 접속하려는 서비스의 포트 번호를 확인할 수 있습니다.

포트 포워딩(port-forwarding)

포트 포워딩을 사용해서 클러스터 내 애플리케이션에 접근하기
이제 로컬 호스트에서 위 서비스에 접속해보겠습니다!

# 로컬호스트의 가용 포트 중 하나를 서비스 포트에 연결
# 이 경우 kubectl이 로컬호스트의 가용 포트 번호를 랜덤으로 지정하여 포트 포워딩합니다(대체로 높은 번호의 포트).
» kubectl port-forward service/flask-api-service :3000
Forwarding from 127.0.0.1:56210 -> 80
Forwarding from [::1]:56210 -> 80

# 로컬호스트의 포트 하나를 지정하여 서비스 포트에 연결
» kubectl port-forward service/flask-api-service 12345:3000
Forwarding from 127.0.0.1:12345 -> 80
Forwarding from [::1]:12345 -> 80

두 번째 명령어인 kubectl port-forward service/flask-api-service 12345:3000의 결과를 통해 볼 수 있듯이, 서비스의 3000번 포트를 로컬 호스트의 12345번 포트와 연결하면 서비스의 3000번 포트는 서버의 80번 포트로 port-forward하므로 결과적으로 로컬 호스트의 12345번 포트와 서버의 80번 포트가 연결된 것을 확인할 수 있습니다. 이 터미널은 포트 포워딩 상태를 유지하는 중이므로 다른 커맨드 명령어를 입력할 수 없어서, 브라우저나 새로운 터미널 창을 열어 접속이 잘 되는지 테스트합니다.

터미널을 종료하지 않은 상태에서 localhost:12345에 접속

터미널에서 새로운 연결을 감지

참고
서비스뿐만 아니라 개별 파드에도 포트 포워딩을 적용할 수 있습니다.

» kubectl get pods
NAME                                READY   STATUS    RESTARTS   AGE
flask-api-server-xxxxxxxxxx-h75x5   1/1     Running   0          39m
flask-api-server-xxxxxxxxxx-tslrs   1/1     Running   0          39m
------------------------------------------------------------------------------------------------
~/flask-test (master) » kubectl port-forward pods/flask-api-server-xxxxxxxxxx-h75x5 :80
Forwarding from 127.0.0.1:56325 -> 80
Forwarding from [::1]:56325 -> 80
Handling connection for 56325
Handling connection for 56325

이 경우 서비스가 아닌 서버가 구동되고 있는 파드에 직접 접속하는 것이기 때문에, 서비스 포트 번호 3000이 아닌 서버 포트 번호 80과 포트를 바인드해야 합니다!

정리

쿠버네티스를 통해 배포된 서비스에 포트 포워딩을 해서 로컬 호스트에서 쉽게 접속할 수 있습니다. 서비스 배포가 잘 되었는지 간단하게 확인할 수 있겠죠? 또한, 서비스가 아닌 디플로이먼트, 파드, 레플리카셋 등에도 포트 포워딩이 가능하기 때문에 확인이 필요한 곳에 적절히 포트 포워딩을 사용하면 유용합니다. 🎤

profile
데이터 엔지니어/백엔드 개발자 d4v1d의 개발 일지🐯

1개의 댓글

comment-user-thumbnail
2023년 2월 6일

이해가 안되네요..localhost는 무슨 아이피를 가졋길래...포트만가지고도 접속이 되는가요?
가령 제가 aws 인스턴스로 쿠버 클러스터 생성하고 그안에서 서비스만들고 포트 포워딩 해놔도..
localhost로 들어가진단말입니까? 그럼 아무데서나 다 localhost로 들어가지나요?
localhost는 어떻게 제가 만든 클러스터의 파드나 서비스 포트와 포트포워딩 설정만으로 찾아가지나요?
localhost가 뭐길래요? 어떻게 연동되는건가요?

답글 달기