갬미의 성장일기
Day 59 - HPA, DB dump ,init container 본문
오늘 배운 내용
- HPA
- DB dump
- init container
HPA (Horizontal Pod Autoscaling)
pod scale을 늘리는 방법은 두가지가 있다
- scale out - in : pod의 수를 늘리는 방법, horizonal - 세션처리, 부하 발생시
- scale up - down : pod의 spec을 높이는 방법, vertical - 고속의 cpu가 필요할때
HPA는 pod scale out - in 을 구현하는 방법이다
kubenetes io 공식 자료
실습 따라하기
https://kubernetes.io/ko/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/
1. 먼저 php-apache 서버를 구동한다
yaml을 살펴보면 pod의 자원을 명시하고 있다 - resource는 이럴때 사용한다
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
replicas: 1
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: k8s.gcr.io/hpa-example
ports:
- containerPort: 80
resources:
limits: # 안정적인 동작을 위해 node가 최대로 사용할 수 있는 지원
cpu: 500m
requests: # application이 동작하기 위한 최소 자원
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
yaml없이 아래 명령어만 입력해도 실행 됨 (image 링크가 바로 명시되어 있기 때문에)
kubectl apply -f https://k8s.io/examples/application/php-apache.yaml
** 참고
--> 해당 yml에 사용되는 이미지는 k8s.gcr.io/hpa-example에 있는데 이는 도커 허브가 아니다
도커허브에 이미지를 저장하는 경우 이미지를 불러올때 레이턴시가 발생할 수 있어 클라우드 플랫폼에서는 image repository를 제공하고 이를 사용하는 경우가 많다
2. HPA 실행
auto scale을 php-papche라는 deployment에 붙여 cpu가 50%이상 사용될때 최대 10개까지 만든다 (최소 개수 = 1)
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
targets- 0% (현재 pod 하나당 부하)
3. 부하 증가시키기
kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
서버 부하가 증가하면 hpa는 pod를 증가시킨다
gke에서는 autoscale을 실행하면 바로 target 0%가 되고 eks는 unknown 상태가 계속된다
gke는 모니터링 서버가 알아서 만들어지는데, eks는 만들어지지 않는다 -> unknown인 이유
eks에서 hpa를 사용하려면 서버를 만들어야 한다
HPA metric 서버 만들기(eks)
설정
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
확인
kubectl get pods -n kube-system -l k8s-app=metrics-server
참고자료
HPA는 stateless 환경에서 사용한다
DB 백업하기
Database의 data를 왕창 받는것 - dumpfile을 받는다
dump 뜬다 = table 그대로 복제하여 백업한다
DataBase Export
mysql dump file 만들기
mysqldump -u root -p DB 명 > 덤프파일명.sql
exec -it mysql bash
mysqldump -u root -p boot_board > /backup/dump.sql
DataBase Import
mysql -u root -p db명 < /덤프파일경로/덤프파일명.sql
pod의 파일 다운로드 받기
kubectl cp pod이름:복사경로/dump.sql ./dump.sql
kubectl cp mysql:/backup/dump.sql ./dump.sql
Database를 on prem환경에서 cloud환경으로 옮길때, 다른 서버로 옮길때 등 database migration할때 dump 뜬다
on prem환경에서 cloud환경으로 옮긴다고 가정해보면
--> on prem DB를 dump 뜬다
--> dockerfile에 이를 넣어 DB image를 만든다
--> 컨테이너 환경에서 실행한다
Dockerfile로 dump.sql 사용해서 DB image만들기
1. mysql dump file 만들기
2. image만들기
3. 이미지를 사용하여 DB container만들기
데이터가 남아있는채로 dump를 뜨고, 이 dump를 사용해 DB를 만들었다면 데이터가 그대로 보존됨
실습
데이터가 남아있는 모습..
로그인도 잘 된다
지금은 DB pod를 일반 pod로 사용했는데 이때 dump를 계속 뜨지 않는이상 pod가 사라지면 data가 사라지게 된다
그래서 statefulSet을 사용한다
아니면 DB svc에 pv pvc를 만들어 백업해도 된다 --> block storage는 node당 하나만 사용할 수 있어 데이터 손실 가능성이 있다
nfs 서버를 사용한다면?
--> nfs는 느리다 DB는 계속 트렌젝션이 일어나는데 연산이 느려 적합하지 않다 (log는 저장만 하면 돼서 느려도 된다)
---- disk io가 굉장히 느려짐
DB 백업으로 nfs로 사용하지 않으며 - stateful이 가장 적합하다
**참고
Cloud의 block storage는 Data storage크기가 커지면 IOPS가 빨라진다 (IOPS - 성능 측정 방식)
init Container
yml 파일을 실행할때 생성 순서가 중요한 경우가 있다 이럴때 사용하는것이 init container
이번 실습에서도 kubectl apply -f .를 사용하면 404 error나 css가 깨져 실행되는등 문제가 발생하는 경우가 많았는데
DB, Redis가 뜨기전에 was가 떠서 발생했던 문제이다
https://kubernetes.io/ko/docs/concepts/workloads/pods/init-containers/
init container -- 어떤 조건이 완료가 되면 본컨테이너(tomcat)가 뜨게끔 해주는 컨테이너
sample.yml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers: # 본컨테이너
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox:1.28
command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]
- namespace에 myservice 서비스가 뜨면 다음 init
- namespace에 mydb가 뜨면 본 컨테이너 실행
실습에서는 DB, Redis가 모두 뜨고 난 후 was가 떠야 한다
- was deploy.yml 에 init container를 추가한다
apiVersion: apps/v1
kind: Deployment
metadata:
name: was
spec:
replicas: 3
selector:
matchLabels:
app: was
template:
metadata:
labels:
app: was
spec:
containers:
- name: was
image: gymin97/msa-dev:redis-tomcat_v2
ports:
- containerPort: 8080
initContainers:
- name: init-redis
image: busybox:1.28
command: ['sh', '-c', "until nslookup redis-svc.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for redis-svc; sleep 2; done"]
- name: init-mysql-svc
image: busybox:1.28
command: ['sh', '-c', "until nslookup db-0.mysql-svc.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mysql-svc; sleep 2; done"]
** 참고: 일정시간이 지난 후 실행되도록 하는 방법
30초 이후 실행되도록하는 방법
containers:
- name: was
image: hifrodo/msa-dev:redis-tomcat-v2
imagePullPolicy: Always
ports:
- containerPort: 8080
initContainers:
- name: wait-mysql
image: busybox
command: ['sh', '-c', 'echo Just waiting!! && sleep 30']
오늘의 회고
- 오늘 실습하면서도 금요일에 되었던 실습이 또 안되길래 봤는데 순서가 중요한것이었다 .. 혹시 금요일에도 그래서 안됐던걸까,,!
- 오늘 뭔가 되게 많이 한것 같은데 hpa나 init container가 생각보다 실행이 어렵지 않아서 좋았다
- 주말에 공부 좀 안했다고 바로 statefulset을 까먹은 나를 보고 조금.. 실망스러웠다 ...........
- 내일은 실습에 hpa 사용하기로 핶다..
'Cloud > Cloud 공부일기' 카테고리의 다른 글
Day 61 - GCP, AWS Autoscale (0) | 2022.04.06 |
---|---|
Day 60 - 부하 분산 테스트 (nGrainder) (0) | 2022.04.05 |
Day 58 - JAVA, Gradle 설치, CICD 준비 (0) | 2022.04.01 |
Day 57 - full container 3tier 구성하기 (2) | 2022.03.31 |
Day 56 - 3tier 구성하기, StatefulSet (2) | 2022.03.30 |