engal1991 / Docker-Kubernetes

0 stars 0 forks source link

[11장: 애플리케이션 배포를 위한 고급 설정] 11.3 쿠버네티스 애플리케이션 상태와 배포 #44

Open engal1991 opened 2 years ago

engal1991 commented 2 years ago

고도화된 배포 방식을 지원하는 배포 도구

안정적으로 배포하기 위한 기능

11.3.1 디플로이먼트를 통해 롤링 업데이트

디플로이먼트를 이용한 레플리카 셋이 버전 관리 디플로이먼트를 사용하는 이유 : 리비전 관리 kubectl apply -f deployment.yaml --record kubectl rollout history deployment <deployment name>

디플로이먼트를 통한 롤링 업데이트 설정 배포 전략(strategy type)

11.3.2 포드의 생애 주기(Lifecycle)

Completed, Error와 restartPolicy

11.3.2.2 Running 상태가 되기 위한 조건

컨테이너이 애플리케이션이 정상적으로 동작한다는 것을 보장하기위한 기능

Running 상태가 되기 위한 조건 - Init 컨테이너 포드의 컨테이너 내부에서 애플리케이션이 실행되기 전에 초기화를 수해아는 컨테이너. 포드의 애플리케이션ㅇ 컨테이너가 실행되기 전에 특정 작업을 미리 수행하는 용도로 사용. 다른 디플로이먼트가 생성되기를 기다릴 수도 있다. pod 정의 spec.initContainers에 container 옵션과 동일하게 작성

Running 상태가 되기 위한 조건 - postStart 포드의 컨테이너가 실행되거나 삭제될 때, 특정 작업을 수행하도록 라이프사이클 훅을 yaml spec.containers.licecycle.poststart에 설정할 수 있다. 단, postStart는 컨테이너의 Entrypoint와는 비동기적으로 실행되며, 어떠한 것이 먼저 수행된다는 보장은 없다.

postStart의 방식

11.3.2.3 애플리케이션의 상태 검사 - livenessProbe, readinessProbe

애플리케이션이 사용자의 요청을 처리할 수 있는 상태인지 판별하기 이해 spec.containers.livenessProbe, spec.containers.readinessProbe를 제공.

검사 방식

세부 옵션

11.3.2.4 Terminatin 상태와 애플리케이션의 종료

기존 법전의 포드를 무사히 종료시키는 것도, 새로운 포드가 준비됐는지 확인하는 것 만큼이나 중요하다. 애플리케이션 단에서도 graceful shutdown을 위한 준비가 필요하다. (db connection 정리하기 등)

포드 삭제 시나리오

  1. 리소스가 삭제될 예정이라는 의미의 deletionTimestamp 값이 포드의 데이터에 추가되고, 포드는 Terminating 상태로 전환
  2. 아래 작업 동시에 실행
    1. prestop hook 실행
    2. 포드가 레플리카 셋으로부터 생성된 경우 해당 포드는 레플리카 셋의 관리 영역에서 벗어나며, 레플리카 셋은 새로운 포드를 생성하려고 시도
    3. 포드가 서비스 리소스의 라우팅 대상에서 제외
  3. preStop 훅이 완료되면 리눅스 시그널 중 SIGTERM이 포드의 컨테이너에 전달. 컨테이너의 init 프로세스는 SIGTERM을 수신한 뒤 종료되어양 함.
  4. 특정 유예 기간(terminationGracePeriodSeconds, 기본 30초)이 지나도 컨테이너 내부의 프로세스가 여전히 종료되지 않으면 프로세스 SIGKILL 시그널이 전달.

사용자는 prestop, SIGTERM 시그널 핸들러를 설정해서, 어떤 행동을 취할 것인지 별도의 장치를 마련할 수 있다.

11.3.3 HPA를 활용한 오토스케일링

리소스 사용량에 따라 디플로이먼트 포드 개수를 자동으로 조절하는 기능을 제공한다. HPA를 사용하기 위해서는 metrics-server라는 리소스 메트릭 수집 도구가 필요하다.

apiVersion: autoscaling/v1
kind: HorizontalPidAutoscaler
metadata : 
    name : <hpa name>
spec:
    scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: <deployment hostname>    # 해당 서버에서
    targetCPUUtilizationPercent: <cpu 사용량> # cpu 활용율이 <cpu 사용량> 이상이면
    maxReplicas: <num> # 포드를 최대 <num> 까지
    minReplicas: <num> # 포드를 최소 <num> 까지

주의할 점 : targetCPUUtilizationPercent : 포드의 절대적인 리소스 사용량이 아닌 포드에 할당된 request 대비 얼마나 리소스를 사용하고 있는지를 기준으로 삼는다. (모든 포드의 현재 사용량/request 의 평균값을 기준으로)

JVM 등, 일시적으로 cpu를 과도하게 사용하는 경우라면 오토 스케일이 좋은 선택은 아니다. 쿠버네티스 컨트롤러에서 매니저(kuve-controller-manager)에서 --horizontal-pod-autoscaler-sync-period 갑슬 수정해서 포드 개수 싱크 주기를 설정할 수 있다.