Infrastructure/Kubernetes

[Basic] 쿠버네티스 모니터링

RoyOps 2024. 6. 9. 18:58

쿠버네티스 모니터링

쿠버네티스 모니터링 시스템

쿠버네티스 모니터링 개념

  • 시스템을 운영하는데 있어서 운영 관점에 있어서 가장 중요한 기능 중의 하나는 시스템에 대한 모니터링이다.
  • 시스템 자원의 사용량이나 에러 등에 대한 모니터링을 통해서 시스템을 안정적으로 운영하고 문제 발생 시 원인 파악과 대응이 가능하다.
  • 아래는 쿠버네티스 기반의 시스템 모니터링 대상이다.
    • 리소스: 리소스 모니터링은 클러스터와 애플리케이션 상태를 이해하기 위해 필수적이다.
    • 디스크: 임계치는 클러스터 사이즈와 상관이 없기 때문에 디스크 사용량을 모니터링하는 것은 디스크 볼륨을 모니터링 하는 것보다 더 효율적이다.
    • CPU: CPU 모니터링은 kube-state-metrics를 통해 가능하며 시스템, 사용자 사용량과 iowait 또한 모니터링 가능하다.
    • 메모리: 메모리 모니터링 또한 kube-state-metrics에서 가능하며 메모리 사용량 확인이 가능하다.
    • 파드: 파드 디플로이먼트의 상태는 쿠버네티스가 제대로 작동하는지 확인한다.
    • 네트워크: 네트워크 대역폭을 확인할 수 있다.

쿠버네티스 시스템 모니터링 4계층

  1. 호스트(노드)
    • 쿠버네티스 컨테이너를 실행하는 하드웨어 호스트, 즉 노드에 대한 지표 모니터링이 필요하다.
    • 노드의 CPU, 메모리, 디스크, 네트워크 사용량과 노드 OS와 커널에 대한 모니터링을 한다.
  2. 컨테이너
    • 노드에서 기동되는 각각의 컨테이너에 대한 정보를 확인할 수 있다.
    • 컨테이너의 CPU, 메모리, 디스크, 네트워크 사용량 등을 모니터링할 수 있다.
  3. 애플리케이션
    • 컨테이너안에서 구동되는 개별 애플리케이션의 지표를 모니터링한다.
    • 컨테이너에서 기동되는 애플리케이션의 응답시간, 에러 발생 빈도 등을 모니터링한다.
  4. 쿠버네티스
    • 컨테이너를 컨트롤하는 쿠버네티스 자체에 대한 모니터링을 한다.
    • 쿠버네티스의 자원인 서비스나 파드, 계정 정보 등을 모니터링한다.

모니터링 아키텍처

프로메테우스 기반 모니터링 아키텍처

  • 프로메테우스는 SoundCloud에서 개발된 모니터링 툴이다.
  • 2016년에 CNCF (Cloud Native Computing Foundation)에 오픈소스 프로젝트로 기부되었다.
  • 프로메테우스의 주요 기능으로는 시계열(timeseries) 데이터를 저장할 수 있는 다차원(multi-dimensional) 데이터 모델과 이 데이터 모델을 효과적으로 활용할 수 있는 PromQL이라는 쿼리 언어를 사용한다.
  • 수집대상을 정적으로 설정할 수도 있고 서비스 디스커버리(service discovery)를 통해서 동적으로 설정하는 것도 가능하다.
  • 데이터 저장은 디스크에 저장하는 것도 가능하지만 외부 스토리지에 저장하는 것도 가능하다.

  • 프로메테우스 서버: 시계열 데이터를 수집해서 저장하는 메인 컴포넌트다.
  • 클라이언트 라이브러리: 애플리케이션을 개발할 때 프로메테우스에서 데이터를 수집한다.
  • pushgateway: 클라이언트에서 직접 프로메테우스로 데이터 전송 시 송신한다.
  • 익스포터(exporter): 프로메테우스 클라이언트 라이브러리를 내장해서 만들어지지 않은 애플리케이션들에서 데이터를 수집한다.
  • 알럿매니저(AlertManager): 알람을 보낼 때 알람의 중복처리 그룹핑 등과 알람을 관리한다.
  • 더 자세한 내용은 프로메테우스 공식 문서를 참고한다.

모니터링 시스템 구축

데이터 수집 부분

  • 기본적으로 프로메테우스는 데이터 수집을 위해 PULLING 모델을 사용한다.
  • 모니터링 대상이 되는 자원이 지표 정보를 프로메테우스로 보내는 것이 아니라 프로메테우스가 주기적으로 모니터링 대상에서 지표를 읽는 모델을 사용한다.
  • 모니터링 대상이 프로메테우스의 데이터 포맷을 지원할 경우 바로 읽어올 수 있고 만약에 지원하지 않는다면 별도의 에이전트를 설치해서 지표를 읽어올 수 있는데 이를 exporter라고 한다.
  • mysql, nginx, redis와 같은 패키지는 미리 개발된 export가 있어서 다양한 서비스의 지표까지 쉽게 수집 가능하다.
  • 프로메테우스 클라이언트 라이브러리를 사용하게 되면 바로 지표를 프로메테우스 서버로 전송할 수 있다.
  • Pushgateway가 지표를 보관하고 있다가 프로메테우스 서버가 Pulling하면 저장된 지표 정보를 반환한다.

서비스 디스커버리

  • 모니터링 대상 목록을 유지하고 있고 대상에 대한 IP나 기타 접속 정보를 설정 파일에 주면 그 정보를 기반으로 프로메테우스 서버가 모니터링 정보를 수집한다.
  • 모니터링 대상이 등록되어 있는 저장소에서 목록을 받아서 그 대상을 모니터링하는 형태다.
  • DNS나 Consul, etcd와 같은 다양한 서비스 디스커버리 서비스와 연동을 통해서 자동으로 모니터링 대상의 목록을 수집할 수 있다.
- azure_sd_configs: Azure Service Discovery
- consul_sd_configs: Consul Service Discovery
- dns-sd-configs: DNS Service Discovery
- ec2_sd_configs: EC2 Service Discovery
- openstack_sd_configs: OpenStack Service Discovery
- file_sd_configs: File Service Discovery
- gce_sd_configs: GCE Service Discovery
- kubernetes_sd_configs: Kubernetes Service Discovery

저장 및 시각화

  • 수집된 지표 정보들은 프로메테우스 내부의 시계열 데이터베이스에 저장한다.
  • 프로메테우스 웹 콘솔을 이용하여 시각화되거나 또는 API를 외부에 제공해서 Grafana와 같은 시각화 툴을 통해서 지표를 시각화할 수 있다.

알림 서비스

  • 부가 기능 중의 하나로 alerting 컴포넌트는 지표에 대한 규칙을 설정하고 규칙을 위반할 경우에는 알림을 보낼 수 있는 기능이다.
  • 알림을 보내는 대상은 이메일이나 pagerduty와 같은 notification 서비스 등과 연동이 가능하다.

쿠버네티스 연동 아키텍처

  • 프로메테우스 서버가 모니터링할 리소스를 찾기 위해서 서비스 디스커버리(Service Dicovery) 메커니즘이 필요하다.
  • 쿠버네티스 API를 호출하고 자원들의 목록(Pod, Node, Service, Ingress, Endpoint 등)을 라벨 셀렉터를 이용하여 수집한다.
  • 수집된 모니터링 대상에 대해서 모니터링을 수행한다.
  • 쿠버네티스는 apiServer에서 /metric 이라는 URL을 통해서 기본적인 지표 정보를 반환한다.
  • 쿠버네티스 자원들에 대한 모니터링은 이 API를 통해서 수집한다.

  • 이미지는 쿠버네티스 연동 방식이며 자세한 내용은 여기를 참고한다.

프로메테우스 동작 구조