NodeExporter 用于采集一个Host上的各种性能指标,并且暴露给Prometheus 采集。因为NodeExporter需要采集每一个Host的数据状态,所以就产生了一个需求,在每一个K8s的机器上都要运行一个Pod, 而实现这个需求的K8s资源类型就叫做DaemonSet。

DaemonSet

DaemonSet的功能就是保证每个Node都运行Pod, 但是如果某个K8s的Node下线之后,对应的Pod也下线,还是保持每个Node一个Pod。如果新增一个Node,就会在新增的Node中增加一个Pod,保证所有的Node中有且只有一个当前Pod。

 1---
 2apiVersion: apps/v1
 3kind: DaemonSet
 4metadata:
 5  name: node-exporter
 6  namespace: kube-system
 7  labels:
 8    k8s-app: node-exporter
 9    kubernetes.io/cluster-service: "true"
10    addonmanager.kubernetes.io/mode: Reconcile
11    version: v1.2.2
12spec:
13  selector:
14    matchLabels:
15      k8s-app: node-exporter
16      version: v1.2.2
17  updateStrategy:
18    type: OnDelete
19  template:
20    metadata:
21      labels:
22        k8s-app: node-exporter
23        version: v1.2.2
24    spec:
25      priorityClassName: system-node-critical
26      containers:
27        - name: prometheus-node-exporter
28          image: "prom/node-exporter:v1.2.2"
29          imagePullPolicy: "IfNotPresent"
30          args:
31            - --path.procfs=/host/proc
32            - --path.sysfs=/host/sys
33          ports:
34            - name: metrics
35              containerPort: 9100
36              hostPort: 9100
37          volumeMounts:
38            - name: proc
39              mountPath: /host/proc
40              readOnly:  true
41            - name: sys
42              mountPath: /host/sys
43              readOnly: true
44          resources:
45            limits:
46              memory: 50Mi
47            requests:
48              cpu: 100m
49              memory: 50Mi
50      hostNetwork: true
51      hostPID: true
52      volumes:
53        - name: proc
54          hostPath:
55            path: /proc
56        - name: sys
57          hostPath:
58            path: /sys

NodeExporter是针对Node的Pod,需要将Host中的一些系统文件透传给Pod,并让Pod使用主机网络。

额外需求

虽然每个节点都运行一个Pod是一个确实存在的需求,但是有些时候,却又不是要求每个Node都有一个Pod。例如,有10台机器用于运行HDFS。 HDFS有NameNode和DataNode之分,那么DataNode可能是每个Host都要有的,但是NameNode却不是必须的,可能只要3-5台就可以了。这样一个明显的好处就是可以节约成本。

DaemonSet 也是支持Selector的,而且是NodeSelector,通过我们给Node加上一些Label,然后给NameNode加上一些DaemonSet的NodeSelector。

 1spec:
 2  selector:
 3    matchLabels:
 4      k8s-app: hdfs-namenode
 5  updateStrategy:
 6    type: OnDelete
 7  template:
 8    metadata:
 9      labels:
10        k8s-app: hdfs-namenode
11    spec:
12      # node selector
13      nodeSelector:
14        host: high-cpu

这样就保证了Pod只会在特定的Host中以DaemonSet的特性启动