kubernetes

Reconciliation

Reconciliation Pattern이란 현재 상태를 맞추기 위해 지속적으로 모니터링을 하는 것을 의미합니다. 쿠버네티스 컨셉을 이해하기 위해 먼저 Imperative System(명령형 시스템)과 Declarative System(선언적 시스템)에 대해 알아봅시다. 간단히 설명하면, 사용자의 명령을 통해 상태가 변화한다면 명령형이라고 할 수 있습니다. 반대로 특정 상태를 유지하기 위해 모니터링을 하는 것은 선언적이라고 표현합니다.

Imperative System(명령형 시스템)

대부분의 프로그램과 서비스가 명령형 시스템으로 이루어져 있습니다. 주로 사용하는 docker가 이러한 명령형 시스템입니다.

$ docker run nginx

위의 명령어를 보면 직관적으로 nginx를 실행해달라는 말임을 알 수 있고, 우리가 보편적으로 사용하는 방식임을 알 수 있습니다. 하지만 쿠버네티스는 선언적 시스템으로 작동합니다.

Declarative System(선언적 시스템)

사용자가 쿠버네티스에 스팩을 알려주면, 스펙을 모니터링하면서 Node와 Container상태를 변화시킵니다. 즉, 스팩을 쿠버네티스에 명령하는 것이 아니라, 스팩을 도달하는 방식은 쿠버네티스에 위임한다 것입니다. 예를 들면, 현재 컨테이너가 5개가 돌아가고 있다. 우리는 5개의 컨테이너를 3개로 줄이려고 합니다. 명령형 시스템으로 실행한다면, 5개중 2개의 컨테이너를 선택해서 삭제해!라고 프로그램에 명령을 하면 됩니다. 반대로 선언적 시스템으로 실행한다면, 컨테이너에 지정된 스펙을 5에서 3으로 변경하기만 하면, 쿠버네티스가 스스로 실행되는 컨테이너를 3개로 변경합니다.

Reconciliation의 의미는 모니터링과 조정의 의미를 가지고 있습니다. 쿠버네티스는 명령을 내리면 바로 반영하는 것이 아니라, 스펙과 관련된 명령을 받아 기록해둡니다. 그리고 모니터링으로 스펙과 현재 컨테이너의 상태를 지속적인 확인하며, 차이점 발생 시 동일하게 변경해 줍니다. 이러한 쿠버네티스의 컨셉이 주된 명령형 시스템과의 차이점이라고 할 수 있습니다.


Reconciliation 특징

  • Declarative (선언형) : 모든 동작이 선언적으로 이루어 집니다.
  • Idempotency (명등성) : 같은 정의를 여러 번 적용해도 항상 같은 결과를 도출합니다.
  • Consistency (일관성) : 쿠버네티스의 현재 상태나 동작과 관계 없이 최종 스텍에 상태를 맞춥니다.
  • Self-Healing (자가 회복) : 현재 상태에 예상하지 못한 불일치가 발생하더라도 스스로 이를 복구합니다.

애플리케이션 개발 시 이러한 쿠버네티스 환경에 맞는 애플리케이션을 만드는 것이 중요합니다. 갑자기 종료되거나 새롭게 실행되어도 큰 문제가 되지 않도록 만들어야합니다. 또한 호스트 갯수나 cpu/memory와 같은 리소스들을 적절하게 잘 셋팅해 두는 것이 중요합니다.

Self Healing

쿠버네티스에서 가장 강력한 기능으로, Reconciliation의 특징 중 하나입니다. etcd에 저장된 컨테이너의 상태로 자동으로 회복시켜주는 기능으로, 에러가 발생하여 컨테이너가 비정상이라면 컨테이너를 정상으로 교체해줍니다. 만약 갑자기 애플리케이션이 종료된다면, 애플리케이션을 다시 실행시켜줍니다. 사실 이러한 기능은 운영 환경에서 굉장히 유용하다고 할 수 있습니다.


정리

이러한 특징들을 잘 활용하여 Application을 만드는 것이 필요합니다. Application에서 장애가 발생한다면, 띄운 컨테이너를 지워버리면 쿠버네티스는 Reconciliaton한 특징으로 다시 Application을 실행합니다. 이는 사실상 restart와 동일한 기능이라고 볼 수 있습니다. 따라서 특정 장애의 경우에 서버가 멈추는 것보다 컨테이너가 재생성하여 다시 application을 실행하는 것이 더 좋은 판단이 될 수 있습니다. 이는 쿠버네티스가 관측하기 쉬운 Application을 만들어 장애를 최소화 할 수 있는 고민이 필요합니다. 또한, 이러한 특징으로 인해, Application 개발 시 갑자기 종료 시에 발생할 수 있는 데이터 유실에 대한 대응도 고민이 필요한 요소가 되었습니다.