https://myharu.tistory.com/201
Flask , nginx , gunicon (by sock)
더보기 어제까지 배운것을 기반으로 플라스크를 백앤드 엔진엑스를 프론트엔드로 CI/CD를 진행해보려 한다. 그러면 일단 플라스크와 엔진엑스를 연동하는 작업을 처음해보고 나서 CI/CD를 진행하
blog.yos.kr
실습에 이어서 한다.
sock에서 포트로 변경하여 서버를 분리하려고 한다.
vi /etc/systemd/system/backend.service
#ExecStart=/usr/local/bin/gunicorn --workers 1 --bind unix:backend.sock -m 007 wsgi:app
#이소스를 아래로 변경
ExecStart=/usr/local/bin/gunicorn --bind 0.0.0.0:8000 wsgi:app
vi /etc/nginx/conf.d/default.conf
#이소스를 아래로 변경
#proxy_pass http://unix:/home/user/backend.sock;
proxy_pass http://gunicorn서버의IP:8000;
최종을 할것은
nginx 컨테이너와 gunicon(flask)컨테이너를 연동하라!
하고 최종은 CI/CD
실습
1. nginx 컨테이너 이미지 생성
- 소스코드저장
- k8s에서 쓸 yml파일 만들기
- gunicorn 이랑 연동하는 conf파일 만들기
- 도커파일생성(conf파일을 넣어주는 명령어 추가)
처리순서
상단에 필요파일 만들고 > github에 푸쉬 > github웹훅으로 젠킨스 요청
젠킨스가 > 도커로 빌드 > 도커허브에 푸쉬후 > k8s서버에 yml파일 실행
k8s서버가 yml파일로 도커허브에 생성된 이미지로 pod생성
소스보기 https://github.com/woosun/frontend
더보기
Dockfile
#Dockerfile
FROM nginx:stable
ADD ./* /
COPY ./frontend.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD nginx -g 'daemon off;'
#frontend.conf
server {
listen 80;
server_name web-svc;
location = /favicon.ico { access_log off; log_not_found off; }
location / {
proxy_pass http://svc-was:8080;
}
location /static/ {
autoindex on;
root /usr/share/nginx/html;
}
}
#nginx-deployment-prod.yml
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: prod
name: web-deploy
spec:
selector:
matchLabels:
servertype: web-cpu
replicas: 2
template:
metadata:
labels:
servertype: web-cpu
spec:
containers:
- name: web
image: yoskr/nginx:latest
resources:
requests:
cpu: 100m
limits:
cpu: 200m
ports:
- containerPort: 80
흐름내역 프론트엔드 개발자가 깃허브에 커밋
깃허브에서 젠킨스로 웹훅 푸쉬
젠킨스가 컴파일
젠킨스 설정파일 자세히보기
k8s에서 파드생성
실행결과
2. gunicorn 컨테이너 이미지 생성
- 소스코드저장
- k8s에서 쓸 yml파일 만들기
- 도커파일생성(conf파일을 넣어주는 명령어 추가)
처리순서
프론트엔드와 동일함
소스보기 > https://github.com/woosun/backend
더보기
#Dockerfile
FROM python:3.8
ADD ./* /
RUN pip install Flask Flask-Cors gunicorn pymysql
CMD gunicorn --bind 0.0.0.0:8080 wsgi:app
#main.py
from flask import Flask
from flask_cors import CORS
import pymysql
app = Flask(__name__)
CORS(app, resources={r"/*":{"origins":"*"}})
#장고기준으로 함수
@app.route("/")
def main():
return "Hello World!"
#장고기준으로 url
@app.route("/hello")
def hello():
result = {
"code":200,
"message":"hello Flask"
} #json 형태로 반환되는형태
return result\
@app.route("/db")
def db():
a = db_connector()
return a
def db_connector():
db = pymysql.connect(host='10.103.120.243', port=3306, user='root', passwd='qwer1234', db='yoskr_db', charset='utf8')
cursor = db.cursor()
sql = '''SELECT * FROM yoskr_db.student;'''
cursor.execute(sql)
result = cursor.fetchall()
db.close()
return str(result)
#장고기준으로 서버실행해주는애
if __name__ == '__main__':
app.run(host='0.0.0.0',port=80)
#wsgi.py
from main import app
if __name__ == "__main__":
app.run(host='0.0.0.0')
#gunicon-deployment-prod.yml
---
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: prod
name: was-deploy
spec:
selector:
matchLabels:
servertype: was-cpu
replicas: 2
template:
metadata:
labels:
servertype: was-cpu
spec:
containers:
- name: was
image: yoskr/gunicon:latest
resources:
requests:
cpu: 100m
limits:
cpu: 200m
ports:
- containerPort: 8080
728x90
반응형