클라우드 엔지니어/클라우드 캠프과정

Flask , nginx , gunicon (port) ,jenkins ,k8s

해아's 2022. 10. 26. 17:02

 

 

 

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
반응형