Kubernetes/05. 컨트롤러 종류 및 설명

[쿠버네티스] EKS를 활용한 디플로이먼트와 하위에 생성되는 레플리카셋

Jaden Park 2021. 8. 21. 01:49

들어가며:

 

디플로이먼트란?

디플로이먼트 구성파일

디플로이먼트 생성

디플로이먼트 목록 표시

 

레플리카셋이란?

디플로이먼트 하위에 생성되는 레플리카셋

 

파드란?

레플리카셋으로 생성되는 파드

kubectl describe 명령으로 상세 정보 수집

 


 

들어가며:

해당 포스팅은 클라우드 네이티브를 위한 쿠버네티스 실전 프로젝트를 참고하여 작성했습니다.

 

클라우드 네이티브를 위한 쿠버네티스 실전 프로젝트 - YES24

애플리케이션 엔지니어도 쉽게 배우는 실전 쿠버네티스 프로젝트를 만난다!클라우드 컴퓨팅, 컨테이너, 쿠버네티스라는 세 가지 인프라 관련 기술이 등장하면서 최신 서비스 개발 환경은 클라

www.yes24.com

 

 

디플로이먼트 업데이트 전략 대한 설명 추가적인 설명을 원한다면 이전 포스팅을 참고하시기 바랍니다.

 


디플로이먼트(Deployment) 란?

 

Deployment는 쿠버네티스에서 가장 널리 사용하는 오브젝트 중 한개입니다.

 

 

레플리카셋(ReplicaSet) 컨트롤러와 지금은 거의 사용하지않는 레플리케이션(Replication) 컨트롤러는 파드를 생성하고 관리합니다.

레플리케이션 컨트롤러보다 더 상위 수준의 컨트롤러 리소스가 있습니다. 그것이 디플로이먼트(Deployment) 리소스 입니다.

 

디플로이먼트 애플리케이션(컨트롤러, 파드)을 배포하고 선언적으로 업데이트를 수행하는 리소스입니다. 디플로이먼트 리소스는 하위에 레플리카셋 컨트롤러를 제어하고 그리고 레플리카셋 컨트롤러가 하위 파드를 제어하는 구조 입니다.

 

 

 

디플로이먼트 리소스를 이용해 전체를 제어하기에 디플로이먼트 리소스가 관리하는 하위 레플리카셋 컨트롤러를 직접 관리하면 안됩니다.

 

 


디플로이먼트 구성파일

  • apiVersion: 매니페스트 파일에서 정의된 오브젝트가 준수해야 하는 사양의 버전을 설정 ($kubectl api-resources $kubectl api-versions)
    • kind: 오브젝트 종류 정의

 

  • metadata
    • name: 디플로이먼트의 이름 정의
    • labels: 키[app] - 값[backend-app]으로 정의

 

  • spec
    • replicas: 디플로이먼트를 통해 클러스터 내부에 배포된 파드 수를 설정. 클러스터 전체에 파드 2개가 생성
    • selector: 파드에 대한 레이블 선택 설정. 필드로는 [일치성 기준 matchLabels], [집합성 기준, matchExpressions]가 있음
    • template: 디플로이먼트를 통해 배포할 파드의 정의를 설정하는 부분으로 "파드 템플릿"이라고도 함. 레이블, 컨테이너 이름, 컨테이너 이미지, 공개할 컨테이너 포트 등을 정의
    • readinessProbe, livenessProbe: 각각 파드가 새로 시작될 때(레디니스프로브), 그 이후(라이브니스프로브) 파드가 정상작동 하는지를 모니터링하여 컨테이너 재시작 정책을 결정. 자세한 내용은 이전 포스팅을 참고
    • resource: 파드가 사용할 리소스를 설정

 


디플로이먼트 생성

 

EKS 클러스터에 디플로이먼트를 생성하겠습니다.

$ ECR_HOST=<AWS_ACCOUNT_ID>.dkr.ecr.ap-northeast-1.amazonaws.com \
envsubst < 22_deployment_backend-app_k8s.yaml.template | \
kubectl apply -f -

 

 

정상적으로 생성된 것을 확인합니다.

 

 


디플로이먼트 목록 표시

$ kubectl get deployment

NAME: 디플로이먼트 이름

READY: 실제동작하는 파드 수 / 설정된 파드 수

UP-TO-DATE: 디플로이먼트에서 정의된 상태를 만족하는 파드 수

AVAILABLE: 실제 사용 가능한 파드 수

AGE: 생성 경과 시간

 

 

디플로이먼트를 생성한 직후를 살펴보면

파드의 수를 2개로 설정됐고

2개의 파드가 상태를 만족하지만

구성시간 + readinessProbe 설정으로 실제 동작하는 파드는 없으며

이에 따라 가용가능한 파드도 없는 것을 확인할 수 있습니다.

 

 


레플리카셋이란?

쿠버네티스의 기본 단위인 Pod는 여러 개의 컨테이너를 추상화해 하나의 애플리케이션으로 동작하도록 만드는 훌륭한 컨테이너 묶음

그러나 YAML에 Pod만 정의해 생성하게 되면 이 Pod의 생애 주기(Lifecycle)은 컨테이너 삭제 시 영원히 사라지게 됩니다.

 

이처럼 yaml 파일에 Pod만 정의해 생성할 경우 해당 Pod는 오직 쿠버네티스 사용자에 의해 관리합니다.

실제로 외부 사용자의 요청을 처리해야 하는 마이크로 서비스 구조의 Pod라면 이러한 방식을 사용하기 어렵습니다.

 

여러 개의 Pod를 직접 생성하는 방법은 여러 가지 이유로 적절하지 않습니다.

  • 동일한 Pod의 개수가 많아질수록 일일이 정의하는 것은 매우 비효율적인 작업
  • Pod가 어떠한 이유로든지 삭제되거나, Pod가 위치한 노드에 장애가 발생해 더 이상 포드에 접근하지 못하게 됐을 때, 직접 포드를 삭제하고 다시 생성하지 않는 한 해당 Pod는 다시 복구되지 않음.

 

이러한 경우 레플리카셋이라는 쿠버네티스 오브젝트를 함께 사용하는 것이 일반적입니다.

레플리카셋이 수행하는 역할을 간단하게 설명하면 다음과 같습니다.

 

  • 정해진 수의 동일한 포드가 항상 실행되도록 관리합니다.
  • 노드 장애 등의 이유로 포드를 사용할 수 없다면 다른 노드에서 포드를 다시 생성합니다.

레플리카셋에 대해 자세히 알고 싶다면 이전포스팅을 참고해주세요.

 

이전 포스팅에서 레플리카셋의 전신 레플리케이션 컨트롤러에 대해 설명하였습니다. 이전 글과 함께 읽는다면 도움이 될 것입니다.

cf) 현재는 레플리케이션 컨트롤러보다 레플리카셋 또는 디플로이먼트를 사용하는 것을 권장합니다.

 


 

디플로이먼트 하위에 생성되는 레플리카셋(ReplicaSet)

앞서 설명했듯이 디플로이먼트는 직접 파드를 배포하지 않고 레플리카셋이라는 다른 오브젝트트를 생성해 배포합니다.

레플리카셋의 주된 역할은 파드 수 증감과 파드 장애 시 자동 재시작.

레플리카셋에 대한 자세한 설명은 이전 포스팅을 참고하세요.

 

$ kubectl get replicaset

 

NAME: 디플로이먼트 이름-"랜덤한 문자열"

DESIRED: 레플리카셋에서 설정한 파드 수

CURRENT: 현재 동작하고 있는 파드 수

READY: 준비 완료 상태인 파드 수

AGE: 레플리카셋이 생성된 이후 경과된 시간

 

 


파드 란?

쿠버네티스에서 프로그램을 동작시키는 기본 단위

관련성 있는 하나 이상의 컨테이너를 합쳐놓은 오브젝트

 

자세한 설명은 이전 포스팅을 참고하시기 바랍니다.

 


레플리카셋으로 생성된 파드

 

NAME: 레플리카셋이름-"랜덤한 문자열"

READY: 초기화 완료된 컨테이너 수 / 파드가 가지고 있는 초기화 컨테이너 수

  • INIT:N/M - 파드가 M개의 초기화 컨테이너를 가지고 있으며 현재 N 개가 완료
  • INIT:Error - 초기화 컨테이너 실행 실패
  • Init:CrashLoopBackOff - 초기화 컨테이너가 반복적으로 실행 실패
  • Pending - 파드가 아직 초기화 컨테이너를 실행하지 않음
  • PodInitializing or Run - 파드가 이미 초기화 컨테이너 실행을 완료

STATUS: 파드의 상태

RESTARTS: 초기화 컨테이너 반복 시도 횟수

AGE: 파드가 생성된 시간 카운트

 

 

이처럼 디플로이먼트를 선언하면 레플리카셋이 생성되고 파드가 생성되는 흐름을 확인할 수 있습니다.

 

 


kubectl describe 명령으로 상세 정보 수집

쿠버네티스 클러스터 리소스 상세 정보를 확인하기 위한 명령입니다.

비정상 작동할 때의 원인을 확인해볼 수 있습니다.

 

$ kubectl describe <리소스 종류> <오브젝트 이름>

kubectl describe 명령 형식은 다음과 같습니다.

 

 

  • Name: 파드 이름
  • Namespace: 파드가 생성된 네임스페이스 이름
  • Node: 파드가 배치되어 동작하는 노드 이름
  • Start Time: 파드 생성 일시
  • Status: 파드 상태
  • IP: 파드에 할당된 IP 주소
  • Controlled By: 파드를 제어하는 상위 오브젝트
  • Container: 아래 항목은 컨테이너 단위 상태를 나타냄
    • Image ID: 컨테이너 이미지 이름
    • Port: 컨테이너가 사용하는 프로토콜과 포트 번호
    • Limits & Requests: 리소스 제한 값 & 리소스 사용 값
    • Liveness & Readiness: 파드 헬스 체크  Probe 설정 및 상태
    • Environment: 쿠버네티스가 이 파드에 설정하는 환경 변수
    • Volumes: 파드 레벨의 항목으로 마운트되어 있는 볼륨 정보

 

  • Events: 파드의 동작 상세보기