본문 바로가기
Kubernetes (k8s)

[k8s] Deploy a Django application on kubernetes & HPA test

by moveho 2023. 5. 24.

1.Docker image build & push

[git clone]

git clone https://github.com/MachDn/django-todo-cicd.git
kevin@k8s-master:~$ cd django-todo-cicd/

연습에 사용할 django 기반 app을 git clone 합니다.

[Create Docker image]

kevin@k8s-master:~/django-todo-cicd$ docker build -t moveho/django-todo:latest .

kevin@k8s-master:~/django-todo-cicd$ docker images
REPOSITORY                            TAG               IMAGE ID       CREATED         SIZE
moveho/django-todo                    latest            8fc056cbf8ae   5 minutes ago   972MB

해당 repo 에있는 dockerfile로 docker image를 build 합니다. 

[Create Docker push]

kevin@k8s-master:~/django-todo-cicd$ docker push moveho/django-todo:latest
The push refers to repository [docker.io/moveho/django-todo]
71a2b686c112: Pushed
8a1c48651988: Pushed
b4b4f5c5ff9f: Mounted from library/python
b0df24a95c80: Mounted from library/python
974e52a24adf: Mounted from library/python
latest: digest: sha256:5b17077b9979f64081fbb0508094d797cb0c1e593a3ef191e464d4562434426c 
latest: digest: sha256:5b17077b9979f64081fbb0508094d797cb0c1e593a3ef191e464d4562434426c size: 2846

본읜의 docker hub에 push 합니다.

2.Create deployment & service

[deployment.yaml 파일 생성]

kevin@k8s-master:~/django-todo-cicd$ vi deployment.yaml
kevin@k8s-master:~/django-todo-cicd$ cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-django-application
spec:
  replicas: 3
  selector:
    matchLabels:
      app: django-todo-app
  template:
    metadata:
      labels:
        app: django-todo-app
    spec:
      containers:
        - name: todo-app
          image: moveho/django-todo:latest
          ports:
            - containerPort: 8000
          resources:
            requests:
              cpu: 200m
            limits:
              cpu: 500m

생성한 deployment.yaml manifest 파일을 실행시킵니다.

kevin@k8s-master:~/django-todo-cicd$ kubectl apply -f deployment.yaml
deployment.apps/my-django-application created

deployment 정상적으로 실행됐는지 확인합니다.

kevin@k8s-master:~/django-todo-cicd$ kubectl get deploy my-django-application
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
my-django-application   3/3     3            3           81s
kevin@k8s-master:~/django-todo-cicd$ kubectl get po -l app=django-todo-app
NAME                                    READY   STATUS    RESTARTS   AGE
my-django-application-b447c7dbd-krr2l   1/1     Running   0          2m40s
my-django-application-b447c7dbd-nbb4t   1/1     Running   0          2m40s
my-django-application-b447c7dbd-wq9hp   1/1     Running   0          2m40s

[service 생성]

kevin@k8s-master:~/django-todo-cicd$ kubectl expose deploy my-django-application --type NodePort
service/my-django-application exposed

[확인]

[curl -- 확인]

kevin@k8s-master:~/django-todo-cicd$ curl k8s-node1:30535/todos/

실행중인 파일이 확인됩니다.

 

[webbrowser -- 확인]

http://192.168.56.101:30535/todos/   #본인의 node ip주소 및 NodePort로 접속

다음과 같은 Django 기반 todo app 만날 있습니다.

 

3.Create HPA to autoscaling test

[HPA 생성]

cpuu 부하 따라 pod 자동으로 scaling 되는 것을 실습합니다. HPA 생성 합니다.

kevin@k8s-master:~/django-todo-cicd/k8s$ kubectl autoscale deploy my-django-application --min 3 --max 6 --cpu-percent 40
horizontalpodautoscaler.autoscaling/my-django-application autoscaled
kevin@k8s-master:~/django-todo-cicd/k8s$ kubectl get hpa
my-django-application   Deployment/my-django-application   3%/40%          3         6        3          19m

[CPU 부하주기]

kevin@k8s-master:~/django-todo-cicd$ kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://192.168.56.101:30535/todos/; done"
kevin@k8s-master:~/django-todo-cicd$ kubectl get hpa -w
kevin@k8s-master:~$ kubectl get deploy my-django-application -w

hpa deploy -w 옵션으로 관찰합니다.

NAME                    REFERENCE                          TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
my-django-application   Deployment/my-django-application   3%/40%          3         6         3          30m
my-django-application   Deployment/my-django-application   3%/40%          3         6         3          30m
my-django-application   Deployment/my-django-application   3%/40%          3         6         3          31m
my-django-application   Deployment/my-django-application   46%/40%         3         6         3          31m
my-django-application   Deployment/my-django-application   48%/40%         3         6         4          31m
my-django-application   Deployment/my-django-application   36%/40%         3         6         4          31m
my-django-application   Deployment/my-django-application   35%/40%         3         6         4          32m
my-django-application   Deployment/my-django-application   39%/40%         3         6         4          32m
my-django-application   Deployment/my-django-application   35%/40%         3         6         4          32m
my-django-application   Deployment/my-django-application   42%/40%         3         6         4          32m
my-django-application   Deployment/my-django-application   40%/40%         3         6         4          33m
my-django-application   Deployment/my-django-application   40%/40%         3         6         4          33m
my-django-application   Deployment/my-django-application   85%/40%         3         6         4          33m
my-django-application   Deployment/my-django-application   70%/40%         3         6         6          33m
my-django-application   Deployment/my-django-application   57%/40%         3         6         6          34m
my-django-application   Deployment/my-django-application   27%/40%         3         6         6          34m

다음과 같이 cpu 부하가 되면 replicas max 값인 6까지 올라가는 것을 확인 있습니다.

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
my-django-application   3/3     3            3           51m
my-django-application   3/4     3            3           51m
my-django-application   3/4     3            3           51m
my-django-application   3/4     3            3           51m
my-django-application   3/4     4            3           51m
my-django-application   4/4     4            4           51m
my-django-application   4/6     4            4           53m
my-django-application   4/6     4            4           53m
my-django-application   4/6     4            4           53m
my-django-application   4/6     6            4           53m
my-django-application   5/6     6            5           53m
my-django-application   6/6     6            6           53m

다음과 같이 deployment 수가 증가하는 것을 확인할 있습니다.

 

이로서 클러스터의 노드에 Django application 배포를 완료하고 cpu workload 따라서 autoscaling 되는 작업을 실습 완료했습니다.

댓글