본문 바로가기

Kubenetes/Kubernetes Pods

Readiness Probe - Pod가 연결을 수락할 준비가 됐을 때 신호 보내기

레디네스 프로브는 주기적으로 호출되고 특정 포드가 클라이언트 요청의 수락 여부를 결정한다.

컨테이너의 레디네스 프로브가 성공을 반환한다면 컨테이너가 요청을 받아드릴 준비가 되었다는 신호다.

 

준비가 됐다는 표시는 분명히 각 컨테이너에 국한된 것이다. 쿠버네티스는 단지 컨테이너에서 실행 중인 애플리케이션이 간단한 GET/ 요청에 응답하는지 또는 특정 URL 경로에 도달할 수 있는지 확인하거나 필요에 따라서 애플리케이션이 준비됐는지 확인하기 위해 전체 체크리스트를 수행하기도 한다.

 

ㅁ 레디네스 프로브(Readiness Probe)의 타입

 

 ㅇ 프로세스를 실행시키는 Exec 프로브, 컨테이너의 상태는 프로세스의 종료 상태 코드에 의해 결정

 ㅇ HTTP GET 요청을 컨테이너에게 보내고 응답의 HTTP 상태 코드를 통해 컨테이너가 준비된 상태인지 아닌지 판별하는 HTTP GET 프로브가 있다.

 ㅇ 컨테이너의 지정된 포트로 TCP를 연결하는 TCP 소켓 프로브가 있다. 연결되면 컨테이너는 준비로 간주한다.

 

ㅁ 레디네스 프로브의 동작 이해

 

 컨테이너가 시작되면 쿠버네티스는 첫 번째 준비 확인을 수행하기 전에 구성 가능한 시간이 경과할 때까지 대기하도록 구성할 수 있다. 그리고 나서 주기적으로 프로브를 호출하고 레디네스 프로브의 결과를 기반으로 수행한다. 포드가 준비돼 있지 않다고 알려주면 서비스에서 삭제된다. 포드가 다시 준비가 되면 서비스에 다시 추가된다.

 

레디네스 프로브 실패한 포드는 서비스의 엔드포인트에서 삭제된다.

 

- 라이브니스 프로브(Liveness Probe)와 달리 컨테이너가 준비 확인에 실패한다면 종료되거나 디시 시작하지 않는다.  이것이 Liveness Probe와 Readiness Probe의 가장 큰 차이다. 

- 라이브니스 프로브는 상태가 좋지 않은 컨테이너를 종료하고 새로운 것으로 교체함으로써 포드의 상태를 좋게 유지한다면 레디네스 프로브는 오직 포드가 요청을 수신할 수 있는 환경이 됐을 때만 수신한다. 

 

ㅁ Pode로 Readiness Probe 추가

 

ㅇ 포드 템플릿으로 레디네스프로브 추가

 

기존 레플리케이션컨트롤러의 포드 템플릿에 Probe를 추가하려면 kubectl edit 명령을 사용

 

$ kubectl edit rc kubia

 

텍스트 에디터에서 ReplicationController의 YAML을 열어, Pod Template의 컨테이너 스펙을 찾고 Readiness  Probe의 정의를 spec.template.spec.containers의 아래에 첫번째 컨테이너로 추가한다.

 

[레디네스 프로브와 포드를 생성하는 RC: kubia-rc-readinessprobe.yaml]

apiVersion: v1
kind: ReplicationController
...
spec:
  ...
  template:
    ...
    spec:
      containers:
      - name: kubia
        image: luksa/kubia
        readinessProbe:            # 레디네스 프로브는 포드의 각 컨테이너를 위해 정의된다.
          exec:
            command:
            - ls
            - /var/ready
          ...

- 레디네스 프로브는 주기적으로 컨테이너 안에서 ls /var/ready 명령을 실행

- ls 명령은 파일이 있으면 0의 종료 코드를 반환하고, 파일이 없으면 0이 아닌 값을 반환 

 

위의 예에서 파일이 있으면 레디니스 프로브는 성공하고 그렇지 않으면 실패한다.

 

ㅁ 실제 환경에서 레디네스 프로브의 역할

 

실제 환경에서 레디네스 프로브는 애플리케이션의 클라이언트 요청의 수용 여부에 따라 성공 또는 실패를 반환해야 한다.

서비스에서 수동으로 포드를 제거하려면 프로브에서 스위치를 수동으로 전환하는 대신 포드를 삭제하거나 포드의 라벨을 변경해야 한다.

 

ㅇ 레디네스 프로브 항상 정의하기

 

 포드에 레디네스 프로브를 추가하지 않으면 거의 즉시 서비스 엔드포인트가 될 것이다.  따라서 기본 URL로 간단한 HTTP 요청을 보낸다 할지라도 레디네스 프로브를 항상 정의해야 한다.

 

ㅇ 레디네스 프로브에 포드의 종료 로직을 포함시키지 말자.

 

포드가 종료되고 있을 때 그 포드 안에 실행 중인 애플리케이션은 종료 신호를 받자마자 연렬 수락을 중지한다. 이로 인해 레디네스 프로브가 실패 하도록 해야 한다고 생각할 수도 있으나 쿠버네티스틑 포드를 삭제하자마자 모든 서비스에서 포드를 제거하기 때문에 종료 시점에 레디네스 프로브 정의는 불필요 하다.

 

 

 

'Kubenetes > Kubernetes Pods' 카테고리의 다른 글

Pod의 Lifecycle  (0) 2021.03.07
데몬셋 (Daemon Set)  (0) 2021.02.11
라이브니스 프로브 (Liveness Probe)  (0) 2021.02.10
Pod 4 - (Namespace)  (0) 2021.02.10
Pod 3 - (Label을 이용한 Pod 구성)  (0) 2021.02.10