엔지니어링

Kubernetes 통합 가시성 자습서: 메트릭 수집 및 분석

이 포스팅은 Kubernetes에서 실행되는 애플리케이션의 모든 측면을 모니터링할 수 있는 방법을 살펴보는 Kubernetes 통합 가시성 자습서 시리즈 중 두 번째로, 다음이 포함됩니다.

Elastic Observability를 사용하여 Metrics 앱과 즉시 사용 가능한 대시보드를 사용하여 Kibana에서 컨테이너 메트릭을 수집하고 분석하는 방법에 대해 다뤄보겠습니다.

Kubernetes에서 메트릭 수집

Kubernetes 로그의 대상이 이동하는 것과 비슷하게, Kubernetes에서 메트릭을 수집하는 것은 다음과 같은 몇 가지 이유로 어려운 작업이 될 수 있습니다.

  1. Kubernetes는 CPU, 메모리, 디스크 활용도, 디스크 및 네트워크 I/O와 같은 메트릭을 수집하여 모니터링해야 하는 다른 호스트에서 구성 요소를 실행합니다.
  2. 미니 VM의 일종인 Kubernetes 컨테이너도 자체 메트릭 세트를 생성합니다.
  3. 애플리케이션 서버와 데이터베이스 양쪽 모두 Kubernetes 포드로 실행될 수 있지만, 각 기술에는 관련 메트릭을 보고할 수 있는 고유한 방법이 있습니다.

기업은 종종 Kubernetes에서 메트릭 수집을 처리하기 위해 다수의 기술을 사용하며, 이는 Kubernetes 배포를 모니터링하는 작업을 더욱 복잡하게 만듭니다. 바로 이 부분에서 Elastic Observability는 로그, 메트릭, APM 데이터를 결합하여 하나의 도구를 사용해 통합된 가시성과 분석을 제공함으로써 판도를 바꾸어 놓습니다.

Metricbeat를 사용한 K8s 메트릭 수집

Filebeat와 유사하게, Metricbeat는 우리가 Kubernetes 클러스터에서 실행되는 포드의 다양한 메트릭뿐만 아니라 Kubernetes의 자체 클러스터 메트릭을 수집하는 데 사용할 유일한 구성 요소입니다. Metricbeat 모듈은 다양한 소스에서 메트릭을 추출하여 로그, 가동 시간, APM 데이터와 상호 연관될 준비가 된 ECS 호환 이벤트로 Elasticsearch에 전송할 수 있는 빠르고 쉬운 방법을 제공합니다. Metricbeat는 다음 두 가지 방법으로 Kubernetes에 동시에 배포됩니다.

  • Kubernetes 메트릭을 수집하기 위한 단일 포드. 이 포드는 클러스터 수준의 메트릭을 수집하기 위해 kube-state-metrics를 사용합니다.
  • Kubernetes 호스트당 하나의 인스턴스로 Metricbeat를 배포하여 해당 호스트에 배포된 포드로부터 메트릭을 수집하는 DaemonSet. Metricbeat는 kubelet API와 상호 작용하여 해당 호스트에서 구성 요소를 실행하도록 하고, 자동 탐지 등과 같은 다른 방법을 사용해 구성 요소를 추가로 조사하여 기술별 메트릭을 수집합니다.
시작하기 전에: 다음 자습서는 Kubernetes 환경 설정을 사용하는 것을 전제로 하고 있습니다. 나머지 활동을 실행할 수 있도록 데모 어플리케이션으로 단일 노드 Minikube 환경을 설정하는 과정을 단계별로 안내하는 보충 블로그를 만들었습니다.

호스트, Docker, Kubernetes 메트릭 수집

각 DaemonSet 인스턴스는 YAML config $HOME/k8s-o11y-workshop/metricbeat/metricbeat.yml에 정의된 대로 호스트, Docker, Kubernetes 메트릭을 수집합니다.

시스템(호스트) 메트릭 구성

system.yml: |-
  - module: system
    period: 10s
    metricsets:
      - cpu
      - load
      - memory
      - network
      - process
      - process_summary
      - core
      - diskio
      # - 소켓
    processes: ['.*']
    process.include_top_n:
      by_cpu: 5      # CPU별 상위 5개 프로세스 포함
      by_memory: 5   # 메모리별 상위 5개 프로세스 포함
  - module: system
    period: 1m
    metricsets:
      - filesystem
      - fsstat
    processors:
    - drop_event.when.regexp:
        system.filesystem.mount_point: '^/(sys|cgroup|proc|dev|etc|host|lib)($|/)'

Docker 메트릭 구성

docker.yml: |-
  - module: docker
    metricsets:
      - "container"
      - "cpu"
      - "diskio"
      - "event"
      - "healthcheck"
      - "info"
      # - "이미지"
      - "memory"
      - "network"
    hosts: ["unix:///var/run/docker.sock"]
    period: 10s
    enabled: true

Kubernetes 메트릭 구성

여기에는 kubelet API와 통신하여 호스트에 배포된 포드로부터 메트릭을 수집하는 것이 포함됩니다.

kubernetes.yml: |-
  - module: kubernetes
    metricsets:
      - node
      - system
      - pod
      - container
      - volume
    period: 10s
    host: ${NODE_NAME}
    hosts: ["localhost:10255"]
  - module: kubernetes
    metricsets:
      - proxy
    period: 10s
    host: ${NODE_NAME}
    hosts: ["localhost:10249"]

Metricbeat 모듈 및 metricsets 이면의 데이터에 대한 자세한 내용은 Metricbeat 설명서를 참조하세요.

Kubernetes 상태 메트릭 및 이벤트 수집

단일 인스턴스가 배포되어 Kubernetes 메트릭을 수집합니다. 이것은 Kube-state-metrics API와 통합되어 Kubernetes가 관리하는 객체의 상태 변화를 모니터링합니다. 다음은 state_metrics 수집을 정의하는 구성의 섹션입니다. $HOME/k8s-o11y-workshop/Metricbeat/Metricbeat.yml:

kubernetes.yml: |-
  - module: kubernetes
    metricsets:
      - state_node
      - state_deployment
      - state_replicaset
      - state_pod
      - state_container
      # k8s 이벤트를 얻으려면 이 주석 처리 제거:
      - event
    period: 10s
    host: ${NODE_NAME}
    hosts: ["kube-state-metrics:8080"]

포드 주석을 사용한 Metricbeat 자동 검색

Metricbeat DaemonSet 배포에는 포드에서 실행 중인 구성 요소를 자동 감지하고 특정 Metricbeat 모듈을 적용하여 기술별 메트릭을 수집할 수 있는 기능이 있습니다. 자동 검색을 활성화하는 방법 중 하나는 포드 주석을 사용하여 다른 모듈별 구성과 함께 적용할 모듈을 표시하는 것입니다. Metricbeat 구성의 이 섹션은 Kubernetes 기반 자동 검색을 가능하게 합니다. $HOME/k8s-o11y-workshop/metricbeat/metricbeat.yml:

metricbeat.autodiscover:
  providers:
   - type: kubernetes
     host: ${NODE_NAME}
     hints.enabled: true

이 자습서에는 힌트 기반 자동 검색을 사용하는 두 가지 구성 요소가 있습니다.

  • NGINX definition $HOME/k8s-o11y-workshop/nginx/nginx.yml
    template:
      metadata:
        labels:
          app: nginx
        annotations:
          co.elastic.metrics/module: nginx
          co.elastic.metrics/hosts: '${data.host}:${data.port}'
    	
  • MySQL definition $HOME/k8s-o11y-workshop/mysql/mysql.yml
    template:
      metadata:
        labels:
          app: mysql
        annotations:
          co.elastic.metrics/module: mysql
          co.elastic.metrics/hosts: 'root:petclinic@tcp(${data.host}:${data.port})/'
    	

힌트 기반 자동 검색에 대한 자세한 내용은 Metricbeat 설명서를 참조하세요.

Prometeus 스타일의 애플리케이션 메트릭 수집

우리의 Spring Boot petclinic 애플리케이션은 Prometheus가 스크래핑할 수 있는 형태로 표시된 애플리케이션별 메트릭의 전체 범위를 표시합니다. http://:30080/metrics/Prometheus에서 애플리케이션 http 엔드포인트로 이동하여 메트릭이 원시 형식으로 보고되는 방법을 확인할 수 있습니다. 그러나, 자습서에서는, 모든 통합 가시성 요구에 대해 Elastic 구성 요소를 사용한다는 정신에 따라 이러한 메트릭을 수집하기 위해 Metricbeat를 사용하겠습니다.

다음은 애플리케이션에서 보고하는 사항의 예입니다.

Prometheus 메트릭

그리고 다음은 Prometheus 모듈을 사용하여 Metricbeat에 이러한 메트릭을 수집하도록 지시하는 petclinic YAML 배포 구성의 힌트 구성입니다. $HOME/k8s-o11y-workshop/petclinic/petclinic.yml:

template:
  metadata:
    labels:
      app: petclinic
    annotations:
      co.elastic.metrics/module: prometheus
      co.elastic.metrics/hosts: '${data.host}:${data.port}'
      co.elastic.metrics/metrics_path: '/metrics/prometheus'
      co.elastic.metrics/period: 1m

일반적으로 Metricbeat는 Prometeus 서버를 모두 증가시키거나 교체할 수 있습니다. 이미 Prometeus 서버를 배포하고 사용 중인 경우, Metricbeat는 Prometeus Federation API를 사용하여 서버에서 메트릭을 내보낼 수 있으므로, 여러 Prometeus 서버, Kubernetes 네임스페이스 및 클러스터 전체에 걸쳐 가시성을 제공하여 로그, APM 및 가동 시간 이벤트와 Prometeus 메트릭의 상관 관계를 가능하게 합니다. 모니터링 아키텍처를 단순화하도록 선택한 경우, Metricbeat를 사용해 Prometeus 메트릭을 수집하여 바로 Elasticsearch로 전송하세요.

메타데이터 보강

Metricbeat에 의해 수집된 모든 이벤트는 다음 프로세서에 의해 보강됩니다. $HOME/k8s-o11y-workshop/metricbeat/metricbeat.yml:

processors:
  - add_cloud_metadata:
  - add_host_metadata:
  - add_kubernetes_metadata:
  - add_docker_metadata:

이를 통해 호스트, Kubernetes 포드, Docker 컨테이너 및 클라우드 서비스 제공자 인프라 메타데이터와 메트릭의 상관관계와 애플리케이션 성능 모니터링 데이터 및 로그와 같은 통합 가시성 퍼즐의 다른 부분들과의 상관관계가 가능해집니다.

Kibana의 메트릭

자습서의 Metricbeat 구성으로 Metrics 앱에서 다음을 볼 수 있습니다. 마음대로 클릭하여 검토해 보세요. Kibana에서 어디로 이동하든, 가는 곳마다 여러 가지 사항을 검색할 수 있는 검색 창이 있다는 것을 알 수 있습니다. 엄청나게 넓은 범위에서 특정 항목을 찾고 있을 때는 보기를 필터링하고 확대해 들여다 보는 것이 좋은 방법입니다. 자습서에서는 호스트가 한 개뿐이며 다음과 같습니다.

호스트 인프라 메트릭

Kibana의 호스트 메트릭

Docker 인프라 및 메트릭(테이블 보기)

데이터 테이블 보기의 호스트 메트릭

Kubernetes 인프라 및 메트릭

Kubernetes 인프라 및 메트릭

Metrics Explorer

Kibana의 Metrics Explorer

즉시 사용 가능한 Kibana 대시보드

Metricbeat는 단일 명령으로 클러스터에 쉽게 추가할 수 있는 미리 빌드된 다양한 Kibana 대시보드가 탑재되어 제공됩니다. 사용자는 이러한 대시보드를 그대로 사용하거나 필요에 따라 기본 제공 대시보드를 시작으로 사용자 정의 대시보드를 만들 수 있습니다. 다음은 자습서 환경의 데이터를 명확하게 표시하는 데 도움이 되는 대시보드입니다.

호스트

Kibana의 호스트 메트릭 대시보드

시스템

Kibana의 시스템 메트릭 대시보드

Docker

Kibana의 Docker 메트릭 대시보드

Kubernetes

Kibana의 Kubernetes 메트릭 대시보드

NGINX

Kibana의 NGINX 메트릭 대시보드

MySQL

Kibana의 MySQL 메트릭 대시보드

요약

이 파트에서는 Metricbeat를 사용하여 애플리케이션 및 Kubernetes 메트릭을 수집하는 방법을 살펴보았습니다. 지금 바로 시스템 및 인프라 모니터링을 시작할 수 있습니다. Elastic Cloud의 Elasticsearch Service 무료 체험판에 등록하거나 Elastic Stack을 다운로드하고 직접 호스팅하세요. 

일단 실행되면, 가동 시간 모니터링으로 호스트의 가용성을 모니터링하고 Elastic APM으로 호스트에서 실행 중인 애플리케이션을 계측하세요. 시스템에서 새 메트릭 클러스터와 완벽하게 통합된, 완전한 통합 가시성을 갖추는 작업을 계속 진행하세요. 어려운 상황에 부딪히거나 질문이 있으시면, 토론 포럼으로 오세요. 저희는 언제나 도와드리기 위해 기다리고 있습니다.

다음 단계: Elastic APM을 통한 애플리케이션 성능 모니터링