티스토리 뷰
이 포스트는 아래 포스트를 참고 했습니다.
huisam.tistory.com/entry/k8s-deployment
개요
이번 프로젝트가 k8s 환경에서 진행된다고 하여 스터디를 하면서 이 글을 씁니다. 특이사항으로는 회사에 입사해서 노트북을 최신 맥프로 M1으로 샀는데 intel이 아닌 arm64환경이라 docker설치부터 애로사항이 있었습니다. 역시 최신은 사는게 아니라는 말을 괜히 하는게 아니라는 것을 새삼 다시 느낍니다.
가장 심플하게 pods, deployments, service이렇게 3가지만 이용했습니다.
Docker설치
제가 사용한 docker버젼은 20.10.1 버젼 입니다.
docs.docker.com/docker-for-mac/apple-m1/
도커는 위 링크에서 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)
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.
'Kubernetes' 카테고리의 다른 글
Vue.js앱을 k8s에 배포하는 경우 새로 고침 하면 404뜰 때 .Dockerfile (0) | 2021.10.13 |
---|---|
K8s 시크릿(secret) 만드는 법 (0) | 2021.09.07 |
Jenkins 쿠버네티스(K8s) 플러그인 git pull (0) | 2021.02.16 |
Ubuntu에 minikube설치하기, hello (0) | 2021.01.14 |
K8s kubectl명령어 (0) | 2021.01.04 |
- Total
- Today
- Yesterday
- Linux
- 2017 티스토리 결산
- 도커각티슈박스
- vim
- 도커티슈케이스
- 도커각티슈케이스
- Sh
- docker container case
- 도커티슈박스
- docker container whale
- 도커컨테이너
- 이직
- docker container tissue box
- 싱가폴
- shellscript
- docker container tissue
- docker container
- 개발자
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |