K8s DaemonSet
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的特性启动