[쿠버네티스] 6. 레플리케이션 및 파드 컨테이너 관리

레플이케이션과 파드의 컨테이너 관리 요소

쿠버네티스를 사용하면 컨테이너의 실행을 보장 받는다.
풆어서 얘기하자면, 파드가 노드에 스케줄링이 되면 해당 노드의 Kubelet은 파드의 컨테이너를 실행하고 파드가 존재하는 한 컨테이너가 계속 실행되도록 한다.

어플리케이션이 죽는다면 다시 리소스에 의해 재실행

예외 상황

  • 만약 자바 어플리케이션이 실행 중 OOM이 발생해 죽는다면?
  • 어플리케이션이 무한 루프 또는 교착상태에 빠질 경우

=> 이런경우 어플리케이션이 다시 시작되도록 하기 위해선 앱 내부의 기능에 의존하지 말고 외부에서 어플리케이션의 상태를 체크 해야 함

라이브니스 프로브

쿠버네티스는 라이브니스 프로브를 통해 컨테이너가 살아 있는지 확인할 수 있다.

라이브니스 프로브는 파드의 spec에 정의되어 있다.

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

apiVersion: v1
kind: Pod
metadata:
    name: kubia-liveness
spec:
    containers:
    - image: luksa/kubia-unhealthy
      name: kubia
      livenessProbe:
        httpGet:
          path: /
          port: 8080

이 파드의 디스크립터는 쿠버네티스가 주기적으로 '/' 경로와 8080포트에 HTTP GET을 요청해서 컨테이너가 정상 동작하는지 확인하도록 httpGet 라이브니스 프로브를 정의한다.

이전 컨테이너가 종료된 이유를 파악하려는 경우
kubectl logs {podname} --previous 명령어 사용
또는 kubectl describe po {podnamne} 으로 이전 종료 이유를 보면 된다.

describe 로 상태를 확인해 보자

 Last State:     Terminated
      Reason:       Error
      Exit Code:    137
      Started:      Tue, 02 Jun 2020 22:46:36 +0900
      Finished:     Tue, 02 Jun 2020 22:48:23 +0900
    Ready:          True
    Restart Count:  3
    Liveness:       http-get http://:8080/ delay=0s timeout=1s period=10s #success=1 #failure=3

위와 같이 마지막 상태값과 코드 그리고 재실행된 횟수 정보를 확인 할 수 있다.

여기서 Liveness 속성을 보면 파일로 작성한 라이브니스 프로브 지정값 이외도 지연, 제한 시간, 기간등과 같은 추가 속성도 볼수 있다.

  • delay : 제한시간으로 해당 시간안에 반응이 되야함
  • period : 기간으로 해당 기간을 주기로 프로브를 실행
  • failure : 연속으로 n 번 실패하면 재실행

위 속성들은 프로브를 정의할때 지정 할 수 있다.

만약 어플리케이션이 초기 실행시간이 길다면?

어플리케이션이 초기 세팅이나 리소스 로딩으로 인해 지연시간이 생긴다면, 프로브는 컨테이너가 시작하자마자 실패 임계값을 초과 해버릴지도 모른다.
따라서 초기 지연값을 설정해주는 것도 좋은 방법이다.

livenessProbe:
  httpGet:
    path: /
    port: 8080
  initialDelaySeconds : 15 <- 첫번째 프로브 실행까지 15 초 대기

레플리케이션컨트롤러

레플리케이션 컨트롤러는 쿠버네티스 리소스로서 파드가 항상 실행되도록 보장한다.

동작

레플리케이션컨트롤러는 실행중인 파드 목록을 지속적으로 모니터링하고 파드의 수를 유지한다.

위 표는 레플리케이션 컨트롤러의 동작 과정을 보여준다.

요소

레플리케이션컨트롤러는 세가지 필수 요소가 있다.

  • 레이블 셀렉터
  • 레플리카 수
  • 파드 템플릿

YAML 파일로 레플리케이션컨트롤러 생성 하기

apiVersion: v1
kind: ReplicationController
metadata:
    name: kubia
spec:
    replicas: 3
    selector:
      app: kubia
    template:
      metadata:
        labels:
          app: kubia
      spec:
        containers:
        - image: luksa/kubia
          name: kubia3
          ports:
            - containerPort: 8080
              protocol: TCP

현재 복제폰은 3개이며 레이블 셀렉터는 'kubia'로 지정하여 레이블이 kubia인 파드를 3개 유지하도록 한다.

kubectl create -f {file}

위와 같이 컨트롤러를 생성 할 수 있다.

그리고 현재 파드 목록을 조회하면

kubia-mczx8       1/1     Running   0          114s   app=kubia
kubia-sq46d       1/1     Running   0          114s   app=kubia
kubia-zjw6v       1/1     Running   0          39s    app=kubia

이렇게 3개의 파드가 생성된걸 확인 할 수 있다.

레플리케이션컨트롤러 스케일 확장

기존 3개의 레플리카에서 10개로 스케일을 조정하고 싶다면
replica 필드 값을 수정하면 된다.

kubectl scale rc kubia --replicas=10

레플리케이션컨트롤러 삭제

kubectl delete 명령어로 삭제하면 파드도 같이 삭제된다. 하지만
--cascade=false 옵션으로 파드는 실행중으로 유지할 수 있다.

댓글

Designed by JB FACTORY