[K8s in Action] 4. 레플리케이션과 그 밖의 컨트롤러: 관리되는 파드 배포

Sangmin Yoon·2021년 6월 29일
0

Kubernetes in Action

목록 보기
4/8
post-thumbnail
post-custom-banner

파드를 직접 생성할 일은 거의 없다. ReplicationController나 Deployment와 같은 유형의 리소스를 생성해 실제 파드를 생성 및 관리한다.

1. 파드를 안정적으로 유지하기

컨테이너의 주 프로세스에서 crash가 발생하면 kubelet이 컨테이너를 다시 시작한다. 그럼에도 외부에서 App health check를 하는 방법이 필요하다.

1) 라이브니스 프로브(Liveness probe)

  • 파드의 spec에 liveness probe를 지정할 수 있다. 쿠버네티스는 주기적으로 프로브를 실행하고 프로브가 실패할 경우 컨테이너를 다시 시작한다.
  • 쿠버네티스는 세 가지 메커니즘(HTTP GET Probe / TCP Socket Probe / Exec Probe)을 사용해 컨테이너에 프로브를 실행한다.

2) HTTP 기반 라이브니스 프로브 생성

3) 동작 중인 라이브니스 프로브 확인

4) 라이브니스 프로브의 추가 속성 설정

  • delay=0s는 컨테이너가 시작된 후 바로 프로브가 시작된다는 것. timeout=1s는 컨테이너가 1초 안에 응답해야 된다는 것. period=10s는 프로브를 10초마다 수행한다는 것. #failure=3은 프로브가 3번 연속 실패하면 컨테이너가 다시 시작된다는 것.
  • initialDelaySeconds를 설정하지 않으면 컨테이너가 시작되자마자 프로브를 시작하는데, 이게 오류를 많이 발생시킨다.

5) 효과적인 라이브니스 프로브 생성

  • 라이브니스 프로브가 확인해야 할 사항
    - 앱 내 모든 구성 요소가 살아 있는지 확인하도록 구성해야 한다.
    - 앱 내부만 체크하고 외부 요인의 영향을 받지 않도록 해야 한다.
  • 프로브를 가볍게 유지하기
    - 비교적 자주 실행되며, 1초 안에 마무리해야 한다. CPU 시간을 제한하는 방법도 있다.
  • 프로브에 재시도 루프를 구현하지 마라

6) 라이브니스 프로브 요약

  • 컨테이너에 크래시가 발생하거나 라이브니스 프로브가 실패한 경우, 컨테이너가 재시작된다. 이 작업은 노드의 Kubelet에서 수행한다.
  • 그런데 노드 자체가 터지면 Kubelet도 터진다. 대체 파드를 생성하는 것은 Master Node의 Control Plane의 몫이다.

2. 레플리케이션 컨트롤러

주의. ReplicaSet을 구성하는 Deployment가 현재 권장하는 레플리케이션 설정 방법이다. ReplicationController는 잘 쓰이지 않는다.

ReplicationController는 파드가 항상 실행되도록 보장한다. 노드가 터지면 다른 노드에 관리되는 파드를 재생성한다. 일반적으로 RC는 파드의 Replica를 작성하고 관리한다.

1) 레플리케이션컨트롤러의 동작

  • RC의 역할은 정확한 수의 파드가 항상 레이블 셀렉터와 일치하는지 확인하는 것이다.
  • RC에는 세 가지 필수 요소가 있다. (Label selector / Replica count / Pod template)

2) 레플리케이션컨트롤러 생성

  • YAML 디스크립터를 전달.

3) 레플리케이션컨트롤러 작동 확인

3. 레플리케이션컨트롤러 대신 레플리카셋 사용하기

일반적으로 레플리카셋을 직접 생성하지는 않고, 디플로이먼트 리소스를 생성할 때 자동으로 생성되게 한다.

1) 레플리카셋과 레플리케이션컨트롤러 비교

  • 레플리카셋은 특정 레이블이 없는 파드나 레이블 값과 상관 없이 특정 레이블의 키를 갖는 파드를 매칭시킬 수 있다.

2) 레플리카셋의 더욱 표현적인 레이블 셀렉터 사용하기

4. 데몬셋을 사용해 각 노드에서 정확히 한 개의 파드 실행하기

레플리케이션컨트롤러와 레플리카셋은 쿠버네티스 클러스터 내 어딘가에 지정된 수만큼의 파드를 실행한다. 그러나 클러스터의 모든 노드에, 노드당 하나의 파드만 실행되기를 원하는 경우가 있을 수 있다. (ex. 시스템 수준의 작업을 수행하는 인프라 관련 파드 - 로그 수집기와 리소스 모니터, Kube-proxy)

1) 데몬셋으로 모든 노드에 파드 실행하기

2) 데몬셋을 사용해 특정 노드에서만 파드를 실행하기

5. 완료 가능한 단일 태스크를 수행하는 파드 실행

1) Job 리소스 소개

  • 쿠버네티스의 Job은 컨테이너 내부 프로세스가 성공적으로 완료되면 컨테이너를 다시 실행하지 않는다.
  • spec에서 restartPolicy는 반드시 OnFailure나 Never로 설정해야 한다.

2) Job에서 여러 파드 인스턴스 실행하기

  • Job은 두 개 이상의 파드 인스턴스를 생성해 병렬 또는 순차적으로 실행하도록 구성할 수 있다. 이는 Job spec에 completions와 parallelism 속성을 설정해 수행한다.

3) Job 파드가 완료되는 데 걸리는 시간 제한하기

  • spec에 activeDeadlineSeconds 속성을 설정해 파드의 실행 시간을 제한할 수 있다.

6. 잡을 주기적으로 또는 한 번 실행되도록 스케쥴링하기

Job은 생성되자마자 파드를 실행한다. 그러나 많은 Batch Job이 미래의 특정 시간 혹은 지정된 간격으로 반복 실행된다. CronJob을 생성하면 된다.

post-custom-banner

0개의 댓글