

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 모니터링
<a name="windows-monitoring"></a>

[졸업된 CNCF 프로젝트](https://www.cncf.io/projects/)인 Prometheus는 Kubernetes에 기본적으로 통합되는 가장 인기 있는 모니터링 시스템입니다. Prometheus는 컨테이너, 포드, 노드 및 클러스터에 대한 지표를 수집합니다. 또한 Prometheus는 AlertsManager를 활용하여 클러스터에 문제가 있는 경우 경고를 프로그래밍할 수 있습니다. Prometheus는 지표 데이터를 지표 이름 및 키/값 페어로 식별되는 시계열 데이터로 저장합니다. Prometheus에는 Prometheus 쿼리 언어의 약어인 PromQL이라는 언어를 사용한 원격 쿼리가 포함되어 있습니다.

Prometheus 지표 컬렉션의 상위 수준 아키텍처는 다음과 같습니다.

![\[Prometheus 지표 컬렉션\]](http://docs.aws.amazon.com/ko_kr/eks/latest/best-practices/images/windows/prom.png)


Prometheus는 풀 메커니즘을 사용하고 내보내기를 사용하는 대상과 [kube 상태 지표를 사용하는 Kubernetes API에서 지표](https://github.com/kubernetes/kube-state-metrics)를 스크레이프합니다. 즉, 애플리케이션 및 서비스는 Prometheus 형식의 지표가 포함된 HTTP(S) 엔드포인트를 노출해야 합니다. 그러면 Prometheus는 구성에 따라 이러한 HTTP(S) 엔드포인트에서 지표를 주기적으로 가져옵니다.

내보내기를 사용하면 타사 지표를 Prometheus 형식의 지표로 사용할 수 있습니다. Prometheus 내보내기는 일반적으로 각 노드에 배포됩니다. 내보내기의 전체 목록은 Prometheus [내보내기](https://prometheus.io/docs/instrumenting/exporters/)를 참조하세요. [노드 내보내기](https://github.com/prometheus/node_exporter)는 Linux 노드의 호스트 하드웨어 및 OS 지표를 내보내는 데 적합하지만 Windows 노드에서는 작동하지 않습니다.

안정적인 [Prometheus helm 차트](https://github.com/prometheus-community/helm-charts)를 사용하는 경우 **Windows 노드가 있는 혼합 노드 EKS 클러스터**에서이 내보내기는 Windows용이 아니므로 Windows 노드에 실패한 포드가 표시됩니다. Windows 작업자 풀을 별도로 처리하고 대신 Windows 작업자 노드 그룹에 Windows [Exporter](https://github.com/prometheus-community/windows_exporter)를 설치해야 합니다.

Windows 노드에 대한 Prometheus 모니터링을 설정하려면 Windows 서버 자체에 WMI 내보내기를 다운로드하여 설치한 다음 Prometheus 구성 파일의 스크레이프 구성 내에 대상을 설정해야 합니다. [릴리스 페이지에서](https://github.com/prometheus-community/windows_exporter/releases)는 사용 가능한 모든 .msi 설치 프로그램과 각 기능 세트 및 버그 수정을 제공합니다. 설치 관리자는 Windows\$1exporter를 Windows 서비스로 설정하고 Windows 방화벽에서 예외를 생성합니다. 설치 관리자가 파라미터 없이 실행되는 경우, 활성화된 수집기, 포트 등에 대한 기본 설정으로 내보내기가 실행됩니다.

노드를 부트스트랩하거나 원하는 구성 관리 도구(예: Chef, Ansible, SSM 등)를 사용하여 Windows 노드에 Windows Exporter를 설치하는 동안 taints/tolerations 또는 RuntimeClass를 사용하여 linux 노드에만 선택적으로 배포하는 것을 제안하는이 가이드의 **예약 모범 사례** 섹션을 확인할 수 있습니다.

노드 내보내기가 데몬 세트 로 설치된 Linux 노드와 달리 Windows 노드에서는 WMI 내보내기가 호스트 자체에 설치됩니다. 내보내기 도구는 CPU 사용량, 메모리 및 디스크 I/O 사용량과 같은 지표를 내보내고 IIS 사이트 및 애플리케이션, 네트워크 인터페이스 및 서비스를 모니터링하는 데 사용할 수도 있습니다.

windows\$1exporter는 기본적으로 활성화된 수집기의 모든 지표를 노출합니다. 이는 오류를 방지하기 위해 지표를 수집하는 권장 방법입니다. 그러나 고급 사용의 경우 windows\$1exporter에 지표를 필터링하기 위한 선택적 수집기 목록을 전달할 수 있습니다. Prometheus 구성에서 collect[] 파라미터를 사용하면 됩니다.

Windows의 기본 설치 단계에는 필터링하려는 수집기와 같은 인수를 사용하여 부트스트래핑 프로세스 중에 서비스로 내보내기를 다운로드하고 시작하는 작업이 포함됩니다.

```
> Powershell Invoke-WebRequest https://github.com/prometheus-community/windows_exporter/releases/download/v0.13.0/windows_exporter-0.13.0-amd64.msi -OutFile <DOWNLOADPATH>

> msiexec /i <DOWNLOADPATH> ENABLED_COLLECTORS="cpu,cs,logical_disk,net,os,system,container,memory"
```

기본적으로 포트 9182의 /metrics 엔드포인트에서 지표를 스크레이프할 수 있습니다. 이때 Prometheus는 Prometheus 구성에 다음 scrape\$1config를 추가하여 지표를 사용할 수 있습니다.

```
scrape_configs:
    - job_name: "prometheus"
      static_configs:
        - targets: ['localhost:9090']
    ...
    - job_name: "wmi_exporter"
      scrape_interval: 10s
      static_configs:
        - targets: ['<windows-node1-ip>:9182', '<windows-node2-ip>:9182', ...]
```

를 사용하여 Prometheus 구성이 다시 로드됩니다.

```
> ps aux | grep prometheus
> kill HUP <PID>
```

대상을 추가하는 더 나은 권장 방법은 ServiceMonitor 객체에 대한 정의를 제공하고 필요한 [Prometheus 구성을 자동으로 빌드하는 컨트롤러와 ServiceMonitor 연산](https://github.com/prometheus-operator/kube-prometheus/releases)자]라는 사용자 지정 리소스 정의를 사용하는 것입니다. ServiceMonitor ServiceMonitors 

Kubernetes 서비스 그룹을 모니터링하는 방법을 선언적으로 지정하는 ServiceMonitor는 Kubernetes 내에서 지표를 스크레이프하려는 애플리케이션을 정의하는 데 사용됩니다. ServiceMonitor 내에서 운영자가 Kubernetes 서비스를 식별하는 데 사용할 수 있는 Kubernetes 레이블을 지정합니다. 그러면 모니터링하려는 포드가 식별됩니다.

ServiceMonitor를 활용하려면 특정 Windows 대상, 헤드리스 서비스 및 Windows 노드용 ServiceMontor를 가리키는 엔드포인트 객체를 생성합니다.

```
apiVersion: v1
kind: Endpoints
metadata:
  labels:
    k8s-app: wmiexporter
  name: wmiexporter
  namespace: kube-system
subsets:
- addresses:
  - ip: NODE-ONE-IP
    targetRef:
      kind: Node
      name: NODE-ONE-NAME
  - ip: NODE-TWO-IP
    targetRef:
      kind: Node
      name: NODE-TWO-NAME
  - ip: NODE-THREE-IP
    targetRef:
      kind: Node
      name: NODE-THREE-NAME
  ports:
  - name: http-metrics
    port: 9182
    protocol: TCP

---
apiVersion: v1
kind: Service ##Headless Service
metadata:
  labels:
    k8s-app: wmiexporter
  name: wmiexporter
  namespace: kube-system
spec:
  clusterIP: None
  ports:
  - name: http-metrics
    port: 9182
    protocol: TCP
    targetPort: 9182
  sessionAffinity: None
  type: ClusterIP

---
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor ##Custom ServiceMonitor Object
metadata:
  labels:
    k8s-app: wmiexporter
  name: wmiexporter
  namespace: monitoring
spec:
  endpoints:
  - interval: 30s
    port: http-metrics
  jobLabel: k8s-app
  namespaceSelector:
    matchNames:
    - kube-system
  selector:
    matchLabels:
      k8s-app: wmiexporter
```

운영자 및 ServiceMonitor 사용에 대한 자세한 내용은 공식 [운영자](https://github.com/prometheus-operator/kube-prometheus) 설명서를 확인하세요. Prometheus는 많은 [서비스 검색 옵션을 사용하여 동적 대상 검색을](https://prometheus.io/blog/2015/06/01/advanced-service-discovery/) 지원합니다.