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 되는 작업을 실습 완료했습니다.
'Kubernetes (k8s)' 카테고리의 다른 글
[k8s] Flannel+Calico에서 Cilium으로 CNI Live Migration을 수행하는 방법 (1) | 2023.06.07 |
---|---|
[k8s] k8sgpt -- 쿠버네티스와 ChatGPT? (1) | 2023.06.01 |
[k8s] Rollout blue-green -- workbook (1) | 2023.05.23 |
[k8s] Rollout Canary -- workbook (1) | 2023.05.21 |
[k8s] VPA (Vertical Pod Autoscaler) 설치 및 실습 (1) | 2023.05.16 |
댓글