Kubernetes에서 애플리케이션을 배포할 때 우리가 잊지 말아야 할 것이 하나 있습니다. 바로, ‘애플리케이션에 장애가 발생할 때 자동으로 조치될 수 있는가’인데요.
우리가 Kubernetes를 사용하는 이유 중 하나도 애플리케이션에 문제가 생겼을 때 재시작 등 다양한 방법으로 안정성을 확보할 수 있기 때문이죠.
이번 아티클에서는 Kubernetes에 배포된 애플리케이션에 안정성을 부여할 수 있는 다양한 방법을 계층별로 알아보겠습니다. Kubernetes에 내장된 자체 기능부터 Service Mesh까지 안정성 중심으로 살펴봅니다.
Kubernetes의 자체 Restart Policy와 Health Check
Kubernetes Pod의 spec.restartPolicy 필드에서는 컨테이너가 갑자기 종료될 때 어떻게 반응할지 정의할 수 있습니다. 이것을 Restart Policy(재시작 정책)라고 하는데요. 지정할 수 있는 정책은 3가지입니다.
Always: 컨테이너가 종료될 때마다 자동으로 재시작OnFailure: 컨테이너가 오류로 인해 종료(0이 아닌 상태값으로 종료)될 때만 재시작Never: 컨테이너가 종료되어도 재시작하지 않음
그리고 컨테이너에서 오류 발생 시 Kubernetes 내부에서는 아래와 같은 과정을 거칩니다.

- 최초 문제 발생: Kubernetes(정확히는 kubelet이라는 내부 컴포넌트)가
spec.restartPolicy에 정의된 대로 컨테이너 재시작 - 문제 반복 발생: 최초 문제 발생 이후부터 kubelet은 시스템 과부하를 막기 위해 Exponential Backoff 전략으로 컨테이너 재시작
- 예: 1초 후 재시작 → 2초 후 재시작 → 4초 후 재시작 → 8초 후 재시작
CrashLoopBackOff상태 진입: 컨테이너를 재시작해도 계속 문제가 발생하여 Exponential Backoff 전략으로 재시작이 반복(Loop)- Backoff 초기화: 컨테이너가 동작에 성공한 상태가 특정 기간 지속되면 kubelet이 Backoff를 초기화하며, 이후 발생하는 문제는 최초 문제로 간주됨
단순한 오류 발생 외에도 특정 조건을 충족하면 kubelet에게 컨테이너 상태에 문제가 발생했다고 알려주는 기능이 있습니다. 컨테이너의 상태 진단 Probe가 바로 그것인데요.
Probe의 대표적인 진단 수단은 exec와 httpGet입니다. exec는 컨테이너 내부에서 특정 명령어를 실행한 결과로 컨테이너의 상태를 진단하고, httpGet은 특정 포트번호와 경로로 해당 Pod IP에 대해 HTTP GET 요청으로 상태를 진단합니다.
Probe의 진단 결과는 총 3가지입니다.
- Success: 진단 성공
- Failure: 진단 실패
- Unknown: 진단 실패, Faliure와 달리 kubelet이 추가 진단 실행
그럼 Pod 내 컨테이너를 정의할 때 사용 가능한 Probe 타입 3가지를 알아보겠습니다.

1. Startup Probe
컨테이너가 성공적으로 시작(Startup)되었는지 진단하는 기능입니다. 특히 동작하는 데에 시간이 오래걸리는 컨테이너의 정상 가동 여부를 알아야 할 때 유용한데요.
Startup Probe가 컨테이너 실행 성공을 진단하기 전까지는 아래 두 가지 Probe가 실행되지 않는다는 특징이 있습니다. 컨테이너가 먼저 정상 실행되어야 컨테이너 상태를 진단할 수 있기 때문입니다.
컨테이너 내부에 특정 명령어를 실행하여 컨테이너가 시작되었음을 진단하는 Startup Probe는 아래 예시와 같이 정의할 수 있습니다.
# ...
spec:
containers:
- name: example-container
# ...
startupProbe:
exec:
command:
- cat
- /tmp/healthy
# ...2. Readiness Probe
컨테이너가 외부 트래픽을 받을 준비가 되었음(Readiness)을 진단하는 기능입니다. 즉, Pod를 거쳐 컨테이너로 트래픽이 들어오는 시점을 제어할 수 있는 거죠.
HTTP를 통해 외부 트래픽을 받을 준비가 되었는지 진단하는 Readiness Probe는 아래 예시와 같이 정의할 수 있겠습니다.
# ...
spec:
containers:
- name: example-container
# ...
readinessProbe:
httpGet:
path: /healthz
port: 8080
# ...3. Liveness Probe
컨테이너가 잘 작동 중(Liveness)인지 진단하는 기능입니다.
아까 위에서 컨테이너에 오류가 발생하면 kubelet이 자동으로 Restart Policy에 따라 컨테이너를 재시작한다고 했었죠. 그렇기 때문에 컨테이너 오류로 인한 재시작만 커버해야 할 경우에는 Liveness Probe가 꼭 필요한 것은 아닙니다.
하지만 Probe가 감지하는 특정 조건에 따라 컨테이너 종료나 재시작이 필요하다면 Liveness Probe를 사용할 수 있겠습니다.
특정 명령어 실행에 실패할 경우 kubelet에 해당 컨테이너가 동작 실패 중이라고 알려주는 Liveness Probe는 아래 예시와 같이 정의할 수 있습니다.
# ...
spec:
containers:
- name: example-container
# ...
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
# ...Service Mesh로 안정성 더하기 - Linkerd
Kubernetes 위에 배포된 서비스 관점에서의 안정성도 알아보겠습니다.
Service Mesh는 마이크로서비스 아키텍처에서 서비스 간 통신을 담당하게끔 설계된 인프라 계층입니다. 마이크로서비스 구조가 대세가 되면서 파편화된 서비스들을 안정적으로 운영할 필요가 생겼고, 각 서비스간의 통신의 보안과 안정성에 특히 집중한 것이 바로 Service Mesh인데요.
Service Mesh를 왜 써야 하고, 도입하면 어떤 이점이 있는지 더 자세히 설명한 아티클도 같이 확인해보시면 좋습니다 👉Linkerd로 가볍게 시작하는 Service Mesh
경량화된 Service Mesh로 유명한 Linkerd를 예로 들어 Kubernetes 애플리케이션의 안정성을 어떻게 높이는지 살펴보겠습니다.
Linkerd는 또다른 Service Mesh 툴인 Istio와 자주 비교되곤 합니다. 기능이 풍부한 Istio에 비해 핵심 기능에 집중하여 설계되었으므로 상대적으로 구조가 단순하고 이해하기 쉽다는 것이 Linkerd의 특징인데요.
즉, 상대적으로 설치 및 설정 과정이 간단하고 운영에 필요한 학습 곡선이 낮기 때문에 리소스가 제한적인 소규모 팀이나 스타트업이 Service Mesh를 처음 도입하는 경우, Linkerd를 채택하면 부담을 크게 줄일 수 있죠.
Linkerd가 어떤 툴인지 바로 파악할 수 있는 이미지를 살펴보겠습니다.

Linkerd는 위처럼 Kubernetes 클러스터에 배포된 각 서비스들의 현황을 집계해서 보여줍니다. 각 서비스로 들어오는 요청이 잘 처리되고 있는지(Success Rate), 초당 얼만큼 요청이 들어오는지(RPS), 요청처리는 각 백분위별로 얼마나 걸리는지(P— Latency)를 지표로 나타내주기 때문에 현재 동작 중인 서비스가 잘 동작 중인지 세세하게 확인할 수 있습니다.
이런 Linkerd가 Kubernetes에 배포된 서비스의 안정성을 높이는 방법은 바로, 요청 재시도와 타임아웃 기능입니다.

일시적인 네트워크 문제나 서비스 과부하로 인해 발생하는 간헐적인 요청 실패는 시스템 전체의 안전성을 저해할 수 있습니다.
그래서 Linkerd는 HTTPRoute(Kubernetes Gateway API)이라는 리소스를 통해, 특정 서비스나 경로에 대해 자동으로 요청을 재시도하거나 응답 대기 시간(타임아웃)을 설정하는 기능을 제공하는데요. 이로 인해 애플리케이션 코드 수정 없이도 서비스 간 통신의 신뢰성을 향상시킬 수 있는 것이죠.
Linkerd를 직접 설치하고 주요 기능을 사용해보고 싶어지셨나요? minikube 환경에서 쉽게 따라할 수 있도록 정리한 👉Linkerd 핵심 기능 실습 가이드를 확인해보세요!
마무리
Kubernetes에선 애플리케이션(서비스)의 안정성을 위한 방법이 참 다양합니다. 물론 이번 아티클에서 다룬 기능을 사용하지 않았다고 해서 운영에 실패한 것은 아닙니다.
중요한 것은, ‘우리 서비스를 더 안정적으로 운영하려면 어떻게 해야 할까?‘라는 질문에 대해 고민하는 것이라고 생각합니다.
그리고 이런 고민을 하는 과정에서 제가 소개해드린 방법들이 선택지로 활용될 수 있다면, 그것만으로도 큰 의미가 있고 이 아티클이 줄 수 있는 효용가치일 것입니다.
이번 아티클도 읽어주셔서 감사합니다😸