热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Prometheus(4)监控Kubernetes集群节点及应用

Prometheus监控Kubernetes集群节点及应用首先需要我们监控集群的节点,要监控节点其实我们已经有很多非常成熟的方案了,比如Nagios、

Prometheus监控Kubernetes 集群节点及应用

首先需要我们监控集群的节点,要监控节点其实我们已经有很多非常成熟的方案了,比如Nagios、Zabbix,甚至可以我们自己收集数据,这里我们通过prometheus来采集节点的监控指标,可以通过node_exporter获取,node_exporter就是抓取用于采集服务器节点的各种运行指标,目前node_exporter几乎支持所有常见的监控点,比如cpu、distats、loadavg、meminfo、netstat等,详细的监控列表可以参考github repo

对于Kubernetes的集群监控一般我们需要考虑一下几方面


  • Kubernetes节点的监控;比如节点的cpu、load、fdisk、memory等指标
  • 内部系统组件的状态;比如kube-scheduler、kube-controller-manager、kubedns/coredns等组件的运行状态
  • 编排级的metrics;比如Deployment的状态、资源请求、调度和API延迟等数据指标

监控方案

Kubernetes集群的监控方案主要有以下几种方案


  • Heapster:Herapster是一个集群范围的监控和数据聚合工具,以Pod的形式运行在集群中
    kubernetes_monitoring_heapster.png-19.1kB

Kubelet/cAdvisor之外,我们还可以向Heapster添加其他指标源数据,比如kube-state-metrics


Heapster已经被废弃,使用metrics-server代替



  • cAvisor:cAdvisor是Google开源的容器资源监控和性能分析工具,它是专门为容器而生,本身也支持Docker容器,Kubernetes中,我们不需要单独去安装,cAdvisor作为kubelet内置的一部分程序可以直接使用
  • Kube-state-metrics:通过监听API Server生成有关资源对象的状态指标,比如Deployment、Node、Pod,需要注意的是kube-state-metrics只是简单的提供一个metrics数据,并不会存储这些指标数据,所以我们可以使用Prometheus来抓取这些数据然后存储
  • metrics-server:metrics-server也是一个集群范围内的资源数据局和工具,是Heapster的代替品,同样的,metrics-server也只是显示数据,并不提供数据存储服务。

不过kube-state-metricsmetrics-server之前还有很大不同的,二者主要区别如下

1.kube-state-metrics主要关注的是业务相关的一些元数据,比如Deployment、Pod、副本状态等
2.metrics-service主要关注的是资源度量API的实现,比如CPU、文件描述符、内存、请求延时等指标

资源度量API




监控集群节点

首先需要我们监控集群的节点,要监控节点其实我们已经有很多非常成熟的方案了,比如Nagios、Zabbix,甚至可以我们自己收集数据,这里我们通过prometheus来采集节点的监控指标,可以通过node_exporter获取,node_exporter就是抓取用于采集服务器节点的各种运行指标,目前node_exporter几乎支持所有常见的监控点,比如cpu、distats、loadavg、meminfo、netstat等,详细的监控列表可以参考github repo

这里使用DeamonSet控制器来部署该服务,这样每一个节点都会运行一个Pod,如果我们从集群中删除或添加节点后,也会进行自动扩展

cat >>prometheus-node-exporter.yaml<<EOF
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:name: node-exporternamespace: kube-systemlabels:name: node-exporter
spec:template:metadata:labels:name: node-exporterspec:hostPID: truehostIPC: truehostNetwork: truecontainers:- name: node-exporterimage: prom/node-exporter:v0.16.0ports:- containerPort: 9100resources:requests:cpu: 0.15securityContext:privileged: trueargs:- --path.procfs- /host/proc- --path.sysfs- /host/sys- --collector.filesystem.ignored-mount-points- &#39;"^/(sys|proc|dev|host|etc)($|/)"&#39;volumeMounts:- name: devmountPath: /host/dev- name: procmountPath: /host/proc- name: sysmountPath: /host/sys- name: rootfsmountPath: /rootfstolerations:- key: "node-role.kubernetes.io/master"operator: "Exists"effect: "NoSchedule"volumes:- name: prochostPath:path: /proc- name: devhostPath:path: /dev- name: syshostPath:path: /sys- name: rootfshostPath:path: /
EOF

创建node-exporter并检查pod

[root&#64;abcdocker prometheus]# kubectl create -f prometheus-node-exporter.yaml
daemonset.extensions/node-exporter created[root&#64;abcdocker prometheus]# kubectl get pod -n kube-system -o wide|grep node
node-exporter-rtkbh 1/1 Running 0 25s 10.4.82.139 abcdocker82-139.opi.com
node-exporter-snvl4 1/1 Running 0 25s 10.4.82.140 abcdocker82-140.opi.com
node-exporter-wz4z4 1/1 Running 0 25s 10.4.82.138 abcdocker82-138.opi.com
node-exporter-x8lv4 1/1 Running 0 25s 10.4.82.142 abcdockerl82-142.opi.com #这里我们可以看到&#xff0c;我们有4个节点&#xff0c;在所有的节点上都启动了一个对应Pod进行获取数据

node-exporter.yaml文件说明

由于我们要获取的数据是主机的监控指标数据&#xff0c;而我们的node-exporter是运行在容器中的&#xff0c;所以我们在Pod中需要配置一些Pod的安全策略

hostPID:true
hostIPC:true
hostNetwork:true#这三个配置主要用于主机的PID namespace、IPC namespace以及主机网络&#xff0c;这里需要注意的是namespace是用于容器隔离的关键技术&#xff0c;这里的namespace和集群中的namespace是两个完全不同的概念

另外我们还需要将主机/dev/proc/sys这些目录挂在到容器中&#xff0c;这些因为我们采集的很多节点数据都是通过这些文件来获取系统信息


比如我们在执行top命令可以查看当前cpu使用情况&#xff0c;数据就来源于/proc/stat&#xff0c;使用free命令可以查看当前内存使用情况&#xff0c;其数据来源是/proc/meminfo文件


另外如果是使用kubeadm搭建的&#xff0c;同时需要监控master节点的&#xff0c;则需要添加下方的相应容忍

- key: "node-role.kubernetes.io/master"operator: "Exists"effect: "NoSchedule

node-exporter容器相关启动参数

args:- --path.procfs #配置挂载宿主机&#xff08;node节点&#xff09;的路径- /host/proc- --path.sysfs #配置挂载宿主机&#xff08;node节点&#xff09;的路径- /host/sys- --collector.filesystem.ignored-mount-points- &#39;"^/(sys|proc|dev|host|etc)($|/)"&#39;

在我们的yaml文件中加入了hostNetwork:true会直接将我们的宿主机的9100端口映射出来&#xff0c;从而不需要创建service 在我们的宿主机上就会有一个9100的端口

容器的9100--->映射到宿主机9100

hostNetwork: truecontainers:- name: node-exporterimage: prom/node-exporter:v0.16.0ports:- containerPort: 9100

上面我们检查了Pod的运行状态都是正常的&#xff0c;接下来我们要查看一下Pod日志&#xff0c;以及node-exporter中的metrics

使用命令kubectl logs -n 命名空间 node-exporter中Pod名称检查Pod日志是否有额外报错

image_1ddj8ko67iov1qlnftpvju9gql.png-855.7kB

#接下来&#xff0c;我们在任意集群节点curl 9100/metricscurl 127.0.0.1:9100/metrics
...
node_xfs_block_mapping_extent_list_insertions_total{device&#61;"vda2"} 0
node_xfs_block_mapping_extent_list_insertions_total{device&#61;"vda3"} 285586
# HELP node_xfs_block_mapping_extent_list_lookups_total Number of extent list lookups for a filesystem.
# TYPE node_xfs_block_mapping_extent_list_lookups_total counter
node_xfs_block_mapping_extent_list_lookups_total{device&#61;"vda2"} 27
node_xfs_block_mapping_extent_list_lookups_total{device&#61;"vda3"} 5.3729641e&#43;07
# HELP node_xfs_block_mapping_reads_total Number of block map for read operations for a filesystem.
# TYPE node_xfs_block_mapping_reads_total counter
...#只要metrics可以获取到数据说明node-exporter没有问题

服务发现

我们这里三个节点都运行了node-exporter程序&#xff0c;如果我们通过一个Server来将数据收集在一起&#xff0c;用静态的方式配置到prometheus就会显示一条数据&#xff0c;我们得自己在指标中过滤每个节点的数据&#xff0c;配置比较麻烦。 这里就采用服务发现

在Kubernetes下&#xff0c;Prometheus通过Kubernetes API基础&#xff0c;目前主要支持5种服务发现&#xff0c;分别是nodeServerPodEndpointsIngress

需要我们在Prometheus配置文件中&#xff0c;添加如下三行

- job_name: &#39;kubernetes-node&#39;kubernetes_sd_configs:- role: node#通过制定Kubernetes_sd_config的模式为node&#xff0c;prometheus就会自动从Kubernetes中发现所有的node节点并作为当前job监控的目标实例&#xff0c;发现的节点/metrics接口是默认的kubelet的HTTP接口

333.png-178.6kB

接下来我们更新配置文件

[root&#64;abcdocker prometheus]# kubectl delete -f prometheus.configmap.yaml
configmap "prometheus-config" deleted
[root&#64;abcdocker prometheus]# kubectl create -f prometheus.configmap.yaml
configmap/prometheus-config created[root&#64;abcdocker prometheus]# kubectl get svc -n kube-system |grep prometheus
prometheus NodePort 10.101.143.162 9090:32331/TCP 21h#热更新刷新配置&#xff08;可能稍微需要等待一小会&#xff09;
[root&#64;abcdocker prometheus]# curl -X POST http://10.101.143.162:9090/-/reload

接着访问我们的地址


http://10.4.82.138:32331/targets



这个端口要和service对上


现在我们可以看到已经获取到我们的Node节点的IP&#xff0c;但是由于metrics监听的端口是10250而并不是我们设置的9100&#xff0c;所以提示我们节点属于Down的状态
image_1ddko0g6rb2713m918np12lj1vhd15.png-328.9kB

这里我们就需要使用Prometheus提供的relabel_configs中的replace能力了&#xff0c;relabel可以在Prometheus采集数据之前&#xff0c;通过Target实例的Metadata信息&#xff0c;动态重新写入Label的值。除此之外&#xff0c;我们还能根据Target实例的Metadata信息选择是否采集或者忽略该Target实例。这里使用__address__标签替换10250端口为9100

这里使用正则进行替换端口

- job_name: &#39;kubernetes-node&#39;kubernetes_sd_configs:- role: noderelabel_configs:- source_labels: [__address__]regex: &#39;(.*):10250&#39;replacement: &#39;${1}:9100&#39;target_label: __address__action: replace

接下来我们更新一下配置


curl的时候可以多更新几次&#xff0c;顺便等待一会


[root&#64;abcdocker prometheus]# kubectl delete -f prometheus.configmap.yaml
configmap "prometheus-config" deleted
[root&#64;abcdocker prometheus]# kubectl create -f prometheus.configmap.yaml
configmap/prometheus-config created
[root&#64;abcdocker prometheus]# curl -X POST http://10.101.143.162:9090/-/reload

目前属于在收集的状态&#xff0c;我们等待一会即可
image_1ddkokgbcrjh11bmc41orfmk91i.png-214.7kB
现在在状态就正常了

7F16567C-63AB-4BD4-97C6-866424BDE1C4.png-319.9kB

目前状态已经正常&#xff0c;但是还有一个问题就是我们的采集数据只显示了IP地址&#xff0c;对于我们监控分组分类不是很方便&#xff0c;这里可以通过labelmap这个属性来将Kubernetes的Label标签添加为Prometheus的指标标签


此处为可选配置


- job_name: &#39;kubernetes-node&#39;kubernetes_sd_configs:- role: noderelabel_configs:- source_labels: [__address__]regex: &#39;(.*):10250&#39;replacement: &#39;${1}:9100&#39;target_label: __address__action: replace- action: labelmapregex: __meta_kubernetes_node_label_(.&#43;)

添加了一个action为labelmap&#xff0c;正则表达式是__meta_kubernetes_node(.&#43;)的配置&#xff0c;这里的意思就是表达式中匹配的数据也添加到指标数据的Label标签中去。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v29jM8oV-1607590701738)(http://cyh.abcdocker.com/abcdocker/7wmekazzc8lp4pftdycqozvb/FC2DB332-B5BF-4715-B25E-BC65B6B09CA2.png)]

实际上就是获取我们的标签

kubectl get nodes --show-labels

在这里插入图片描述

对于Kubernetes_sd_configs下面可用的元标签如下


  • __meta_kubernetes_node_name: 节点对象的名称
  • _meta_kubernetes_node_label: 节点对象中的每个标签
  • _meta_kubernetes_node_annotation: 来自节点对象的每个注释

_meta_kubernetes_node_address: 每个节点地址类型的第一个地址(如果存在) 关于kubernetes_sd_configs更多信息可以查看官方文档: kubernetes_sd_config


#prometheus configmap 监控完整配置如下,有需要可以直接拷贝
apiVersion: v1
kind: ConfigMap
metadata:name: prometheus-confignamespace: kube-system
data:prometheus.yml: |global:scrape_interval: 15sscrape_timeout: 15sscrape_configs:- job_name: &#39;prometheus&#39;static_configs:- targets: [&#39;localhost:9090&#39;]- job_name: &#39;kubernetes-node&#39;kubernetes_sd_configs:- role: noderelabel_configs:- source_labels: [__address__]regex: &#39;(.*):10250&#39;replacement: &#39;${1}:9100&#39;target_label: __address__action: replace- job_name: &#39;kubernetes-cadvisor&#39;kubernetes_sd_configs:- role: nodescheme: httpstls_config:ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crtbearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/tokenrelabel_configs:- action: labelmapregex: __meta_kubernetes_node_label_(.&#43;)- target_label: __address__replacement: kubernetes.default.svc:443- source_labels: [__meta_kubernetes_node_name]regex: (.&#43;)target_label: __metrics_path__replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor

我们还可以去Graph里面看一下数据


image_1ddkv1lp0370109db91ahp3ss5g.png-83.5kB
1560850983463.jpg-486.8kB


一、容器监控

cAdvisor是一个容器资源监控工具&#xff0c;包括容器的内存&#xff0c;CPU&#xff0c;网络IO&#xff0c;资源IO等资源&#xff0c;同时提供了一个Web页面用于查看容器的实时运行状态。

cAvisor已经内置在了kubelet组件之中&#xff0c;所以我们不需要单独去安装&#xff0c;cAdvisor的数据路径为/api/v1/nodes//proxy/metrics


action 使用labelkeep或者labeldrop则可以对Target标签进行过滤&#xff0c;仅保留符合过滤条件的标签


- job_name: &#39;kubernetes-cadvisor&#39;kubernetes_sd_configs:- role: nodescheme: httpstls_config:ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crtbearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/tokenrelabel_configs:- action: labelmapregex: __meta_kubernetes_node_label_(.&#43;)- target_label: __address__replacement: kubernetes.default.svc:443- source_labels: [__meta_kubernetes_node_name]regex: (.&#43;)target_label: __metrics_path__replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor

在这里插入图片描述

这里稍微说一下tls_config配置的证书地址是每个Pod连接apiserver所使用的地址&#xff0c;基本上写死了。并且我们在配置文件添加了一个labelmap标签。在最下面使用了一个正则替换了cAdvisor的一个metrics地址


证书是我们Pod启动的时候kubelet给pod注入的一个证书&#xff0c;所有的pod启动的时候都会有一个ca证书注入进来



如要想要访问apiserver的信息&#xff0c;还需要配置一个token_file


修改完成之后&#xff0c;我们需要configmap并且使用curl进行热更新(过程比较慢&#xff0c;需要等待会)

kubectl delete -f prometheus.configmap.yaml
kubectl create -f prometheus.configmap.yaml
curl -X POST http://10.101.143.162:9090/-/reload
#curl可以多刷几次

image_1ddl1o2taka3167i1uim11bk16p46i.png-291.5kB
等待大约60秒
image_1ddl1orq7grh7nf1dpvhg21kq56v.png-240.8kB
现在我们可以到Graph路径下面查询容器的相关数据


这里演示查询集群中所有Pod的CPU使用情况&#xff0c;查询指标container_cpu_usage_seconds_total并且查询1分钟之内的数据


这里演示一下使用函数rate和不使用函数的一个过滤功能

container_cpu_usage_seconds_total{image!&#61;"",pod_name!&#61;""}
rate(container_cpu_usage_seconds_total{image!&#61;"",pod_name!&#61;""}[1m])

执行下方命令&#xff0c;过滤1分钟内的数据

rate(container_cpu_usage_seconds_total{image!&#61;"",pod_name!&#61;""}[1m])

image_1ddl27mrp2j71ap41am216jgsc87p.png-445kB

还可以使用sum函数,pod在1分钟内的使用率&#xff0c;同时将pod名称打印出来

sum by (pod_name)(rate(container_cpu_usage_seconds_total{image!&#61;"", pod_name!&#61;""}[1m] ))

image_1ddl2b44g1shmg2v1pbk19vq3nq86.png-205.8kB




二、Api-Service 监控

apiserver作为Kubernetes最核心的组件&#xff0c;它的监控也是非常有必要的&#xff0c;对于apiserver的监控&#xff0c;我们可以直接通过kubernetes的service来获取

[root&#64;abcdocker prometheus]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 443/TCP 33d

上面的service是我们集群的apiserver内部的service的地址&#xff0c;要自动发现service类型的服务&#xff0c;需要使用roleEndpointskubernetes_sd_configs (自动发现)&#xff0c;我们只需要在configmap里面在添加Endpoints类型的服务发现

- job_name: &#39;kubernetes-apiserver&#39;kubernetes_sd_configs:- role: endpoints

image_1ddl58m1t1btuua3952qv1o3f8j.png-208.7kB

刷新配置文件&#xff0c;最好是多刷新几次

kubectl delete -f prometheus.configmap.yaml
kubectl create -f prometheus.configmap.yaml
curl -X POST http://10.101.143.162:9090/-/reload

更新完成后&#xff0c;我们可以看到kubernetes-apiserver下面出现了很多实例&#xff0c;这是因为我们这里使用的Endpoints类型的服务发现&#xff0c;所以prometheus把所有的Endpoints服务都抓取过来了&#xff0c;同样的我们要监控的kubernetes也在列表中。
[外链图片转存中...(img-CrKPrR6K-1607590932859)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CrKPrR6K-1607590932859)(http://cyh.abcdocker.com/abcdocker/los5vxv78zwdlaxhw4rui7zn/image_1ddl5d38c119g126b1d2cpiaob590.png)]

这里我们使用keep动作&#xff0c;将符合配置的保留下来&#xff0c;例如我们过滤default命名空间下服务名称为kubernetes的元数据&#xff0c;这里可以根据__meta_kubernetes_namespace__mate_kubertnetes_service_name2个元数据进行relabel

- job_name: &#39;kubernetes-apiservers&#39;kubernetes_sd_configs:- role: endpointsscheme: httpstls_config:ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crtbearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/tokenrelabel_configs:- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]action: keepregex: default;kubernetes;https#参数解释
action: keep #保留哪些标签
regex: default;kubernetes;https #匹配namespace下的default命名空间下的kubernetes service 最后https协议
可以通过&#96;kubectl describe svc kubernetes&#96;查看到

刷新配置

kubectl delete -f prometheus.configmap.yaml
kubectl create -f prometheus.configmap.yaml
curl -X POST http://10.101.143.162:9090/-/reload
#这个过程比较慢&#xff0c;可能要等几分钟,可以多reload几次

出现状态UNKOWN等3秒在刷新就正常了
image_1ddl624bdoje1f101tq1vgtojs9d.png-89.2kB

image_1ddl62klfk9kk25sftfmb174l9q.png-62.7kB

接下来我们还是前往Greph上查看采集到的数据

sum(rate(apiserver_request_count[1m]))#这里使用的promql里面的rate和sun函数&#xff0c;意思是apiserver在1分钟内请求的数

image_1ddl68r9o1m5b7sm1kgf1asgkdaa7.png-103.4kB

如果我们要监控其他系统组件&#xff0c;比如kube-controller-manager、kube-scheduler的话就需要单独手动创建service&#xff0c;因为apiserver服务默认在default&#xff0c;而其他组件在kube-steam这个namespace下。其中kube-sheduler的指标数据端口为10251&#xff0c;kube-controller-manager对应端口为10252




三、Service 监控

apiserver实际上是一种特殊的Service&#xff0c;现在配置一个专门发现普通类型的Service


这里我们对service进行过滤&#xff0c;只有在service配置了prometheus.io/scrape: "true"过滤出来


- job_name: &#39;kubernetes-service-endpoints&#39;kubernetes_sd_configs:- role: endpointsrelabel_configs:- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]action: keepregex: true- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]action: replacetarget_label: __scheme__regex: (https?)- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]action: replacetarget_label: __metrics_path__regex: (.&#43;)- source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]action: replacetarget_label: __address__regex: ([^:]&#43;)(?::\d&#43;)?;(\d&#43;)replacement: $1:$2- action: labelmapregex: __meta_kubernetes_service_label_(.&#43;)- source_labels: [__meta_kubernetes_namespace]action: replacetarget_label: kubernetes_namespace- source_labels: [__meta_kubernetes_service_name]action: replacetarget_label: kubernetes_name

继续重复步骤&#xff0c;刷新配置

#要多刷几次&#xff0c;要不你就等会
kubectl delete -f prometheus.configmap.yaml
kubectl create -f prometheus.configmap.yaml
curl -X POST http://10.101.143.162:9090/-/reload

Serivce自动发现参数说明 &#xff08;并不是所有创建的service都可以被prometheus发现&#xff09;

#1.参数解释
relabel_configs:
-source_labels:[__meta_kubernetes_service_annotation_prometheus_io_scrape]
action: keep
regex: true 保留标签
source_labels: [__meta_kubernetes_service_annotation_prometheus_io_cheme]这行配置代表我们只去筛选有__meta_kubernetes_service_annotation_prometheus_io_scrape的service&#xff0c;只有添加了这个声明才可以自动发现其他service#2.参数解释- source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]action: replacetarget_label: __address__regex: ([^:]&#43;)(?::\d&#43;)?;(\d&#43;)replacement: $1:$2
#指定一个抓取的端口&#xff0c;有的service可能有多个端口&#xff08;比如之前的redis&#xff09;。默认使用的是我们添加是使用kubernetes_service端口#3.参数解释- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]action: replacetarget_label: __scheme__regex: (https?)
#这里如果是https证书类型&#xff0c;我们还需要在添加证书和token

我们可以看到这里的服务的core DNS,为什么那么多service只有coreDNS可以被收集到呢&#xff1f;
image_1ddl7kqvt1u4314h1o5c1mcm1lhak.png-224.2kB

上面也说了&#xff0c;我们有过滤条件&#xff0c;只有复合条件的才进行过滤


core DNS serviceYaml 文件包含true参数&#xff0c;所以会被匹配到


image_1ddl7nl6j1qhu7bj18298v5v7cb1.png-47.1kB

当我们再次查看&#xff0c;发现状态完成
image_1ddl7um6519meubnbrkfa21ceobe.png-272.9kB


案例&#xff1a;之前我们配置了一个Redis的一个exporter&#xff0c;我们通过redis进行暴露监控

我们在之前的Redis上添加prometheus.io/scrape&#61;true

cat >>prometheus-redis-exporter.yaml <apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: redisnamespace: abcdockerannotations:prometheus.io/scrape: "true"prometheus.io/port: "9121"
spec:template:metadata:labels:app: redisspec:containers:- name: redisimage: redis:4resources:requests:cpu: 100mmemory: 100Miports:- containerPort: 6379- name: redis-exporterimage: oliver006/redis_exporter:latestresources:requests:cpu: 100mmemory: 100Miports:- containerPort: 9121
---
kind: Service
apiVersion: v1
metadata:name: redisnamespace: abcdocker
spec:selector:app: redisports:- name: redisport: 6379targetPort: 6379- name: promport: 9121targetPort: 9121
EOF

由于Redis服务的metrics接口在redis-exporter 9121上&#xff0c;我们还需要添加prometheus.io/port&#61;9121这样的annotation

redis.png-43.1kB

接下来我们刷新一下Redis的Service配置

[root&#64;abcdocker prometheus]# kubectl apply -f prometheus-redis-exporter.yaml
deployment.extensions/redis unchanged
service/redis unchanged

我们之前配置的Redis exporter就可以不需要了&#xff08;因为我们这里就是动态获取了&#xff09;
image_1ddla56j3r861ts9dqagf6h0au.png-134.8kB


kube-state-metrics

kube-state-metrics是一个简单的服务&#xff0c;它监听Kubernetes API服务器并生成相关指标数据&#xff0c;它不单关注单个Kubernetes组件的运行情况&#xff0c;而是关注内部各种对象的运行状况

在K8s集群上Pod、DaemonSet、Deployment、Job、CronJob等各种资源对象的状态也需要监控&#xff0c;这些指标主要来自于apiserver和kubelet中集成的cAvisor&#xff0c;但是并没有具体的各种资源对象的状态指标。对于Prometheus来说&#xff0c;当然是需要引入新的exporter来暴露这些指标&#xff0c;Kubernetes提供了一个kube-state-metrics


kube-state-metrics已经给出了在Kubernetes部署的文件&#xff0c;我们直接将代码Clone到集群中执行yaml文件即可


将kube-state-metrics部署在kubernetes上之后&#xff0c;会发现kubernetes集群中的prometheus会在kube-state-metrics这个job下自动发现kube-state-metrics&#xff0c;并开始拉去metrics&#xff0c;这是因为部署kube-state-metrics的manifest定义文件kube-state-metrics-server.yaml对Service的定义包含prometheus.io/scrape: &#39;true&#39;这样的一个annotation。因此kube-state-metrics的endpoint可以被Prometheus自动发现

关于kube-state-metrics暴露所有监控指标可以参考kube-state-metrics的文档kube-state-metrics Documentation

在这里插入图片描述

可以通过Graph进行测试一下

官方文档给出了一个例子是按照Pod内存使用情况进行绘图

sum(kube_pod_container_resource_requests_memory_bytes) by (namespace, pod, node)* on (pod) group_left() (sum(kube_pod_status_phase{phase&#61;"Running"}) by (pod, namespace) &#61;&#61; 1)

image_1ddlmaa3i1cqnbpe2ord4lm8j1o.png-229.4kB


推荐阅读
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4277。作者:Bob Lee,日期:2012年9月15日。题目描述:给定n个木棍,求可以组成的不同三角形的数量,最多15根木棍。 ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 深入解析Struts、Spring与Hibernate三大框架的面试要点与技巧 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 本文详细探讨了几种常用的Java后端开发框架组合及其具体应用场景。通过对比分析Spring Boot、MyBatis、Hibernate等框架的特点和优势,结合实际项目需求,为开发者提供了选择合适框架组合的参考依据。同时,文章还介绍了这些框架在微服务架构中的应用,帮助读者更好地理解和运用这些技术。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 在 `UITableViewController` 中采用简洁的平面样式布局时,可以通过优化代码实现单元格扩展至屏幕边缘的效果,同时确保节标题以分组样式呈现,从而提升用户体验和界面美观度。通过这种方式,可以更好地组织和展示列表内容,使其更加清晰和有序。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
  • 在List和Set集合中存储Object类型的数据元素 ... [详细]
author-avatar
橄榄村
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有