
저번에는 local에 포트를 할당하여 연결했지만 이번에는 클러스터 ip를 할당하고 그 ip로 연결하는 방식을 통해 배포 해보도록 하고 특히 내부에서 nginx가 아닌 docker에서 이미지를 할당하고 그 이미지를 풀받아서 사용하는 방식으로 배포 해보는 점을 추가했다.
우선 이미지 서버를 만들기 위해 간단한 hello world를 response하는 웹 코드를 만들고 해당 코드를 도커 이미지로 만들기 위한 dockerFile 파일을 하나 만들어야 한다.
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return "Hello, World!"
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
# Use an official Python runtime as a parent image
FROM python:3.9-slim
# Set the working directory in the container
WORKDIR /app
# Copy the current directory contents into the container
COPY . /app
# Install any needed packages specified in requirements.txt
RUN pip install flask
# Make port 80 available to the world outside this container
EXPOSE 80
# Define environment variable
ENV NAME World
# Run app.py when the container launches
CMD ["python", "app.py"]
위와 같은 코드를 만들고 이미지를 만들기 위해서는 아래 명령어로 빌드를 해야한다.
docker build -t <your-dockerhub-username>/myapp:latest .
여기서 주의 해야할 점은 mac m1을 사용하는 사람은 위 명령어로 하면 deploy할 때 에러가 뜬다 그래서 아래와 같은 명령어를 입력해야 한다.docker buildx build \ --platform linux/amd64,linux/arm64,linux/arm/v7 \ -t hello-test \ --push .자세한 내용은 아래 포스팅을 참고해야한다... 이걸 까먹고 있어서 잠시 또 삽질을 해버렸다는.....
그렇게 이미지 빌드가 잘됬나 확인을 해보기 위해서는 docker hub에 들어가서 내가 빌드한 이미지가 잘있는지 확인해보면된다.
그러면 이제 빌드한 이미지를 풀받아 deployment를 생성해보자
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
spec:
replicas: 2
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: <your-dockerhub-username>/myapp:latest
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
위와 같이 deployment 코드를 만들어주고 해당 코드를 적용해주어야 한다.
kubectl apply -f myapp-deployment.yaml
그렇게 적용을 해주었으면 서비스와 deployment, pods들이 생겨난 것을 볼 수 있다.
해당 코드를 보면 pod 생성 코드가 없는데 왜 pods이 생겼나 의문이 들 수 있다.
이유는 deployment의 replica 설정에서 볼 수 있는데 해당 설정이 최소 pod을 유지 해주는 설정이기 때문에 2라고 설정한 이상 pod은 2개가 유지되도록 설정한 것이다. 즉 pod이 하나가 삭제되면 다시 2개로 유지하기 위해 재생성된다는 의미이다.

이렇게 생성된 pod이 running상태로 돌아가고 있다면 이를 접속하기 위해서는 [node-ip]:[node-port] 방식으로 접근하면된다.
node ip를 보기 위한 명령어
kubectl get nodes -o wide
node port를 보기 위한 명령어
kubectl get svc
위와 같이 명령어를 통해 ip와 포트를 알아냈다면 curl 명령어로 접근해보면 hello world가 잘 뜨는 것을 볼 수 있다~

확실히 이와 같은 경험을 하면서 회사에서 사용하는 배포가 이와 비슷하지만 이를 git action 및 다른 azure 및 젠킨스와 같은 서비스를 통해 자동화시켜 놓은것 뿐이라는 것을 알 수 있었다. 이렇게 배포까지 해보니 다음에는 git action과 자동화를 해보고 싶다는 생각이 드는데... 다음에는 이 주제로 찾아뵙겠습니다