CLOUD/Docker&Kubernetes

[Kubernetes] Service - LoadBalancer : Django-Apache 연동 이미지 파드 생성하기

alsruds 2023. 4. 25. 16:26

♡ 순서 ♡

1. 이미지 만들기

2. K8S Dashboard 에서 Django-Apache&MySQL : Pod / ConfigMap / Service 생성

3. Service - LoadBalancer 생성

 

기본 설정

2023.04.25 - [분류 전체보기] - [Kubernetes] Service - LoadBalancer

 

[Kubernetes] Service - LoadBalancer

♡ 순서 ♡ 1. 온프레미스 환경에서 로드밸런서 사용하기 2. 로드밸런서 타입의 서비스 생성해보기 (nginx) [ 온프레미스 환경에서 로드밸런서 사용 설정 ] 참고 : https://mlops-for-all.github.io/docs/appendix

alsrudalsrudalsrud.tistory.com


 

 

 

[ Linux ]

● 장고 프로젝트 준비

》 FileZilla 로 Docker 가 설치된 리눅스 가상머신으로 옮겨주기

 

Dockerfile

FROM httpd:latest
RUN apt update
RUN apt install -y python3.9
RUN apt-get install -y apache2 apache2-dev python3-pip libmariadb-dev libjpeg-dev python3.9-dev
WORKDIR /app
COPY requirements.txt /app/requirements.txt
RUN pip install -r requirements.txt
RUN pip install mod_wsgi
COPY httpd.conf /usr/local/apache2/conf/httpd.conf
COPY . /app

 

httpd.conf

LoadModule wsgi_module "/usr/local/lib/python3.9/dist-packages/mod_wsgi/server/mod_wsgi-py39.cpython-39-x86_64-linux-gnu.so"
WSGIPythonHome "/usr"
WSGIScriptAlias / "/app/config/wsgi.py"
WSGIPythonPath "/app"

<Directory "/app/config">
        <Files wsgi.py>
                Require all granted
        </Files>
</Directory>

Alias /static/ /app/static/

<Directory /app/static/>
        Require all granted
</Directory>

Alias /media/ /app/media/

<Directory /app/media/>
        Require all granted
</Directory>

미리 테스트 파드를 만들어 경로를 확인해 주었습니당

바로 명령어를 통해 파일에 입력하고 싶으시다면 Dockerfile 에서

RUN mod_wsgi-express module-config >> /usr/local/apache2/conf/httpd.conf

로 넣어준 다음에 준비한 httpd.conf 파일을 >> 로 넣어주시면 되겠죠 ~

# cat httpd.conf >>/usr/local/apache2/conf/httpd.conf

 

이미지 만들기 (도커 허브에 업로드)

# 방화벽 켜주기
systemctl start firewalld

# 이미지 빌드
docker build --tag nuy0307/django-apache:1.5 .

# 도커 로그인
docker login

# 이미지 도커에 푸시
docker push nuy0307/django-apache:1.5

 

 

[ Kubernetes Dashboard ]

Service

# django-apache-svc
apiVersion: v1
kind: Service
metadata:
  name: django-apache-svc
spec:
  selector:
    app: django-apache-pod
  ports:
  - port: 9000
    targetPort: 80
  type: LoadBalancer

# mysql-svc
apiVersion: v1
kind: Service
metadata:
  name: mysql-svc
spec:
  selector:
    app: mysql-pod
  ports:
  - port: 3306
    targetPort: 3306

 

ConfigMap

# django-dev
apiVersion: v1
kind: ConfigMap
metadata:
  name: django-dev
data:
  DBNAME: "web"
  DBUSER: "root"
  DBPASS: "qwer1234"
  DBHOST: "mysql-svc"
  DBPORT: "3306"

# mysql-dev
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-dev
data:
  MYSQL_ROOT_PASSWORD: "qwer1234"

 

Pod

# django-apache-pod
apiVersion: v1
kind: Pod
metadata:
  name: django-apache-pod1
  labels:
    app: django-apache-pod
spec:
  containers:
  - name: container
    image: nuy0307/django-apache:1.5
    command: ["/bin/sh", "-ec", "python3 manage.py makemigrations && python3 manage.py migrate && httpd-foreground"]
    envFrom:
    - configMapRef:
        name: django-dev
        
# mysql-pod : 생성 후 장고에서 접속할 데이터베이스 만들어주기
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
  labels:
    app: mysql-pod
spec:
  containers:
  - name: container
    image: mysql:8.0.32-debian
    envFrom:
    - configMapRef:
        name: mysql-dev

 

할당받은 외부 엔드포인트 주소로 접속 ~

접속 성공~

 

 

아 제목이 왜 로드밸런싱이냐면 ~ 이 파드 4개 만들었걸랑요

4개로 로드밸런싱 된답니다 !

 

생성한 파드 4개
서비스에 연결된 파드들