14.13. 가상 머신의 사용자 정의 메트릭 노출

OpenShift Container Platform에는 핵심 플랫폼 구성 요소에 대한 모니터링을 제공하는 사전 구성된 사전 설치된 자체 업데이트 모니터링 스택이 포함되어 있습니다. 이 모니터링 스택은 Prometheus 모니터링 시스템을 기반으로 합니다. Prometheus는 시계열 데이터베이스이며 메트릭에 대한 규칙 평가 엔진입니다.

OpenShift Container Platform 모니터링 스택을 사용하는 것 외에도 CLI를 사용하여 사용자 정의 프로젝트에 대한 모니터링을 활성화하고 node-exporter 서비스를 통해 가상 머신에 대해 노출되는 사용자 정의 지표를 쿼리할 수 있습니다.

14.13.1. 노드 내보내기 서비스 구성

node-exporter 에이전트는 메트릭을 수집하려는 클러스터의 모든 가상 머신에 배포됩니다. 가상 머신과 연결된 내부 지표 및 프로세스를 노출하도록 node-exporter 에이전트를 서비스로 구성합니다.

사전 요구 사항

  • OpenShift Container Platform CLI oc를 설치합니다.
  • cluster-admin 권한이 있는 사용자로 클러스터에 로그인합니다.
  • openshift-monitoring 프로젝트에서 cluster-monitoring-config ConfigMap 오브젝트를 생성합니다.
  • enableUserWorkloadtrue 로 설정하여 openshift-user-workload-monitoring 프로젝트에서 user-workload-monitoring-config ConfigMap 오브젝트를 구성합니다.

절차

  1. Service YAML 파일을 생성합니다. 다음 예제에서는 파일을 node-exporter-service.yaml 이라고 합니다.

    kind: Service
    apiVersion: v1
    metadata:
      name: node-exporter-service 1
      namespace: dynamation 2
      labels:
        servicetype: metrics 3
    spec:
      ports:
        - name: exmet 4
          protocol: TCP
          port: 9100 5
          targetPort: 9100 6
      type: ClusterIP
      selector:
        monitor: metrics 7
    1
    가상 머신의 지표를 표시하는 node-exporter 서비스입니다.
    2
    서비스가 생성되는 네임스페이스입니다.
    3
    서비스의 레이블입니다. ServiceMonitor 는 이 라벨을 사용하여 이 서비스와 일치시킵니다.
    4
    ClusterIP 서비스의 포트 9100에서 메트릭을 노출하는 포트에 지정된 이름입니다.
    5
    node-exporter-service 가 요청을 수신 대기하는 데 사용하는 대상 포트입니다.
    6
    monitor 레이블로 구성된 가상 시스템의 TCP 포트 번호입니다.
    7
    가상 머신의 Pod와 일치하는 데 사용되는 레이블입니다. 이 예에서는 라벨이 monitor 인 가상 머신의 Pod와 값 지표 가 일치합니다.
  2. node-exporter 서비스를 생성합니다.

    $ oc create -f node-exporter-service.yaml

14.13.2. 노드 내보내기 서비스를 사용하여 가상 머신 구성

node-exporter 파일을 가상 머신에 다운로드합니다. 그런 다음 가상 머신이 부팅될 때 node-exporter 서비스를 실행하는 systemd 서비스를 생성합니다.

사전 요구 사항

  • 구성 요소의 Pod는 openshift-user-workload-monitoring 프로젝트에서 실행됩니다.
  • 이 사용자 정의 프로젝트를 모니터링해야 하는 사용자에게 monitoring-edit 역할을 부여합니다.

절차

  1. 가상 머신에 로그인합니다.
  2. node-exporter 파일의 버전에 적용되는 디렉터리 경로를 사용하여 가상 머신에 node-exporter 파일을 다운로드합니다.

    $ wget https://github.com/prometheus/node_exporter/releases/download/v1.3.1/node_exporter-1.3.1.linux-amd64.tar.gz
  3. 실행 파일을 추출하여 /usr/bin 디렉터리에 배치합니다.

    $ sudo tar xvf node_exporter-1.3.1.linux-amd64.tar.gz \
        --directory /usr/bin --strip 1 "*/node_exporter"
  4. 이 디렉터리 경로에 node_exporter.service 파일을 생성합니다. /etc/systemd/system. 이 systemd 서비스 파일은 가상 머신이 재부팅될 때 node-exporter 서비스를 실행합니다.

    [Unit]
    Description=Prometheus Metrics Exporter
    After=network.target
    StartLimitIntervalSec=0
    
    [Service]
    Type=simple
    Restart=always
    RestartSec=1
    User=root
    ExecStart=/usr/bin/node_exporter
    
    [Install]
    WantedBy=multi-user.target
  5. systemd 서비스를 활성화하고 시작합니다.

    $ sudo systemctl enable node_exporter.service
    $ sudo systemctl start node_exporter.service

검증

  • node-exporter 에이전트에서 가상 머신의 지표를 보고하는지 확인합니다.

    $ curl http://localhost:9100/metrics

    출력 예

    go_gc_duration_seconds{quantile="0"} 1.5244e-05
    go_gc_duration_seconds{quantile="0.25"} 3.0449e-05
    go_gc_duration_seconds{quantile="0.5"} 3.7913e-05

14.13.3. 가상 머신의 사용자 정의 모니터링 레이블 생성

단일 서비스에서 여러 가상 머신에 대한 쿼리를 활성화하려면 가상 머신의 YAML 파일에 사용자 지정 레이블을 추가합니다.

사전 요구 사항

  • OpenShift Container Platform CLI oc를 설치합니다.
  • cluster-admin 권한이 있는 사용자로 로그인합니다.
  • 웹 콘솔에 액세스하여 중지한 후 가상 머신을 재시작합니다.

절차

  1. 가상 머신 구성 파일의 template 사양을 편집합니다. 이 예에서 레이블 monitor 에는 값 메트릭이 있습니다.

    spec:
      template:
        metadata:
          labels:
            monitor: metrics
  2. 가상 머신을 중지하고 다시 시작하여 monitor 레이블에 지정된 레이블 이름으로 새 Pod를 생성합니다.

14.13.3.1. 메트릭에 대해 node-exporter 서비스 쿼리

지표는 /metrics 표준 이름 아래에 HTTP 서비스 끝점을 통해 가상 머신에 대해 노출됩니다. 메트릭을 쿼리할 때 Prometheus는 가상 머신에서 노출하는 지표 끝점에서 직접 메트릭을 스크랩하고 이러한 메트릭을 표시하도록 제공합니다.

사전 요구 사항

  • cluster-admin 권한 또는 monitoring-edit 역할의 사용자로 클러스터에 액세스할 수 있습니다.
  • node-exporter 서비스를 구성하여 사용자 정의 프로젝트에 대한 모니터링을 활성화했습니다.

절차

  1. 서비스의 네임스페이스를 지정하여 HTTP 서비스 끝점을 가져옵니다.

    $ oc get service -n <namespace> <node-exporter-service>
  2. node-exporter 서비스에 사용 가능한 모든 메트릭을 나열하려면 지표 리소스를 쿼리합니다.

    $ curl http://<172.30.226.162:9100>/metrics | grep -vE "^#|^$"

    출력 예

    node_arp_entries{device="eth0"} 1
    node_boot_time_seconds 1.643153218e+09
    node_context_switches_total 4.4938158e+07
    node_cooling_device_cur_state{name="0",type="Processor"} 0
    node_cooling_device_max_state{name="0",type="Processor"} 0
    node_cpu_guest_seconds_total{cpu="0",mode="nice"} 0
    node_cpu_guest_seconds_total{cpu="0",mode="user"} 0
    node_cpu_seconds_total{cpu="0",mode="idle"} 1.10586485e+06
    node_cpu_seconds_total{cpu="0",mode="iowait"} 37.61
    node_cpu_seconds_total{cpu="0",mode="irq"} 233.91
    node_cpu_seconds_total{cpu="0",mode="nice"} 551.47
    node_cpu_seconds_total{cpu="0",mode="softirq"} 87.3
    node_cpu_seconds_total{cpu="0",mode="steal"} 86.12
    node_cpu_seconds_total{cpu="0",mode="system"} 464.15
    node_cpu_seconds_total{cpu="0",mode="user"} 1075.2
    node_disk_discard_time_seconds_total{device="vda"} 0
    node_disk_discard_time_seconds_total{device="vdb"} 0
    node_disk_discarded_sectors_total{device="vda"} 0
    node_disk_discarded_sectors_total{device="vdb"} 0
    node_disk_discards_completed_total{device="vda"} 0
    node_disk_discards_completed_total{device="vdb"} 0
    node_disk_discards_merged_total{device="vda"} 0
    node_disk_discards_merged_total{device="vdb"} 0
    node_disk_info{device="vda",major="252",minor="0"} 1
    node_disk_info{device="vdb",major="252",minor="16"} 1
    node_disk_io_now{device="vda"} 0
    node_disk_io_now{device="vdb"} 0
    node_disk_io_time_seconds_total{device="vda"} 174
    node_disk_io_time_seconds_total{device="vdb"} 0.054
    node_disk_io_time_weighted_seconds_total{device="vda"} 259.79200000000003
    node_disk_io_time_weighted_seconds_total{device="vdb"} 0.039
    node_disk_read_bytes_total{device="vda"} 3.71867136e+08
    node_disk_read_bytes_total{device="vdb"} 366592
    node_disk_read_time_seconds_total{device="vda"} 19.128
    node_disk_read_time_seconds_total{device="vdb"} 0.039
    node_disk_reads_completed_total{device="vda"} 5619
    node_disk_reads_completed_total{device="vdb"} 96
    node_disk_reads_merged_total{device="vda"} 5
    node_disk_reads_merged_total{device="vdb"} 0
    node_disk_write_time_seconds_total{device="vda"} 240.66400000000002
    node_disk_write_time_seconds_total{device="vdb"} 0
    node_disk_writes_completed_total{device="vda"} 71584
    node_disk_writes_completed_total{device="vdb"} 0
    node_disk_writes_merged_total{device="vda"} 19761
    node_disk_writes_merged_total{device="vdb"} 0
    node_disk_written_bytes_total{device="vda"} 2.007924224e+09
    node_disk_written_bytes_total{device="vdb"} 0

14.13.4. 노드 내보내기 서비스에 대한 ServiceMonitor 리소스 생성

Prometheus 클라이언트 라이브러리를 사용하고 /metrics 끝점에서 메트릭을 스크랩하여 node-exporter 서비스에서 노출하는 지표에 액세스하고 볼 수 있습니다. ServiceMonitor CRD(사용자 정의 리소스 정의)를 사용하여 노드 내보내기 서비스를 모니터링합니다.

사전 요구 사항

  • cluster-admin 권한 또는 monitoring-edit 역할의 사용자로 클러스터에 액세스할 수 있습니다.
  • node-exporter 서비스를 구성하여 사용자 정의 프로젝트에 대한 모니터링을 활성화했습니다.

절차

  1. ServiceMonitor 리소스 구성에 대한 YAML 파일을 생성합니다. 이 예에서 서비스 모니터는 레이블 지표 와 모든 서비스와 일치하며 30초마다 exmet 포트를 쿼리합니다.

    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      labels:
        k8s-app: node-exporter-metrics-monitor
      name: node-exporter-metrics-monitor 1
      namespace: dynamation 2
    spec:
      endpoints:
      - interval: 30s 3
        port: exmet 4
        scheme: http
      selector:
        matchLabels:
          servicetype: metrics
    1
    ServiceMonitor 의 이름입니다.
    2
    ServiceMonitor 가 생성되는 네임스페이스입니다.
    3
    포트를 쿼리할 간격입니다.
    4
    30초마다 쿼리되는 포트의 이름입니다.
  2. node-exporter 서비스에 대한 ServiceMonitor 구성을 생성합니다.

    $ oc create -f node-exporter-metrics-monitor.yaml

14.13.4.1. 클러스터 외부에서 노드 내보내기 서비스 액세스

클러스터 외부에서 node-exporter 서비스에 액세스하고 노출된 메트릭을 볼 수 있습니다.

사전 요구 사항

  • cluster-admin 권한 또는 monitoring-edit 역할의 사용자로 클러스터에 액세스할 수 있습니다.
  • node-exporter 서비스를 구성하여 사용자 정의 프로젝트에 대한 모니터링을 활성화했습니다.

절차

  1. node-exporter 서비스를 노출합니다.

    $ oc expose service -n <namespace> <node_exporter_service_name>
  2. 경로에 대한 FQDN(완전화된 도메인 이름)을 가져옵니다.

    $ oc get route -o=custom-columns=NAME:.metadata.name,DNS:.spec.host

    출력 예

    NAME                    DNS
    node-exporter-service   node-exporter-service-dynamation.apps.cluster.example.org

  3. curl 명령을 사용하여 node-exporter 서비스에 대한 지표를 표시합니다.

    $ curl -s http://node-exporter-service-dynamation.apps.cluster.example.org/metrics

    출력 예

    go_gc_duration_seconds{quantile="0"} 1.5382e-05
    go_gc_duration_seconds{quantile="0.25"} 3.1163e-05
    go_gc_duration_seconds{quantile="0.5"} 3.8546e-05
    go_gc_duration_seconds{quantile="0.75"} 4.9139e-05
    go_gc_duration_seconds{quantile="1"} 0.000189423

14.13.5. 추가 리소스