클러스터 내에 배포하고 싶은 앱의 deployment을 만들고
네트워크에 노출시키기 위해 service까지 만들었다면 외부에 노출하기 전
클러스터 내에서 접속 테스트를 해보는 것이 좋다.
이때 port-forward를 통해 확인했던 과정을 적어본다 🔥
나의 경우 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가 있다면
kubectl get pods
# 해당 파드의 이름을 이용해 log를 확인하자. log를 통해 에러 해결하기
kubectl logs -f [파드 이름]
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 내용이 반환된다면 정상적으로 서비스가 동작함을 의미한다 👍