프로그래밍/쿠버네티스

[쿠버네티스] 2. 쿠버네티스로 배포하기

riroan 2023. 5. 6. 16:46

이제 쿠버네티스를 사용해서 배포해보자. 일단 배포하기 위한 도커 이미지가 있어야 한다. 간단하게 하나 만들어보자.

도커 이미지 생성

# main.py

from fastapi import FastAPI
import uvicorn

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello World"}

if __name__ == "__main__":
    uvicorn.run(app, port=8000, host="0.0.0.0")
# Dockerfile

FROM python:3.11

WORKDIR /app

COPY . .

RUN pip install -r requirements.txt

EXPOSE 8000

CMD ["python", "main.py"]
# .dockerignore

Dockerfile
.dockerignore
venv
__pycache__
# requirements.txt
fastapi==0.95.1
uvicorn==0.22.0

 

모든 파일이 준비됐으니 빌드하고 실행해서 잘 되는지 테스트해보자.

docker build . --tag myserver
docker run --rm --name server -p 8000:8000 myserver

성공

쿠버네티스 배포하기

정상적으로 도커로 배포되는 것을 확인했으니 종료하고 이제 쿠버네티스로 배포해보자.

kubectl create deployment server --image=myserver

myserver라는 이미지를 활용해서 server라는 이름의 배포객체를 생성하는 것이다. 즉 deployment가 배포를 해주는 객체가 된다.

이제 정상적으로 됐는지 확인하기 위해 다음 명령어를 입력한다.

kubectl get deployments

READY가 0/1이고 AVAILABLE이 0이다. 이는 정상적인 상황이 아니므로 원인을 찾기 위해 pod를 찾아본다.

kubectl get pods

ImagePullBackOff라는 에러가 떴다. 이것은 이미지를 얻을 수 없어서 나는 에러이다. 분명 이미지를 만들었고 실행까지 확인했는데 왜 이런 에러가 날까?

 

현재 우리의 구성은 이런 상태이다. 쿠버네티스 노드가 PC안에 컨테이너로 되어있고 이미지는 우리 PC에 있는 것이다. 노드는 PC같은 머신을 의미하는데 여기에서는 쿠버네티스를 실행한 컨테이너이다.

쿠버네티스 노드가 myserver라는 이미지를 실행하기 위해 노드내부에서 이미지를 찾는데 없기 때문에 docker hub에서 찾는다. docker hub에도 우리가 만든 이미지는 없기때문에 결국 pull error가 일어나게 된다.

따라서 위와 같은 문제를 해결하기 위해 우리의 이미지를 쿠버네티스 노드로 옮기거나 docker hub로 옮겨야 한다. 후자가 더 권장되는 방법이므로 후자로 해결해보자.

 

도커 이미지 푸시

https://hub.docker.com/

 

Docker Hub Container Image Library | App Containerization

Deliver your business through Docker Hub Package and publish apps and plugins as containers in Docker Hub for easy download and deployment by millions of Docker users worldwide.

hub.docker.com

위 사이트에 들어가서 가입하고 create repository를 누른 후 임의의 이름으로 레포를 하나 만든다.

이제 깃허브에 푸시하듯이 푸시하면 된다. 다만 이제는 다른 사용자에게도 이미지가 보이기 때문에 myserver가 나만의 myserver이미지라는 것을 구분해야 한다. 이것을 위해 빌드를 다시하고 푸시하자.

docker build . --tag riroan/myserver
docker push riroan/myserver

각자 riroan대신에 Namespace에 있는 것을 넣으면 된다.

이제 우리의 이미지를 글로벌하게 접속할 수 있는 상태가 되었다. 이미 존재하는 배포를 제거하고 다시 배포해보자.

kubectl delete deployment server
kubectl create deployment server --image=riroan/myserver

이미지에 네임스페이스가 추가된게 눈에 띈다.

시간이 지난 후 성공적으로 배포된 것을 알 수 있다. 이것을 시각화해서 볼 수도 있다.

minikube dashboard

웹사이트도 자동으로 생성해서 보여주고 현재 배포 정보를 한눈에 확인할 수 있다. 지금은 1개이고 모두 정상이기 때문에 초록색으로 보인다.

이제 서버도 띄웠으니 잘 접속되나 확인해보자!

뭔가 또 실패한것 같다. 이 문제에 대해서는 다음시간에 알아보도록 하자.