
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello!!"
if __name__ == "__main__":
app.run(host='0.0.0.0', port=7000)
위의 예시 코드로 임시 웹을 배포했다.
FROM python:3.8.2
WORKDIR /app
COPY . /app
RUN pip install flask
CMD ["python", "./app.py"]
해당 코드로 dockerFile을 생성했다. 이러면 준비는 끝!
우선 웹의 main을 실행해서 웹이 잘도아가는 파악하고 그 후 잘돌아가면 docker 이미지를 빌드해야한다.
docker build -t flask-test .
위의 명령어를 입력하면 이미지가 빌드된다. 해당 빌드된 이미지를 확인하려면
docker images
라는 명령어를 입력하면 이미지가 제대로 생성됬는지 확인할 수 있다!
docker run -it --rm -p 7000:7000 flask-test
위의 명령어로 docker 이미지가 정상적으로 빌드 되었는지 확인해보았다. 0.0.0.0:5000으로 접속하니 정상적으로 배포된 것을 확인할 수 있었다.
쿠버네티스에 해당 이미지를 배포할 컨테이너를 생성하기 위해 deployment와 service만 생성하기로 했다.
### deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: flask-service
spec:
selector:
app: whoareyou
ports:
- protocol: "TCP"
port: 8080
targetPort: 7000
type: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: whoareyou
spec:
selector:
matchLabels:
app: whoareyou
replicas: 2
template:
metadata:
labels:
app: whoareyou
spec:
containers:
- name: whoareyou
image: flask-test-1
imagePullPolicy: Always
ports:
- containerPort: 7000
해당 파일을 생성 후 apply 명령어를 입력하면 정상적으로 deployment와 service가 생성된 것을 볼 수 있다.
k apply -f deployment.yaml
** 여기서 k는 alias를 사용하여 kubectl을 k로 사용했다.
위와 같이 객체를 생성했는데 문제가 생겼다. ImagePullErr가 생기면서 삽질이 시작되버렸다....
몇 시간동안 삽질을 한 결과 빌드를 한 이미지가 로컬에 존재하는데 이때 쿠버네티스는 local에 존재하는 이미지를 찾지 못한다는 것을 발견했다.... 이런...
따라서 해당 이미지를 docker hub에 따로 푸쉬 했고 yaml파일 또한 hub의 이미지를 풀하도록 수정했다..
그러더니 정상적으로 이미지 푸쉬가 되는 것을 확인할 수 있었다.
이제좀 되겠거니 했는데 CrashLoopBack이라는 에러가 생겨버렸다.... 해당 에러를 확인해보니 컨테이너가 특정 에러로 인해 생성이 안되고 다시 재생성되는 행동이 반복되어서 발생하는 에러라는데....
해당 에러를 제대로 확인하기 위해서는 컨테이너 log를 살펴볼 필요가 있었다.
k logs -f [pod] -c [container]
해당 명령어를 통해 log를 확인하니 exec /usr/local/bin/python: exec format error라는 에러로 인해 컨테이너 생성이 안되고 있었다... 이건 또 무슨 소리인지
확인해보니 현재 이미지 빌드할 때 사용된 기기는 mac m1 노트북인데 쿠버네티스의 환경은 window라고 한다.
따라서 AMD 기반 서버에서 ARM에서 작성한 도커 이미지를 실행했기 때문에 생긴 문제라고 한다.... 왜 window인거야....
해당 에러를 해결하기 위해서는 이미지 빌드를 build가 아닌 buildx를 사용해서 빌드해야한다.
docker buildx build \
--platform linux/amd64,linux/arm64,linux/arm/v7 \
-t <태그명> \
--push .
위의 명령어를 입력하면 다수의 플랫폼에서 사용가능 한 이미지를 빌드할 수 있고 이를 바로 hub에 푸쉬할 수 있다.
이렇게 하니 pod가 정상적으로 running할 수 있었다...
이렇게 보니 정말 별거 아닌 에런데.... 왜 나는 하루 동안 삽질을 했을까....
이제 pod가 정상동작하는 것을 확인 했으니 접속해보자!
접속하기 위한 url을 알기 위해 서비스 정보를 불러왔다.
k get services
위의 명령어를 통해 서비스를 불러와 해당 서비스의 externalIP를 읽어왔고 해당 ip로 접속하니 웹이 정상적으로 뜨는 것을 볼 수 있었다!!!
한 30분이면 실습이 끝날 줄알았는데.... 2일이나 걸려버렸다... 역시 머리로 아는 것과 실전은 다르다는 것을 느끼며 이번 포스팅 끄읕~~~