Victormetrics
Victormetrics
目录
[toc]
1、单节点
1.简介
VictoriaMetrics(VM)是一个支持高可用、经济高效且可扩展的监控解决方案和时间序列数据库,可用于 Prometheus 监控数据做长期远程存储。
前面章节我们介绍了 Thanos 方案也可以用来解决 Prometheus 的高可用和远程存储的问题,那么为什么我们还要使用 VictoriaMetrics 呢?
相对于 Thanos,VictoriaMetrics 主要是一个可水平扩容的本地全量持久化存储方案,VictoriaMetrics 不仅仅是时序数据库,它的优势主要体现在一下几点。(Thanos:它不是做本地全量的,其很多数据都是存储在oss上的。)
- 对外支持 Prometheus 相关的 API,可 以直接用于 Grafana 作为 Prometheus 数据源使用
- 指标数据摄取和查询具备高性能和良好的可扩展性,性能比 InfluxDB 和 TimescaleDB 高出 20 倍
- 在处理高基数时间序列时,内存方面也做了优化,比 InfluxDB 少 10x 倍,比 Prometheus、Thanos 或 Cortex 少 7 倍
- 高性能的数据压缩方式,与 TimescaleDB 相比,可以将多达 70 倍的数据点存入有限的存储空间,与 Prometheus、Thanos 或 Cortex 相比,所需的存储空间减少 7 倍
- 它针对具有高延迟 IO 和低 IOPS 的存储进行了优化
- 提供全局的查询视图,多个 Prometheus 实例或任何其他数据源可能会将数据摄取到 VictoriaMetrics
- 操作简单
- VictoriaMetrics 由一个没有外部依赖的小型可执行文件组成
- 所有的配置都是通过明确的命令行标志和合理的默认值完成的
- 所有数据都存储在 - storageDataPath 命令行参数指向的目录中
- 可以使用
vmbackup/vmrestore
工具轻松快速地从实时快照备份到 S3 或 GCS 对象存储中
- 支持从第三方时序数据库获取数据源
- 由于存储架构,它可以保护存储在非正常关机(即 OOM、硬件重置或 kill -9)时免受数据损坏
- 同样支持指标的 relabel 操作
2.架构
VM 分为单节点和集群两个方案,根据业务需求选择即可。
单节点版直接运行一个二进制文件既,官方建议采集数据点(data points)低于 100w/s,推荐 VM 单节点版,简单好维护,但不支持告警。
集群版支持数据水平拆分。
下图是 VictoriaMetrics
集群版官方的架构图。
注意
vmselect这里是有配置一个缓存的,当然你可以用StatefuleSet的pvc把缓存持久化下来。这里就使用无状态服务的Deployment的emptyDir了。
主要包含以下几个组件:
vmstorage
:数据存储以及查询结果返回,默认端口为 8482vminsert
:数据录入,可实现类似分片、副本功能,默认端口 8480vmselect
:数据查询,汇总和数据去重,默认端口 8481vmagent
:数据指标抓取,支持多种后端存储,会占用本地磁盘缓存,默认端口 8429vmalert
:报警相关组件,如果不需要告警功能可以不使用该组件,默认端口为 8880
集群方案把功能拆分为 vmstorage、 vminsert、vmselect 组件,如果要替换 Prometheus,还需要使用 vmagent、vmalert。从上图也可以看出 vminsert 以及 vmselect 都是无状态的,所以扩展很简单,只有 vmstorage 是有状态的。
vmagent
的主要目的是用来收集指标数据然后存储到 VM 以及 Prometheus 兼容的存储系统中(支持 remote_write 协议即可)。
下图是 vmagent 的一个简单架构图,可以看出该组件也实现了 metrics 的 push 功能,此外还有很多其他特性:
- 替换 prometheus 的 scraping target
- 支持基于 prometheus relabeling 的模式添加、移除、修改 labels,可以方便在数据发送到远端存储之前进行数据的过滤
- 支持多种数据协议,influx line 协议,graphite 文本协议,opentsdb 协议,prometheus remote write 协议,json lines 协议,csv 数据
- 支持收集数据的同时,并复制到多种远端存储系统
- 支持不可靠远端存储(通过本地存储
-remoteWrite.tmpDataPath
),同时支持最大磁盘占用 - 相比 prometheus 使用较少的内存、cpu、磁盘 io 以及网络带宽
接下来我们就分别来介绍了 VM 的单节点和集群两个方案的使用。
3.单节点
💘 实战:vm单节点安装及使用(测试成功)-2022.7.24
这里我们采集 node-exporter 为例进行说明,首先使用 Prometheus 采集数据,然后将 Prometheus 数据远程写入 VM 远程存储。
由于 VM 提供了 vmagent
组件,最后我们使用 VM 来完全替换 Prometheus,可以使架构更简单、更低的资源占用。🤣
实验环境
实验环境:1、win10,vmwrokstation虚机;2、k8s集群:3台centos7.61810虚机,1个master节点,2个node节点k8sversion:v1.22.2containerd:namespace/kube-vmcreated
2.创建DaemonSet 类型的node-exporter
- 首先我们这
kube-vm
命名空间下面使用 DaemonSet 控制器运行 node-exporter,对应的资源清单文件如下所示:
[root@master1 ~]#mkdir vm
[root@master1 ~]#cd vm
[root@master1 vm]#vim vm-node-exporter.yaml
# vm-node-exporter.yamlapiVersion:apps/v1kind:DaemonSetmetadata:name:node-exporternamespace:kube-vmspec:selector:matchLabels:app:node-exportertemplate:metadata:labels:app:node-exporterspec:hostPID:truehostIPC:truehostNetwork:true#注意这里是hostNetwork方式nodeSelector:kubernetes.io/os:linuxcontainers:- name:node-exporterimage:prom/node-exporter:v1.3.1args:- --web.listen-address=$(HOSTIP):9111#这里修改监听端口为9111- --path.procfs=/host/proc- --path.sysfs=/host/sys- --path.rootfs=/host/root- --no-collector.hwmon# 禁用不需要的一些采集器- --no-collector.nfs- --no-collector.nfsd- --no-collector.nvme- --no-collector.dmi- --no-collector.arp- --collector.filesystem.ignored-mount-points=^/(dev|proc|sys|var/lib/containerd/.+|/var/lib/docker/.+|var/lib/kubelet/pods/.+)($|/)- --collector.filesystem.ignored-fs-types=^(autofs|binfmt_misc|cgroup|configfs|debugfs|devpts|devtmpfs|fusectl|hugetlbfs|mqueue|overlay|proc|procfs|pstore|rpc_pipefs|securityfs|sysfs|tracefs)$ports:- containerPort:9111env:- name:HOSTIPvalueFrom:fieldRef:fieldPath:status.hostIPresources:requests:cpu:150mmemory:180Milimits:cpu:150mmemory:180MisecurityContext:runAsNonRoot:truerunAsUser:65534volumeMounts:- name:procmountPath:/host/proc- name:sysmountPath:/host/sys- name:rootmountPath:/host/rootmountPropagation:HostToContainerreadOnly:truetolerations:# 添加容忍- operator:"Exists"volumes:- name:prochostPath:path:/proc- name:devhostPath:path:/dev- name:syshostPath:path:/sys- name:roothostPath:path:/
由于前面章节中我们也创建了 node-exporter,为了防止端口冲突,这里我们使用参数 --web.listen-address=$(HOSTIP):9111
配置端口为 9111
。
- 直接应用上面的资源清单即可。
[root@master1 vm]#kubectl apply -f vm-node-exporter.yaml daemonset.apps/node-exportercreated[root@master1 vm]#kubectl get po -owide -nkube-vmNAMEREADYSTATUSRESTARTSAGEIPNODENOMINATEDNODEREADINESSGATESnode-exporter-56p881/1Running012s172.29.9.51master1<none><none>node-exporter-bjk821/1Running012s172.29.9.53node2<none><none>node-exporter-wnwgt1/1Running012s172.29.9.52node1<none><none>
3.重新部署一套独立的 Prometheus
然后重新部署一套独立的 Prometheus,为了简单我们直接使用 static_configs
静态配置方式来抓取 node-exporter 的指标,配置清单如下所示:
- 创建p8s的ConfigMap资源对象:
[root@master1 vm]#pwd
/root/vm
[root@master1 vm]#vim vm-prom-config.yaml
# vm-prom-config.yamlapiVersion:v1kind:ConfigMapmetadata:name:prometheus-confignamespace:kube-vmdata:prometheus.yaml:|global:scrape_interval:15sscrape_timeout:15sscrape_configs:- job_name:"nodes"static_configs:- targets:['172.29.9.51:9111','172.29.9.52:9111','172.29.9.53:9111']relabel_configs:# 通过 relabeling 从 __address__ 中提取 IP 信息,为了后面验证 VM 是否兼容 relabeling- source_labels:[__address__]regex:"(.*):(.*)"replacement:"${1}"target_label:'ip'action:replace
上面配置中通过 relabel
操作从 __address__
中将 IP 信息提取出来,后面可以用来验证 VM 是否兼容 relabel
操作。
- 对p8s做数据持久化:
同样要给 Prometheus 数据做持久化,所以也需要创建一个对应的 PVC 资源对象:
先到node2节点上创建下本地目录:
[root@master1 ~]#cd vm[root@master1 vm]#ssh node2Lastlogin:SatJul2311:55:592022frommaster1[root@node2 ~]#mkdir -p /data/k8s/prometheus[root@node2 ~]#exitlogoutConnectiontonode2closed.
[root@master1 vm]#vim vm-prom-pvc.yaml
# apiVersion:storage.k8s.io/v1# kind:StorageClass# metadata:# name:local-storage# provisioner:kubernetes.io/no-provisioner# volumeBindingMode:WaitForFirstConsumer---apiVersion:v1kind:PersistentVolumemetadata:name:prometheus-dataspec:accessModes:- ReadWriteOncecapacity:storage:20GistorageClassName:local-storagelocal:path:/data/k8s/prometheuspersistentVolumeReclaimPolicy:RetainnodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key:kubernetes.io/hostnameoperator:Invalues:- node2---apiVersion:v1kind:PersistentVolumeClaimmetadata:name:prometheus-datanamespace:kube-vmspec:accessModes:- ReadWriteOnceresources:requests:storage:20GistorageClassName:local-storage
- 然后直接创建 Prometheus 即可,将上面的 PVC 和 ConfigMap 挂载到容器中,通过
--config.file
参数指定配置文件文件路径,指定 TSDB 数据路径等,资源清单文件如下所示:
[root@master1 vm]#vim vm-prom-deploy.yaml
# vm-prom-deploy.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:prometheusnamespace:kube-vmspec:selector:matchLabels:app:prometheustemplate:metadata:labels:app:prometheusspec:volumes:- name:datapersistentVolumeClaim:claimName:prometheus-data- name:config-volumeconfigMap:name:prometheus-configcontainers:- image:prom/prometheus:v2.35.0name:prometheusargs:- "--config.file=/etc/prometheus/prometheus.yaml"- "--storage.tsdb.path=/prometheus"# 指定tsdb数据路径- "--storage.tsdb.retention.time=2d"- "--web.enable-lifecycle"# 支持热更新,直接执行localhost:9090/-/reload立即生效ports:- containerPort:9090name:httpsecurityContext:runAsUser:0volumeMounts:- mountPath:"/etc/prometheus"name:config-volume- mountPath:"/prometheus"name:data---apiVersion:v1kind:Servicemetadata:name:prometheusnamespace:kube-vmspec:selector:app:prometheustype:NodePortports:- name:webport:9090targetPort:http
- 直接应用上面的资源清单即可。
[root@master1 vm]#kubectl apply -f vm-prom-config.yaml configmap/prometheus-configcreatedservice/prometheuscreated[root@master1 vm]#kubectl apply -f vm-prom-pvc.yamlpersistentvolume/prometheus-datacreatedpersistentvolumeclaim/prometheus-datacreated[root@master1 vm]#kubectl apply -f vm-prom-deploy.yaml deployment.apps/prometheuscreated[root@master1 vm]#kubectl get pvNAMECAPACITYACCESSMODESRECLAIMPOLICYSTATUSCLAIMSTORAGECLASSREASONAGEgrafana-local2GiRWORetainBoundmonitor/grafana-pvclocal-storage80dprometheus-data20GiRWORetainBoundkube-vm/prometheus-datalocal-storage8m34sprometheus-local20GiRWORetainBoundmonitor/prometheus-datalocal-storage84dpv0011GiRWORetainTerminatingdefault/www-web-0251dpv0021GiRWORetainTerminatingdefault/www-web-1251d[root@master1 vm]#kubectl get pvc -nkube-vmNAMESTATUSVOLUMECAPACITYACCESSMODESSTORAGECLASSAGEprometheus-dataBoundprometheus-data20GiRWOlocal-storage8m40s[root@master1 vm]#kubectl get po -owide -nkube-vmNAMEREADYSTATUSRESTARTSAGEIPNODENOMINATEDNODEREADINESSGATESnode-exporter-56p881/1Running04h40m172.29.9.51master1<none><none>node-exporter-bjk821/1Running04h40m172.29.9.53node2<none><none>node-exporter-wnwgt1/1Running04h40m172.29.9.52node1<none><none>prometheus-dfc9f6-l59mw1/1Running06m13s10.244.2.225node2<none><none>[root@master1 vm]#kubectl get svc -nkube-vmNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S) AGEprometheusNodePort10.103.243.22<none>9090:30832/TCP6m21s[root@master1 vm]#
- 部署完成后可以通过
http:apiVersion:v1kind:ServiceAccount#创建一个ServiceAccountmetadata:name:prometheusnamespace:kube-vm---apiVersion:rbac.authorization.k8s.io/v1kind:ClusterRolemetadata:name:prometheusrules:- apiGroups:- ""resources:- nodes- services- endpoints- pods- nodes/proxyverbs:- get- list- watch- apiGroups:- "extensions"resources:- ingressesverbs:- get- list- watch- apiGroups:- ""resources:- configmaps- nodes/metricsverbs:- get- nonResourceURLs:- /metricsverbs:- get---apiVersion:rbac.authorization.k8s.io/v1kind:ClusterRoleBindingmetadata:name:prometheusroleRef:apiGroup:rbac.authorization.k8s.iokind:ClusterRolename:prometheussubjects:- kind:ServiceAccountname:prometheusnamespace:monitor- kind:ServiceAccountname:prometheusnamespace:kube-vm
这里直接在原来那个yaml里更新,或者重新创建一个就好吧。
这边可以先不创建,先当做遗留问题就好。
经测试,先不创建这个rbac资源,p8s是可以正常起来的。
哈哈,老师解惑了:
问题:我们这里是不是没配置rbac,p8s也是可以访问的呢?
答案:
因为目前只是p8s静态地去把数据抓取过来的,而不是自动发现的(不是用过apiserver去访问的)。所以现在,我们没有配置rbac是没有任何问题的。
疑问2:这里的local-storage只是一个标识而已的吧?(已解决)
按老师说的,这里要重新创建一个sc呀……
注意:
但是自己之前的实验这里都是没创建local-storage的sc呀……
个人预测结论:
这里的local-storage只是一个标识而已,不需要来创建。!!!
经测试:
我的k8s集群里未创建这个local-storage sc,也是可以正常使用pv/pvc的。因此,这里的storageClassName:local-storage
只是一个标识而已。
- 结论
storageClassName这里只是一个标识而已!!!
4.以同样的方式重新部署 Grafana
- 先到node2节点上创建下本地目录:
[root@master1 vm]#ssh node2Lastlogin:SatJul2316:14:212022frommaster1[root@node2 ~]#mkdir -p /data/k8s/grafana[root@node2 ~]#exitlogoutConnectiontonode2closed.
- 同样的方式重新部署 Grafana,资源清单如下所示:
[root@master1 vm]#vim vm-grafana.yaml
# vm-grafana.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:grafananamespace:kube-vmspec:selector:matchLabels:app:grafanatemplate:metadata:labels:app:grafanaspec:volumes:- name:storagepersistentVolumeClaim:claimName:grafana-datacontainers:- name:grafanaimage:grafana/grafana:mainimagePullPolicy:IfNotPresentports:- containerPort:3000name:grafanasecurityContext:runAsUser:0env:- name:GF_SECURITY_ADMIN_USERvalue:admin- name:GF_SECURITY_ADMIN_PASSWORDvalue:admin321volumeMounts:- mountPath:/var/lib/grafananame:storage---apiVersion:v1kind:Servicemetadata:name:grafananamespace:kube-vmspec:type:NodePortports:- port:3000selector:app:grafana---apiVersion:v1kind:PersistentVolumemetadata:name:grafana-dataspec:accessModes:- ReadWriteOncecapacity:storage:1GistorageClassName:local-storagelocal:path:/data/k8s/grafanapersistentVolumeReclaimPolicy:RetainnodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key:kubernetes.io/hostnameoperator:Invalues:- node2---apiVersion:v1kind:PersistentVolumeClaimmetadata:name:grafana-datanamespace:kube-vmspec:accessModes:- ReadWriteOnceresources:requests:storage:1GistorageClassName:local-storage
- 部署
[root@master1 vm]#kubectl apply -f vm-grafana.yaml deployment.apps/grafanacreatedservice/grafanacreatedpersistentvolume/grafana-datacreatedpersistentvolumeclaim/grafana-datacreated
- 查看
- 同样通过
http:Lastlogin:WedMay419:51:382022frommaster1[root@node1 ~]#mkdir -p /data/k8s/vm
[root@master1 vm]#vim vm.yaml
# vm.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:victoria-metricsnamespace:kube-vmspec:selector:matchLabels:app:victoria-metricstemplate:metadata:labels:app:victoria-metricsspec:volumes:- name:storagepersistentVolumeClaim:claimName:victoria-metrics-datacontainers:- name:vmimage:victoriametrics/victoria-metrics:v1.76.1imagePullPolicy:IfNotPresentargs:- -storageDataPath=/var/lib/victoria-metrics-data- -retentionPeriod=1w#默认一个月ports:- containerPort:8428name:httpvolumeMounts:- mountPath:/var/lib/victoria-metrics-dataname:storage---apiVersion:v1kind:Service#vm还附带了一个web服务,类似于p8s的那个web界面,方便我们操作。metadata:name:victoria-metricsnamespace:kube-vmspec:type:NodePortports:- port:8428selector:app:victoria-metrics---apiVersion:v1kind:PersistentVolumemetadata:name:victoria-metrics-dataspec:accessModes:- ReadWriteOncecapacity:storage:20GistorageClassName:local-storagelocal:path:/data/k8s/vm#必须先创建这个路径persistentVolumeReclaimPolicy:RetainnodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key:kubernetes.io/hostnameoperator:Invalues:- node2---apiVersion:v1kind:PersistentVolumeClaimmetadata:name:victoria-metrics-datanamespace:kube-vmspec:accessModes:- ReadWriteOnceresources:requests:storage:20GistorageClassName:local-storage
这里我们使用 -storageDataPath
参数指定了数据存储目录,然后同样将该目录进行了持久化,-retentionPeriod
参数可以用来配置数据的保持周期。
- 直接应用上面的资源清单即可。
[root@master1 vm]#kubectl apply -f vm.yaml deployment.apps/victoria-metricscreatedservice/victoria-metricscreatedpersistentvolume/victoria-metrics-datacreatedpersistentvolumeclaim/victoria-metrics-datacreated[root@master1 vm]#kubectl get deploy,svc,pod -n kube-vmNAMEREADYUP-TO-DATEAVAILABLEAGEdeployment.apps/grafana1/11116hdeployment.apps/prometheus1/11117hdeployment.apps/victoria-metrics1/1115m1sNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S) AGEservice/grafanaNodePort10.102.169.155<none>3000:30868/TCP16hservice/prometheusNodePort10.103.243.22<none>9090:30832/TCP17hservice/victoria-metricsNodePort10.111.174.185<none>8428:31526/TCP5m1sNAMEREADYSTATUSRESTARTSAGEpod/grafana-bbd99dc7-gjwxk1/1Running016hpod/node-exporter-56p881/1Running021hpod/node-exporter-bjk821/1Running021hpod/node-exporter-wnwgt1/1Running021hpod/prometheus-dfc9f6-l59mw1/1Running017hpod/victoria-metrics-7b5b5d4b65-zthq91/1Running02m14s[root@master1 vm]#kubectl logs -f victoria-metrics-7b5b5d4b65-zthq9 -nkube-vm2022-07-24T01:37:50.461ZinfoVictoriaMetrics/lib/mergeset/table.go:257openingtable"/var/lib/victoria-metrics-data/indexdb/1704A027396769B6"...2022-07-24T01:37:50.462ZinfoVictoriaMetrics/lib/mergeset/table.go:292table"/var/lib/victoria-metrics-data/indexdb/1704A027396769B6"hasbeenopenedin0.001seconds;partsCount:0;blocksCount:0,itemsCount:0;sizeBytes:02022-07-24T01:37:50.463ZinfoVictoriaMetrics/app/vmstorage/main.go:113successfullyopenedstorage"/var/lib/victoria-metrics-data"in0.011seconds;partsCount:0;blocksCount:0;rowsCount:0;sizeBytes:02022-07-24T01:37:50.464ZinfoVictoriaMetrics/app/vmselect/promql/rollup_result_cache.go:111loadingrollupResultcachefrom"/var/lib/victoria-metrics-data/cache/rollupResult"...2022-07-24T01:37:50.466ZinfoVictoriaMetrics/app/vmselect/promql/rollup_result_cache.go:137loadedrollupResultcachefrom"/var/lib/victoria-metrics-data/cache/rollupResult"in0.002seconds;entriesCount:0,sizeBytes:02022-07-24T01:37:50.467ZinfoVictoriaMetrics/app/victoria-metrics/main.go:61startedVictoriaMetricsin0.015seconds2022-07-24T01:37:50.467ZinfoVictoriaMetrics/lib/httpserver/httpserver.go:91startinghttpserverathttp:2022-07-24T01:37:50.467ZinfoVictoriaMetrics/lib/httpserver/httpserver.go:92pprofhandlersareexposedathttp:apiVersion:v1kind:ConfigMapmetadata:name:prometheus-confignamespace:kube-vmdata:prometheus.yaml:|global:scrape_interval:15sscrape_timeout:15sremote_write:# 远程写入到远程 VM 存储- url:http:scrape_configs:- job_name:"nodes"static_configs:- targets:['192.168.0.109:9111','192.168.0.110:9111','192.168.0.111:9111']relabel_configs:# 通过 relabeling 从 __address__ 中提取 IP 信息,为了后面验证 VM 是否兼容 relabeling- source_labels:[__address__]regex:"(.*):(.*)"replacement:"${1}"target_label:'ip'action:replace
- 重新更新 Prometheus 的配置资源对象:
[root@master1 vm]#kubectl apply -f vm-prom-config.yaml configmap/prometheus-configconfigured# 更新后执行 reload 操作重新加载 prometheus 配置[root@master1 vm]# curl -X POST "http:Last login:Sun Jul 24 09:34:40 2022 from master1[root@node2 ~]#ll /data/k8s/vm/data/total 0drwxr-xr-x 3 root root 23 Jul 24 09:37 big-rw-r--r-- 1 root root 0 Jul 24 09:37 flock.lockdrwxr-xr-x 3 root root 23 Jul 24 09:37 small
- 现在我们去直接将 Grafana 中的数据源地址修改成 VM 的地址:
修改完成后重新访问 node-exporter 的 dashboard,正常可以显示,证明 VM 是兼容的。
奇怪:自己这个为什没数据呢?
估计是这个问题……
替换了不行的,这里有问题……reload不了。
但是,后面又有数据了……
还是有一些信息的。
2.替换 Prometheus
上面我们将 Prometheus 数据远程写入到了 VM,但是 Prometheus 开启 remote write 功能后会增加其本身的资源占用。理论上其实我们也可以完全用 VM 来替换掉 Prometheus,这样就不需要远程写入了,而且本身 VM 就比 Prometheus 占用更少的资源。
- 现在我们先停掉 Prometheus 的服务:
[root@master1 vm]#kubectl scale deployment prometheus --replicas=0-nkube-vmdeployment.apps/prometheusscaled
- 然后将 Prometheus 的配置文件挂载到 VM 容器中,使用参数
-promscrape.config
来指定 Prometheus 的配置文件路径,如下所示:
[root@master1 vm]#pwd
/root/vm
[root@master1 vm]#ls
vm-grafana.yaml vm-node-exporter.yaml vm-prom-config.yaml vm-prom-deploy.yaml vm-prom-pvc.yaml vm.yaml
[root@master1 vm]#vim vm.yaml
# vm.yaml#本次新增内容如下:apiVersion:apps/v1kind:Deploymentmetadata:name:victoria-metricsnamespace:kube-vmspec:selector:matchLabels:app:victoria-metricstemplate:metadata:labels:app:victoria-metricsspec:volumes:- name:storagepersistentVolumeClaim:claimName:victoria-metrics-data- name:prometheus-configconfigMap:#这里使用ConfigMapname:prometheus-configcontainers:- name:vmimage:victoriametrics/victoria-metrics:v1.76.1imagePullPolicy:IfNotPresentargs:- -storageDataPath=/var/lib/victoria-metrics-data- -retentionPeriod=1w- -promscrape.config=/etc/prometheus/prometheus.yaml#这里将prometheus.yaml 挂载进来ports:- containerPort:8428name:httpvolumeMounts:- mountPath:/var/lib/victoria-metrics-dataname:storage- mountPath:/etc/prometheus#挂载路径name:prometheus-config
完整代码如下:
cat vm.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:victoria-metricsnamespace:kube-vmspec:selector:matchLabels:app:victoria-metricstemplate:metadata:labels:app:victoria-metricsspec:volumes:- name:storagepersistentVolumeClaim:claimName:victoria-metrics-data- name:prometheus-configconfigMap:#这里使用ConfigMapname:prometheus-configcontainers:- name:vmimage:victoriametrics/victoria-metrics:v1.76.1imagePullPolicy:IfNotPresentargs:- -storageDataPath=/var/lib/victoria-metrics-data- -retentionPeriod=1w- -promscrape.config=/etc/prometheus/prometheus.yaml#这里将prometheus.yaml 挂载进来ports:- containerPort:8428name:httpvolumeMounts:- mountPath:/var/lib/victoria-metrics-dataname:storage- mountPath:/etc/prometheus#挂载路径name:prometheus-config---apiVersion:v1kind:Service#vm还附带了一个web服务,类似于p8s的那个web界面,方便我们操作。metadata:name:victoria-metricsnamespace:kube-vmspec:type:NodePortports:- port:8428selector:app:victoria-metrics---apiVersion:v1kind:PersistentVolumemetadata:name:victoria-metrics-dataspec:accessModes:- ReadWriteOncecapacity:storage:20GistorageClassName:local-storagelocal:path:/data/k8s/vm#必须先创建这个路径persistentVolumeReclaimPolicy:RetainnodeAffinity:required:nodeSelectorTerms:- matchExpressions:- key:kubernetes.io/hostnameoperator:Invalues:- node2---apiVersion:v1kind:PersistentVolumeClaimmetadata:name:victoria-metrics-datanamespace:kube-vmspec:accessModes:- ReadWriteOnceresources:requests:storage:20GistorageClassName:local-storage
- 记得先将 Prometheus 配置文件中的 remote_write 模块去掉:
[root@master1 vm]#ls
vm-grafana.yaml vm-node-exporter.yaml vm-prom-config.yaml vm-prom-deploy.yaml vm-prom-pvc.yaml vm.yaml
[root@master1 vm]#vim vm-prom-config.yaml
[root@master1 vm]#kubectl delete -f vm-prom-config.yaml configmap"prometheus-config"deleted[root@master1 vm]#kubectl apply -f vm-prom-config.yaml configmap/prometheus-configcreated
- 更新vm部署文件:
[root@master1 vm]#kubectl apply -f vm-prom-config.yaml configmap/prometheus-configconfigerd[root@master1 vm]#kubectl delete -f vm.yaml deployment.apps"victoria-metrics"deletedservice"victoria-metrics"deletedpersistentvolume"victoria-metrics-data"deletedpersistentvolumeclaim"victoria-metrics-data"deleted[root@master1 vm]#kubectl apply -f vm.yamldeployment.apps/victoria-metricscreatedservice/victoria-metricscreatedpersistentvolume/victoria-metrics-datacreatedpersistentvolumeclaim/victoria-metrics-datacreated[root@master1 vm]#kubectl get pods -n kube-vm -l app=victoria-metricsNAMEREADYSTATUSRESTARTSAGEvictoria-metrics-8466844968-s9slx1/1Running035s[root@master1 vm]#kubectl logs victoria-metrics-8466844968-s9slx -nkube-vm......2022-07-24T03:10:29.799ZinfoVictoriaMetrics/app/victoria-metrics/main.go:61startedVictoriaMetricsin0.021seconds2022-07-24T03:10:29.799ZinfoVictoriaMetrics/lib/httpserver/httpserver.go:91startinghttpserverathttp:2022-07-24T03:10:29.799ZinfoVictoriaMetrics/lib/httpserver/httpserver.go:92pprofhandlersareexposedathttp:2022-07-24T03:10:29.799ZinfoVictoriaMetrics/lib/promscrape/scraper.go:103readingPrometheusconfigsfrom"/etc/prometheus/prometheus.yaml"2022-07-24T03:10:29.800ZinfoVictoriaMetrics/lib/promscrape/config.go:96startingservicediscoveryroutines...2022-07-24T03:10:29.800ZinfoVictoriaMetrics/lib/promscrape/config.go:102startedservicediscoveryroutinesin0.000seconds2022-07-24T03:10:29.800ZinfoVictoriaMetrics/lib/promscrape/scraper.go:395static_configs:addedtargets:3,removedtargets:0;totaltargets:3
从 VM 日志中可以看出成功读取了 Prometheus 的配置,并抓取了 3 个指标(node-exporter)。
- 现在我们再去 Grafana 查看 node-exporter 的 Dashboard 是否可以正常显示。先保证数据源是 VM 的地址。
这样我们就使用 VM 替换掉了 Prometheus,我们也可以这 Grafana 的 Explore 页面去探索采集到的指标。
3.UI 界面
VM 单节点版本本身自带了一个 Web UI 界面 - vmui,不过目前功能比较简单。
- 可以直接通过 VM 的 NodePort 端口进行访问。
[root@master1 ~]#kubectl get svc -nkube-vmNAMETYPECLUSTER-IPEXTERNAL-IPPORT(S) AGEgrafanaNodePort10.102.169.155<none>3000:30868/TCP21hprometheusNodePort10.103.243.22<none>9090:30832/TCP22hvictoria-metricsNodePort10.103.196.207<none>8428:30458/TCP3h33m
我们这里可以通过 http:apiVersion:v1kind:ConfigMapmetadata:name:promxy-confignamespace:kube-vmdata:config.yaml:|promxy:server_groups:- static_configs:- targets:[victoria-metrics:8428] # 指定vm地址,有多个则往后追加即可path_prefix:/prometheus # 配置前缀---apiVersion:apps/v1kind:Deploymentmetadata:name:promxynamespace:kube-vmspec:selector:matchLabels:app:promxytemplate:metadata:labels:app:promxyspec:containers:- args:- "--config=/etc/promxy/config.yaml"- "--web.enable-lifecycle"- "--log-level=trace"env:- name:ROLEvalue:"1"command:- "/bin/promxy"image:quay.io/jacksontj/promxyimagePullPolicy:Alwaysname:promxyports:- containerPort:8082name:webvolumeMounts:- mountPath:"/etc/promxy/"name:promxy-configreadOnly:true- args:# container to reload configs on configmap change 这个需要特别注意下哦,是一个sidecar容器。- "--volume-dir=/etc/promxy"- "--webhook-url=http:image:jimmidyson/configmap-reload:v0.1name:promxy-server-configmap-reloadvolumeMounts:- mountPath:"/etc/promxy/"name:promxy-configreadOnly:truevolumes:- configMap:name:promxy-configname:promxy-config---apiVersion:v1kind:Servicemetadata:name:promxynamespace:kube-vmspec:type:NodePortports:- port:8082selector:app:promxy