port-forward를 통해 application 접근 테스트하기

4riend·2024년 5월 7일
1

CodeMind 프로젝트

목록 보기
18/20
post-thumbnail

클러스터 내에 배포하고 싶은 앱의 deployment을 만들고
네트워크에 노출시키기 위해 service까지 만들었다면 외부에 노출하기 전
클러스터 내에서 접속 테스트를 해보는 것이 좋다.
이때 port-forward를 통해 확인했던 과정을 적어본다 🔥


Creating deployment and service

나의 경우 3개의 app을 띄워야 했다. (streamlit, auth0, hf api)
예제가 필요한 분들은 MongoDB 같은 걸로 실습하자 😅

streamlit-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: streamlit-svc
spec:
  type: ClusterIP
  selector:
    app: streamlit
  ports:
    - protocol: TCP
      port: 8501
      targetPort: 8501

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: streamlit-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: streamlit
  template:
    metadata:
      labels:
        app: streamlit
    spec:
      containers:
      - name: streamlit # ECR에 있는 이미지를 가져왔다
        image: 211125418324.dkr.ecr.ap-northeast-2.amazonaws.com/webservice
        ports:
        - containerPort: 8501
        env:
        - name: AUTH0_APP_URL # 당시 LB로 외부에 APP을 노출하고 있어 LB의 IP를 사용했다
          value: "http://a3120f294fe78438d9479baf19198313-1976181292.ap-northeast-2.elb.amazonaws.com"
        - name: HF_MODEL_API_SERVER_URL
          value: "http://hf-api-svc:8000/generate-text/"
        volumeMounts:
        - name: aws-credentials-volume # 지금 생각해보면 굳이 필요한가? 싶은 설정이다
          mountPath: "/root/.aws"
          readOnly: true
      volumes:
      - name: aws-credentials-volume
        secret:
          secretName: aws-credentials

auth0-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: auth0-svc
spec:
  type: ClusterIP
  selector:
    app: auth0
  ports:
    - protocol: TCP
      port: 3000
      targetPort: 3000

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: auth0-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: auth0
  template:
    metadata:
      labels:
        app: auth0
    spec:
      containers:
      - name: auth0 # ECR에 있는 이미지를 가져왔다
        image: 211125418324.dkr.ecr.ap-northeast-2.amazonaws.com/auth0
        ports:
        - containerPort: 3000
        env:
        - name: STREAMLIT_APP_URL # 당시 LB로 외부에 APP을 노출하고 있어 LB의 IP를 사용했다
          value: "http://ae46ebe8b5e9c4eb58d6ee4b08431a0a-1959267954.ap-northeast-2.elb.amazonaws.com"

hf-api-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: hf-api-svc
spec:
  type: ClusterIP
  selector:
    app: hf-api
  ports:
    - protocol: TCP
      port: 8000
      targetPort: 8000

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hf-api-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hf-api
  template:
    metadata:
      labels:
        app: hf-api
    spec:
      containers:
      - name: hf-api # ECR에 있는 이미지를 가져왔다
        image: 211125418324.dkr.ecr.ap-northeast-2.amazonaws.com/huggingface
        ports:
        - containerPort: 8000

각 yaml 파일 내 작성한 service와 deployment을 함께 생성한다.

kubectl apply -f streamlit-svc.yaml -f auth0-svc.yaml -f hf-api-svc.yaml

pod 배포 에러 발생시 로그 확인법 👀

# pod를 조회했을 때 정상적으로 배포가 안되는 pod가 있다면
kubectl get pods
# 해당 파드의 이름을 이용해 log를 확인하자. log를 통해 에러 해결하기
kubectl logs -f [파드 이름]

Forward a local port to a port on the Pod

kubectl port-forward를 통해 포트 포워딩을 진행하자.
이때 pod, deployment, replicaset, service 등 다양한 이름으로 명시가 가능하다.

나의 경우 deployment 이름으로 진행했다.

$ kubectl port-forward streamlit-deployment-745c7f5684-8kb2n 28015:8501
Forwarding from 127.0.0.1:28015 -> 8501
Forwarding from [::1]:28015 -> 8501

어떤 이름으로 진행하든 위와 같이 잘 포트 포워딩 됨을 볼 수 있다 👍

연결 테스트

curl, wget, ping 등 다양한 방법으로 해당 url에 request를 보내자.
나는 python 프롬프트로 접속 후 curl을 사용했다.

$ curl http://localhost:28015
<!doctype html><html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"/><link rel="shortcut icon" href="./favicon.png"/><link rel="preload" href="./static/media/SourceSansPro-Regular.0d69e5ff5e92ac64a0c9.woff2" as="font" type="font/woff2" crossorigin><link rel="preload" href="./static/media/SourceSansPro-SemiBold.abed79cd0df1827e18cf.woff2" as="font" type="font/woff2" crossorigin><link rel="preload" href="./static/media/SourceSansPro-Bold.118dea98980e20a81ced.woff2" as="font" type="font/woff2" crossorigin><title>Streamlit</title><script>window.prerenderReady=!1</script><script defer="defer" src="./static/js/main.7e6f4f72.js"></script><link href="./static/css/main.bf304093.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>

request를 보냈을 때 HTML 내용이 반환된다면 정상적으로 서비스가 동작함을 의미한다 👍


참고 문헌

profile
날씨의 아이, 진격의 거인, 로스트 아크, Java Spring

0개의 댓글