热门标签 | 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


推荐阅读
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文探讨了容器技术在安全方面面临的挑战,并提出了相应的解决方案。多租户保护、用户访问控制、中毒的镜像、验证和加密、容器守护以及容器监控都是容器技术中需要关注的安全问题。通过在虚拟机中运行容器、限制特权升级、使用受信任的镜像库、进行验证和加密、限制容器守护进程的访问以及监控容器栈,可以提高容器技术的安全性。未来,随着容器技术的发展,还需解决诸如硬件支持、软件定义基础设施集成等挑战。 ... [详细]
  • k8s进阶之搭建私有镜像仓库
    企业级私有镜像仓 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了在Docker容器技术中限制容器对CPU的使用的方法,包括使用-c参数设置容器的内存限额,以及通过设置工作线程数量来充分利用CPU资源。同时,还介绍了容器权重分配的情况,以及如何通过top命令查看容器在CPU资源紧张情况下的使用情况。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
  • 三、查看Linux版本查看系统版本信息的命令:lsb_release-a[root@localhost~]#lsb_release-aLSBVersion::co ... [详细]
  • 随着我司的应用都开始容器化,相应的ETL流程也需要迁移到容器中。常规的SQL和shell脚本迁移之后执行基本没有问题,主要的问题在于数据接入使用kettle的场景下,kettle启 ... [详细]
  • 有意向可以发简历到邮箱内推.简历直达组内Leader.能做同事的话,内推奖励全给你. ... [详细]
  • systemd-nspawn可以创建最轻量级的容器(ns的意思就是namespace),本文的实验平台是Ubuntu16.04,x86_64机器。本文的目的是:在Ubuntu中用syst ... [详细]
  • 生产环境下JVM调优参数的设置实例
     正文前先来一波福利推荐: 福利一:百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。福利二 ... [详细]
  • Sublime P4语法高亮设置
    Github插件链接:p4-syntax-highlighter首先安装PackageControl。进入Package界面,我的目录:U ... [详细]
  • TerraformVersionTerraformv0.9.11AffectedResource(s)Pleas ... [详细]
  • Apple iPad:过渡设备还是平板电脑?
    I’vebeenagonizingoverwhethertopostaniPadarticle.Applecertainlydon’tneedmorepublicityandthe ... [详细]
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社区 版权所有