티스토리 뷰

이 포스트는 아래 포스트를 참고 했습니다.
huisam.tistory.com/entry/k8s-deployment

34.121.136.212:222 에 접근 했을때 flask app에서 준 응답

개요

이번 프로젝트가 k8s 환경에서 진행된다고 하여 스터디를 하면서 이 글을 씁니다. 특이사항으로는 회사에 입사해서 노트북을 최신 맥프로 M1으로 샀는데 intel이 아닌 arm64환경이라 docker설치부터 애로사항이 있었습니다. 역시 최신은 사는게 아니라는 말을 괜히 하는게 아니라는 것을 새삼 다시 느낍니다.

가장 심플하게 pods, deployments, service이렇게 3가지만 이용했습니다.

Docker설치

제가 사용한 docker버젼은 20.10.1 버젼 입니다.

docs.docker.com/docker-for-mac/apple-m1/

 

Apple M1 Tech Preview

 

docs.docker.com

도커는 위 링크에서 m1용으로 받아야 합니다.

오늘자 2021.1.5에는 PREVIEW인데 앞으로 업데이트 되겠죠?

GCP에 클러스터 만들기

로컬에 minikube를 설치 해보려다가 m1이슈가 있어서 포기하고 GCP프리 트라이얼 기간이 25일 남아있길래 GCP에 만들었습니다.

GCP로 가셔서 '클러스터 만들기'를 눌러서 클러스터를 만들어 줍니다. 무료기간이 아닐때는 요금이 많이 나온다고 합니다 주의해주세요.

gcloud, kubectl설치하기

gcloud는 구글의 문서를 보고 설치 했습니다. 설치스크립트를 복붙하면 잘 설치가 되었습니다.

kubectl이 잘 설치 되었다면 kubectl get po 명령을 입력 해보고 아직 생성된 pods가 없는지 확인 합니다.

설치가 완료 되었으면 gcloud init 명령을 이용해 어떤 프로젝트를 이용할 것인지 초기화 해줍니다. 저는 static-lens-266702를 이용 했습니다.

Flask App만들기

from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return 'Hello! This is the main page <h1>HELLO2</h1>'

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080)

flask앱을 하나 만들어 줍니다. app.run()에 위와 같이 넣어준 것을 확인 합니다. 저는 port번호는 8080으로 했습니다.
위 스샷에서 2222로 접속하면 8080으로 전달 해주도록 뒤에서 설정파일을 세팅 해주었습니다.

 

app.run()에 host='0.0.0.0'을 넣어주셔야 docker로 띄웠을 때 문제 없이 실행 됩니다.

제가 사용한 project구조 입니다. /app.py 파일 한개 입니다. 나머지 파일은 k8s설정파일 입니다.

실행은 python3 app.py로 합니다.

실행이 되면 위와 같은 로그가 나오고 127.0.0.1:8080으로 접근 했을 때 hello가 나오는지 확인 해봅니다.

Docker Image만들기

Dockerfile

FROM python
COPY . /app
WORKDIR /app
RUN pip3 install flask
RUN chmod +x /app/app.py
CMD ["python3", "app.py"]

위 파일을 설명드리면 .에 있는 모든 파일을 컨테이너의 /app에 copy하라는 뜻입니다. 그리고 /app을 workdir로 하라는 명령입니다.

 

M1에서 Docker build 이슈 해결(optional)

medium.com/better-programming/how-to-actually-deploy-docker-images-built-on-a-m1-macs-with-apple-silicon-a35e39318e97

 

How to Actually Deploy Docker Images Built on M1 Macs With Apple Silicon

A guide to help you get started deploying cross-platform builds from your M1 Mac

medium.com

docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t gcr.io/static-lens-266702/flask-test:v0.2 --push .

저는 위 명령어로 빌드 했습니다. --push옵션을 사용했기 때문에 GCR에 push까지 됩니다. m1에서 빌드하면 cpu아키텍처가 달라서 로그를 찍어보면 아래 로그가 나옵니다.

standard_init_linux.go:219: exec user process caused: exec format error

그래서 buildx 옵션으로 다른 아키텍처용으로 빌드를 해주어야 합니다. linux/amd64,linux/arm64,linux/arm/v7 저는 이 3가지 모두 넣고 빌드해서 성공 했습니다. 셋중에 한개만 넣고 하니 같은 에러가 나더라구요.

그냥 빌드는 아래 명령어 입니다.

docker build -t gcr.io/static-lens-266702/flask-test:v0.2 .

docker images 명령어로 이미지가 잘 생성 되었는지 확인 해봅니다.

실행을 해보고 싶다면 아래 명령어를 이용합니다.

docker run -d -p 5000:8080 gcr.io/static-lens-266702/flask-test:<tag>

여기에서는 5000번 포트를 이용했습니다. 127.0.0.1:5000으로 요청을 보내면 container의 8080번으로 가는 설정입니다.

 

Deployment만들기

deployment는 pods와 replicaset이 합쳐진 것입니다. 저는 replicas를 2개만 만들었습니다.

 

kubernetes.io/docs/concepts/workloads/controllers/replicaset/

레플리카셋에 관한 내용은 위 문서내용을 참고 해주세요. 요약하자면 일정한 개수의 pods를 항상 띄우도록 유지해주는 모듈입니다.

 

flask-deployment.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app.python.server: deployment
  name: python-server # deployment의 이름
spec:
  replicas: 2 # 개체수
  selector:
    matchLabels:
      app.python.server: node # pod의 label을 선택해서 가져오기
  template:
    metadata:
      labels:
        app.python.server: node # pod의 label을 지정
    spec:
      containers:
        - image: gcr.io/static-lens-266702/flask-test:v0.2
          name: python-server
          ports:
            - containerPort: 8080

위에서 - image: 쪽을 보시면 gcr.io/static-lens-266702 가 들어가 있습니다. docker repository를 gcr로 하기 위해서는 위와 같은 규칙을 써서 태깅 해야 합니다. static-lens-266702는 프로젝트의 id입니다.

아래 명령어로 deployment를 만들 수 있습니다.

kubectl create -f flask-deployment.yml

잘 만들어졌는지 확인 하려면 kubectl get deployments.apps 명령어로 확인 해봅니다.

 

Service만들기

flask-service.yml

apiVersion: v1
kind: Service
metadata:
  name: python-service
  labels:
    app.python.server: service # service의 레이블
spec:
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 2222 # service의 port
    targetPort: 8080 # pod의 target port
  selector:
    app.python.server: node # 연결 시킬 pod의 label

Pod만 만들면 public ip가 할당이 되지 않아서 웹으로 접근 할 수 없습니다.

kubectl get service 명령어를 이용해 서비스가 잘 생성 되었는지 확인 할 수 있습니다.

service를 만들면 EXTERNAL-IP가 할당이 됩니다.

생성된 service의 EXTERNAL-IP와 앞에서 지정한 port인 2222번으로 접속했을때 잘 되는지 확인 합니다.

end.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함