쿠버네티스의 Self-Healing: 클러스터 안정성의 핵심
쿠버네티스 셀프힐링이란?
셀프힐링은 쿠버네티스 공식 홈페이지에 들어가 보면 다음과 같이 정의하고 있습니다.
“실패한 컨테이너를 재시작하고, 노드가 죽는 경우 컨테이너들을 교체하기 위해 다시 스케줄링을 하며, 사용자가 정의한 상태 체크에 응답하지 않는 컨테이너들을 종료시키며, 서비스를 제공할 준비가 완료될 때까지 해당 컨테이너를 클라이언트에 알리지 않는다.”
즉, 애플리케이션 또는 노드에 문제가 발생했을 때, 쿠버네티스가 자동으로 이를 감지하고 적절한 조치를 하여 클러스터의 상태를 정상으로 되돌리는 기능을 말합니다. 이는 수동 개입 없이도 클러스터의 장애를 최소화하고, 애플리케이션의 가용성을 유지하는 데 중요한 역할을 합니다.
셀프힐링을 가능하게 만드는 '프로브'
쿠버네티스에서 셀프힐링을 가능하게 만드는 중요한 요소 중 하나는 '프로브(Probe)'입니다. 프로브는 특정 시점에 컨테이너의 상태를 확인하는 데 사용되며, 이를 통해 쿠버네티스는 해당 컨테이너가 정상인지, 비정상인지 판단할 수 있습니다. 프로브에는 크게 세 가지 유형이 있습니다: 라이브니스 프로브(Liveness Probe), 레디니스 프로브(Readiness Probe), 스타트업 프로브(Startup Probe)입니다. 각 프로브의 역할과 작동 방식을 자세히 살펴보겠습니다.
라이브니스 프로브 (Liveness Probe)
라이브니스 프로브는 컨테이너가 실행 중인지 여부를 확인하는 역할을 합니다. 컨테이너가 정상적으로 실행되고 있는지 판단하여, 비정상적인 상태에 있는 컨테이너를 재시작하는 데 사용됩니다.
레디니스 프로브 (Readiness Probe)
레디니스 프로브는 컨테이너가 외부 요청을 처리할 준비가 되었는지 여부를 판단합니다. 컨테이너가 준비되지 않은 상태이면 서비스 디스커버리에서 제외하여, 클라이언트로부터의 요청이 전달되지 않도록 합니다
스타트업 프로브 (Startup Probe)
스타트업 프로브는 컨테이너가 초기화되고 성공적으로 시작되었는지를 확인합니다. 주로 긴 초기화 시간이 필요한 애플리케이션에서 사용되며, 컨테이너가 시작되기 전까지 다른 모든 프로브를 비활성화합니다.
쿠버네티스 프로브 구현하는 작동 방식
쿠버네티스에서 프로브를 구현하는 방식에는 주로 세 가지가 사용됩니다: httpGet, tcpSocket, exec입니다. 각각의 방식은 컨테이너 내 애플리케이션의 상태를 확인하는 다양한 방법을 제공합니다
HTTP 검사를 통한 프로브 (httpGet)
HTTP 검사는 HTTP 요청을 통해 애플리케이션의 상태를 확인하는 방법으로, 지정된 HTTP 엔드포인트에 요청을 보내고, 성공적인 응답을 받으면 컨테이너가 정상인 상태라고 판단합니다.
TCP 검사를 통한 프로브 (tcpSocket)
TCP 검사는 지정된 포트에 TCP 연결을 시도하여 애플리케이션의 상태를 확인합니다. 연결이 성공하면 컨테이너가 정상으로 판단됩니다.
명령어 검사를 통한 프로브 (exec)
명령어 검사는 컨테이너 내에서 명령어를 실행하여 그 종료 코드를 기반으로 상태를 확인합니다. 명령어가 성공적으로 실행되고, 종료 코드가 0이면 컨테이너가 정상으로 판단됩니다.
이와 같이 HTTP, TCP, 명령어 검사를 통해 프로브를 설정함으로써, 쿠버네티스는 컨테이너의 실행 상태를 지속적으로 모니터링하고 자동으로 복구할 수 있는 능력을 갖추게 됩니다. 이에 따라 애플리케이션의 가용성은 물론, 클러스터의 안정성 또한 크게 향상됩니다
그럼 이제 위에서 학습한 내용과 함께, Spring Boot 애플리케이션에서 Spring Actuator를 이용하여 쿠버네티스 프로브를 설정하는 방법을 간단하게 실습해 보겠습니다.
Spring Actuator를 이용한 쿠버네티스 프로브 설정
Spring Actuator는 Spring Boot 애플리케이션 내에서 다양한 진단 및 모니터링 기능을 제공합니다. Spring Actuator의 헬스 체크 엔드포인트를 사용하여 쿠버네티스의 Liveness 프로브를 설정하는 방법을 다뤄보겠습니다
먼저, Spring Boot 애플리케이션에 Spring Actuator를 추가하고 설정해야 합니다.
1. Spring Boot 프로젝트 설정
Spring Boot Initializr 또는 기존 프로젝트에서 pom.xml에 Spring Actuator 의존성을 추가합니다:
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2. Spring Actuator 설정
application.properties 또는 application.yml 파일에서 Actuator의 헬스 체크 엔드포인트를 활성화합니다:
대표적인 Management 옵션
management.endpoints.web.exposure.include : 애플리케이션 엔드포인트를 웹에서 노출할지 설정
management.health.diskspace.enabled : 디스크 사용량 헬스 체크를 활성화 또는 비활성화하며 기본값은 true, 디스크 공간을 확인하여 일정 임곗값 이하일 때 헬스 체크에 실패하도록 설정
management.server.port : 관리용 엔드포인트가 노출될 포트를 설정. 이 설정을 통해 애플리케이션 서버와 관리 서버의 포트를 분리하여 보안성을 높임
application.properties
management.endpoints.web.exposure.include=*
management.health.livenessstate.enabled=true
management.health.readinessstate.enabled=true
management.health.diskspace.enabled=false
management.server.port=8081
Spring Actuator의 기본 헬스 체크 엔드포인트는 /actuator/health입니다. 이제 애플리케이션의 상태를 모니터링할 수 있습니다.
3. 쿠버네티스 프로브 설정
헬스 체크 엔드포인트를 활용하여 쿠버네티스의 프로브를 설정하겠습니다.
Deployment.yaml에 LivenessProbe 설정
Spring Actuator의 헬스 엔드포인트를 이용하여 설정합니다:
프로브 옵션 설명
initialDelaySeconds : 컨테이너가 시작된 후 처음으로 프로브를 실행하기까지 기다리는 시간을 설정. 주어진 시간(초) 동안 컨테이너가 초기화될 시간을 제공.
periodSeconds : 프로브 간격을 정의. 지정된 시간(초)마다 프로브가 주기적으로 수행.
timeoutSeconds : 프로브 요청이 응답을 기다리는 최대 시간을 설정. 지정된 시간(초) 내에 응답이 오지 않으면 프로브 실패로 간주.
successThreshold : 프로브가 성공으로 간주되기 위해 연속적으로 성공해야 하는 횟수를 설정.
failureThreshold : 프로브가 실패로 간주되기 위해 연속적으로 실패해야 하는 횟수를 설정
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-boot-app
spec:
replicas: 1
selector:
matchLabels:
app: spring-boot-app
template:
metadata:
labels:
app: spring-boot-app
spec:
containers:
- name: spring-boot-app
image: my-app-image
ports:
- containerPort: 8080
livenessProbe:
httpGet:
path: /actuator/health
port: 8081
initialDelaySeconds: 10
periodSeconds: 20
timeoutSeconds: 30
successThreshold: 1 # Liveness Probe와 Startup Probe의 경우 1
failureThreshold: 3
이렇게 Spring Actuator를 활용하여 간단하게 쿠버네티스 프로브를 설정함으로써, 애플리케이션의 가용성과 안정성을 높일 수 있습니다. 쿠버네티스의 셀프힐링 기능을 통해 운영 효율성을 대폭 끌어올릴 수 있는 기회를 놓치지 마세요!
마치며
쿠버네티스 프로브는 강력한 도구이지만, 지나치게 공격적인 설정은 불필요한 재시작과 시스템 불안정을 초래할 수 있습니다. 따라서 시스템의 실제 동작 환경과 요구사항을 면밀히 분석하여, 가장 적절하게 프로브를 구성하는 것이 필요합니다. 이렇게 사전 계획된 설정은 서비스의 가용성 및 안정성을 극대화하며, 최적의 운영 환경을 구축하는 데 기여할 것입니다.
고급지게 아키텍처를 설계하고 프로브를 효율적으로 활용함으로써, 셀프힐링의 진정한 가치를 실현하여 안정적인 서비스를 제공하는 데 큰 도움이 될 것입니다. 이 글을 통해 여러분에게 유익한 정보가 되었기를 바라며, 여러분의 업무에 많은 도움이 되길 희망합니다. 감사합니다.