갬미의 성장일기

Day 59 - HPA, DB dump ,init container 본문

Cloud/Cloud 공부일기

Day 59 - HPA, DB dump ,init container

갬미 2022. 4. 4. 23:22

오늘 배운 내용

- HPA

- DB dump

- init container


HPA (Horizontal Pod Autoscaling)

pod scale을 늘리는 방법은 두가지가 있다 

  1. scale out - in : pod의 수를 늘리는 방법, horizonal - 세션처리, 부하 발생시
  2. scale up - down : pod의 spec을 높이는 방법, vertical - 고속의 cpu가 필요할때 

HPA는 pod scale out - in 을 구현하는 방법이다

kubenetes io 공식 자료

 

Horizontal Pod Autoscaling

In Kubernetes, a HorizontalPodAutoscaler automatically updates a workload resource (such as a Deployment or StatefulSet), with the aim of automatically scaling the workload to match demand. Horizontal scaling means that the response to increased load is to

kubernetes.io

 

실습 따라하기

https://kubernetes.io/ko/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/

 

HorizontalPodAutoscaler 연습

HorizontalPodAutoscaler(약어: HPA)는 워크로드 리소스(예: 디플로이먼트 또는 스테이트풀셋)를 자동으로 업데이트하며, 워크로드의 크기를 수요에 맞게 자동으로 스케일링하는 것을 목표로 한다. 수평

kubernetes.io

 

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인 이유 

좌 gke 우 eks

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

참고자료

 

Amazon EKS에서 Kubernetes Metrics Server 및 Horizontal Pod Autoscaler 설정

Amazon Elastic Kubernetes Service(Amazon EKS)에서 Kubernetes Metrics Server 및 Horizontal Pod Autoscaler(HPA)를 설정하고 싶습니다. 이제 Metrics Server가 가동되어 실행 중이며, 이를 사용하여 리소스 기반 지표를 가져올

aws.amazon.com

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/

 

초기화 컨테이너

이 페이지는 초기화 컨테이너에 대한 개요를 제공한다. 초기화 컨테이너는 파드의 앱 컨테이너들이 실행되기 전에 실행되는 특수한 컨테이너이며, 앱 이미지에는 없는 유틸리티 또는 설정 스크

kubernetes.io

 

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 사용하기로 핶다..
Comments