

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 监控
<a name="windows-monitoring"></a>

Prometheus [是一个 CNCF 毕业](https://www.cncf.io/projects/)项目，是迄今为止最受欢迎的监控系统，可以原生集成到 Kubernetes 中。Prometheus 收集有关容器、容器、节点和集群的指标。此外，Prometheus AlertsManager 利用它可以让你编程警报，在集群中出现问题时发出警告。Prometheus 将指标数据存储为由指标名称和指标对标识的时间序列数据。 key/value Prometheus 包括使用一种名为 PromQL 的语言进行查询的方法，该语言是 Prometheus 查询语言的缩写。

Prometheus 指标收集的高级架构如下所示：

![\[Prometheus 指标集\]](http://docs.aws.amazon.com/zh_cn/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 节点的主机硬件和操作系统指标，但它不适用于 Windows 节点。

在**带有 Windows 节点的混合节点 EKS 集群**[中，当你使用稳定的 Prometheus 头盔](https://github.com/prometheus-community/helm-charts)图表时，你会在 Windows 节点上看到 pod 出现故障，因为这个导出器不适用于 Windows。你需要单独处理 Windows 工作线程池，改为在 [Windows 工作节点组上安装 Windows 导出](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 防火墙中创建例外。如果安装程序在没有任何参数的情况下运行，则导出器将使用已启用的收集器、端口等的默认设置运行。

你可以查看本指南的**调度最佳实践**部分，该部分建议使用 taints/tolerations 或有选择地将节点导出器部署 RuntimeClass 到Linux节点，而Windows导出器是在你引导节点时安装在Windows节点上的，或者使用你选择的配置管理工具（例如chef、Ansible、SSM等）。

请注意，与节点导出器作为守护程序安装的 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 运算符] 的一部分，它为对象和控制器提供定义，控制器将激活 ServiceMonitors 我们定义的并自动生成所需的 Prometheus](https://github.com/prometheus-operator/kube-prometheus/releases) 配置。 ServiceMonitor 

声明性地指定了应如何监控 Kubernetes 服务组，用于定义您希望从 Kubernetes 中获取指标的应用程序。 ServiceMonitor在其中 ServiceMonitor 我们指定了 Kubernetes 标签，操作员可以使用这些标签来识别 Kubernetes 服务，该服务反过来识别我们想要监控的 Pod。

为了利用 ServiceMonitor，请创建一个指向特定 Windows 目标的 Endpoint 对象、一个无头服务和一个 ServiceMontor 用于 Windows 节点的无头服务。

```
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/)