节点信息收集(node_exporter)
为了能够采集集群中各个节点的资源使用情况,我们需要在各节点中部署一个Node Exporter实例。
这里就需要一种新的工作负载类型—守护进程集(DaemonSet);DaemonSet 可以保证集群中所有的或者部分的节点都能够运行同一份 Pod 副本,每当有新的节点被加入到集群时,Pod 就会在目标的节点上启动,如果节点被从集群中剔除,节点上的 Pod 也会被垃圾收集器清除;DaemonSet 的作用就像是计算机中的守护进程,它能够运行集群存储、日志收集和监控等『守护进程』,这些服务一般是集群中必备的基础服务。
创建DaemonSet服务:
vim prometheus-node-exporter.yml
kind: DaemonSet apiVersion: apps/v1 metadata: name: prometheus-node-exporter namespace: monitoring labels: app: prometheus component: node-exporter spec: selector: matchLabels: app: prometheus component: node-exporter template: metadata: labels: app: prometheus component: node-exporter release: v1.1.2 annotations: prometheus.io/port: '9100' prometheus.io/scrape: 'true' spec: volumes: - name: localtime hostPath: path: /etc/localtime type: '' - name: proc hostPath: path: /proc type: '' - name: sys hostPath: path: /sys type: '' - name: dockersock hostPath: path: /var/run/docker.sock type: '' containers: - name: prometheus-node-exporter image: 'prom/node-exporter:v1.1.2' args: - '--path.procfs=/host/proc' - '--path.sysfs=/host/sys' ports: - name: metrics hostPort: 9100 containerPort: 9100 protocol: TCP resources: limits: cpu: 200m memory: 200Mi requests: cpu: 100m memory: 128Mi volumeMounts: - name: proc readOnly: true mountPath: /host/proc - name: sys readOnly: true mountPath: /host/sys - name: localtime readOnly: true mountPath: /etc/localtime - name: dockersock readOnly: true mountPath: /var/run/docker.sock imagePullPolicy: IfNotPresent restartPolicy: Always serviceAccountName: prometheus serviceAccount: prometheus hostNetwork: true hostPID: true tolerations: - operator: Exists revisionHistoryLimit: 10
kubectl create -f prometheus-node-exporter.yml kubectl -n monitoring get daemonsets.apps
由于Node Exporter需要能够访问宿主机,因此这里指定了hostNetwork和hostPID,让Pod实例能够以主机网络以及系统进程的形式运行。
由于Node Exporter以主机网络运行,因为可以通过节点的IP加上Pod端口来访问节点上运行的node_exporter。
通过Pod采集 (pods演示)
通过Daemonset的形式将Node Exporter部署到了集群中的各个节点中。接下来,可以通过Prometheus的pod服务发现模式,找到当前集群中部署的Node Exporter实例即可。 需要注意的是,由于K8S中并非所有的Pod都提供了对Prometheus的支持,有些可能只是一些简单的用户应用,为了区分哪些Pod实例是可以供Prometheus进行采集的,上面我们为Node Exporter添加了注解:
annotations: prometheus.io/port: '9100' prometheus.io/scrape: 'true' prometheus.io/path: 'metrics'
通过注解来scrape区分Pod是否可以供Prometheus采集;通过port来指定提供采集的端口;通过path来指定采集路径(如果使用的是默认的 /metrics,可以不用明确指定)。
修改Prometheus配置文件,优化采集任务:
vim prometheus-config.yml
... - job_name: 'kubernetes-pods' kubernetes_sd_configs: - role: pod relabel_configs: - source_labels: - __meta_kubernetes_pod_annotation_prometheus_io_scrape action: keep regex: true - source_labels: - __address__ - __meta_kubernetes_pod_annotation_prometheus_io_port action: replace regex: ([^:]+)(?::\d+)?;(\d+) replacement: $1:$2 target_label: __address__ - source_labels: - __meta_kubernetes_pod_annotation_prometheus_io_path action: replace regex: (.+) target_label: __metrics_path__ - source_labels: - __meta_kubernetes_namespace action: replace target_label: kubernetes_namespace - source_labels: - __meta_kubernetes_pod_name action: replace target_label: kubernetes_pod tls_config: insecure_skip_verify: true
kubectl replace -f prometheus-config.yml kubectl -n monitoring delete pod prometheus-0
通过Pod模式自动发现的Node Exporter实例:
以上通过relabel过程实现对Pod实例的过滤,以及采集任务地址替换,从而实现对特定Pod实例监控指标的采集。需要说明的是kubernetes-pods并不是只针对Node Exporter而言,对于用户任意部署的Pod实例,只要其提供了对Prometheus的支持,用户都可以通过为Pod添加注解的形式为其添加监控指标采集的支持。
Node采集任务
上面是通过自动发现node_exporter的Pod来自动创建的采集,而实际情况中我们希望Pod采集的信息能跟Node节点信息分开。修改配置文件,定义node采集任务:
vim prometheus-config.yml
...
- job_name: 'kubernetes-nodes'
kubernetes_sd_configs:
- role: node
relabel_configs:
- source_labels:
- __meta_kubernetes_node_name
regex: (.+)
replacement: $1:9100
target_label: __address__
- source_labels: [instance]
target_label: node
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels:
- __meta_kubernetes_pod_annotation_prometheus_io_scrape
action: keep
regex: true
- source_labels:
- __meta_kubernetes_pod_name
action: drop
regex: prometheus-node-exporter-(.+)
- source_labels:
- __address__
- __meta_kubernetes_pod_annotation_prometheus_io_port
action: replace
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
target_label: __address__
- source_labels:
- __meta_kubernetes_pod_annotation_prometheus_io_path
action: replace
regex: (.+)
target_label: __metrics_path__
- source_labels:
- __meta_kubernetes_namespace
action: replace
target_label: kubernetes_namespace
- source_labels:
- __meta_kubernetes_pod_name
action: replace
target_label: kubernetes_pod
tls_config:
insecure_skip_verify: true
kubectl replace -f prometheus-config.yml curl -X POST http://172.16.220.143:30090/-/reload
这里将原先的kubernetes-nodes采集任务进行了配置,通过relabel修改节点的连接地址为node_exporter所监听的地址。同时在kubernetes-pods任务中,将prometheus-node-exporter开头的Pod从采集中去除。
查看配置应用后的结果:
kubernetes-nodes获取正常,而群集中没有其它提供采集的Pod,故不再有kubernetes-pods信息。