Post

06 kubelet

06 kubelet

1. Note

1. Note

  • Probe는
    • 단순히 Pod이 있냐 없냐가 아니라,
    • Pod 안의 애플리케이션이 실제로 정상 동작하는지를 kubelet이 판단하도록 만드는 장치
    • 그래서 필수는 아님, 없어도 동작하는데 문제는 없음.
    • 하지만 안정성을 위해 있는게 좋음

2. Kubelet / Probes

1. Kubelet / Probe

  • kubelet: 각 노드(워커 노드)에서 실행되며 Pod를 생성하고 상태를 유지하는 에이전트
  • probes: kubelet이 컨테이너 상태를 판단하기 위해 수행하는 헬스 체크 규칙

3. Kubelet 역할

  • Pod 스펙(YAML)을 API Server로부터 받아옴
  • 컨테이너 런타임(containerd 등)에 컨테이너 실행 요청
  • 실행 중인 컨테이너 상태 지속 감시
  • probes 설정을 기반으로 헬스 체크 수행
  • 이상 상태일 경우 재시작 또는 상태 변경 처리
  • Pod 상태를 API Server에 지속적으로 보고

3. Probe 역할

  • 실행 목적
    • 컨테이너가 정상적으로 동작 중인지 확인
    • 서비스 트래픽을 받아도 되는 상태인지 확인
    • 아직 초기화 중인지 판단
    • 애플리케이션 장애 여부 탐지
  • 판단
    • POD에 직접 들어가서 상태를 직접 체크하지 X
    • 판단하는 근거

      방식무엇을 확인특징
      HTTP GETAPI 응답가장 일반적, Spring Boot
      TCP Socket포트 열림 여부단순 네트워크 체크
      Exec내부 명령 실행가장 강력하지만 무거움

3. Probe 종류

1. 요약

종류목적실패 시 동작사용 시점
Liveness살아있는지재시작실행 중 장애
Readiness트래픽 가능 여부서비스 제외요청 받기 전
Startup초기 부팅 완료 여부대기 (다른 probe 무시)앱 시작 시

2. Liveness Probe (생존 확인)

  • 컨테이너가 “살아있는지” 확인하는 검사
  • 확인 항목
    • 앱이 멈췄는데 프로세스만 살아있는 경우
    • 무한 루프, 데드락, 응답 없음 상태
  • Kubelet 동작
    • 실패하면 컨테이너를 재시작

3. Readiness Probe (준비 상태 확인)

  • 컨테이너가 “트래픽을 받을 준비가 되었는지” 확인하는 검사
  • 확인 항목
    • 애플리케이션은 실행 중이지만 DB 연결이 안 된 상태
    • 초기 데이터 로딩 중이거나 외부 의존성이 준비되지 않은 경우
  • Kubelet 동작
    • 실패하면 해당 Pod를 Service 트래픽에서 제외

4. Startup Probe (초기 구동 확인)

  • 컨테이너가 “초기 시작 과정을 정상적으로 완료했는지” 확인하는 검사
  • 확인 항목
    • Spring Boot, JVM처럼 기동 시간이 긴 애플리케이션
    • 초기 설정이나 로딩 시간이 긴 서비스
  • Kubelet 동작
    • 초기 구동 동안에는 Liveness/Readiness Probe를 잠시 무시
    • Startup 성공 후에 다른 Probe가 정상적으로 동작

4. 전체적인 흐름

1. 컨테이너 설정 yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
apiVersion: apps/v1
kind: Deployment # POD도 가능함.
metadata:
  name: demo-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: demo-app
  template:
    metadata:
      labels:
        app: demo-app
    spec:
      containers:
        # 파드가 여러개 일경우 개별 설정함.
        - name: app
          image: my-app:1.0

          # Probe 영역
          livenessProbe:             # 컨테이너가 살아있는지 확인 시작
            httpGet:                 # HTTP 방식으로 상태 체크 (GET 요청)
              path: /health          # 상태 확인 엔드포인트
              port: 8080             # 컨테이너 내부 포트
            initialDelaySeconds: 10  # 컨테이너 시작 후 10초 뒤부터 검사 시작
            periodSeconds: 5         # 5초마다 반복 검사

          readinessProbe:            # 트래픽 받을 준비 상태 확인 시작
            httpGet:                 # HTTP 방식으로 상태 체크 (GET 요청)
              path: /ready           # 준비 상태 확인 엔드포인트
              port: 8080             # 컨테이너 내부 포트
            initialDelaySeconds: 5   # 컨테이너 시작 후 5초 뒤부터 검사 시작
            periodSeconds: 5         # 5초마다 반복 검사

          startupProbe:              # 컨테이너 초기 실행 완료 여부 확인 시작
            httpGet:                 # HTTP 방식으로 상태 체크 (GET 요청)
              path: /startup         # 초기 부팅 완료 확인 엔드포인트
              port: 8080             # 컨테이너 내부 포트
            failureThreshold: 30     # 실패 30번까지는 초기 구동으로 보고 기다림
            periodSeconds: 10        # 10초마다 반복 검사

2. kubelet 생성

  • 별도의 작업이 없이 POD내에서 probe설정을 하면 알아서 자동으로 진행됨.
  • Service나 뭐 이런것처럼 별도 실행 X

3. kubelet 작업 흐름

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Deployment
   ↓
ReplicaSet
   ↓
Pod 생성
   ↓
kubelet 실행
   ↓
container runtime 실행
   ↓
probe 주기 실행
   ↓
상태 판단
   ↓
재시작 / 트래픽 제외 / 유지

5. SpringBoot와 Probe

  • Memo
    • Pod 내부에서 Probe 설정만 해두면 기본적으로 셋팅이됨
  • 의존성추가
    1
    2
    3
    4
    
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    
  • URL 매핑

    Probe 종류Spring Boot Actuator URL의미 (무엇을 보는가)kubelet 동작실제 체크 포인트
    Liveness Probe/actuator/health/liveness앱이 “살아있는 상태인지”실패 시 컨테이너 재시작JVM crash, 무한루프, 응답 불가
    Readiness Probe/actuator/health/readiness트래픽 받아도 되는 상태인지실패 시 Service에서 제외DB 연결, 외부 API, 초기화 완료 여부
    Startup Probe(보통 Actuator 직접 사용 안함 / 커스텀 or readiness로 대체)초기 부팅 완료 여부성공 전까지 다른 probe 무시초기 로딩, Spring Boot 기동 완료
This post is licensed under CC BY 4.0 by the author.