- 浏览: 565888 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (267)
- 随笔 (4)
- Spring (13)
- Java (61)
- HTTP (3)
- Windows (1)
- CI(Continuous Integration) (3)
- Dozer (1)
- Apache (11)
- DB (7)
- Architecture (41)
- Design Patterns (11)
- Test (5)
- Agile (1)
- ORM (3)
- PMP (2)
- ESB (2)
- Maven (5)
- IDE (1)
- Camel (1)
- Webservice (3)
- MySQL (6)
- CentOS (14)
- Linux (19)
- BI (3)
- RPC (2)
- Cluster (9)
- NoSQL (7)
- Oracle (25)
- Loadbalance (7)
- Web (5)
- tomcat (1)
- freemarker (1)
- 制造 (0)
最新评论
-
panamera:
如果设置了连接需要密码,Dynamic Broker-Clus ...
ActiveMQ 集群配置 -
panamera:
请问你的最后一种模式Broker-C节点是不是应该也要修改持久 ...
ActiveMQ 集群配置 -
maosheng:
longshao_feng 写道楼主使用 文件共享 模式的ma ...
ActiveMQ 集群配置 -
longshao_feng:
楼主使用 文件共享 模式的master-slave,produ ...
ActiveMQ 集群配置 -
tanglanwen:
感触很深,必定谨记!
少走弯路的十条忠告
大多情况都是将 Prometheus 通过 yaml 安装在 Kubernetes 集群中来采集数据,但是在实际环境中很多企业是将 Prometheus 单独部署在集群外部的,直接监控多个Kubernetes 集群。前面我们介绍了 Prometheus 单独部署在集群外部的部署过程:《Centos7 部署 Prometheus、Grafana、Cadvisor》 https://www.iteye.com/blog/maosheng-2514526
我们要去采集 Kubernetes 集群 cAdvisor 的监控数据,在Kubernetes中,kubelet内嵌了cAdvisor,cAdvisor 作为 kubelet 内置的一部分程序可以直接使用,因此我们就可以利用 APIServer 通过 kubelet 去获取到对应的数据,而不需要单独安装cAdvisor了。对Kubernetes的监控Prometheus 通过自动发现KubeConfig 的模式访问 APIServer, Prometheus 单独部署在集群外部 Kubernetes APIServer 时需要 token 文件,所以就需要我们手动提供这个文件,才能够做到自动发现了。
接下来就首先构造 Prometheus 连接 APIServer 的信息,在通过 kubernetes_sd_configs 做服务发现的时候只需要填入 Kubernetes 集群的 api_server、ca_file、bearer_token_file 信息即可,要获得这几个文件信息通过如下操作获取。
在Kubernetes创建用于 Prometheus 访问 Kubernetes 资源对象的 RBAC 对象:
1)在Kubernetes Master节点创建如下yaml文件:
[root@k8s-master ~]#touch prom.rbac.yaml
[root@k8s-master ~]#chmod +x prom.rbac.yaml
[root@k8s-master ~]#vi prom.rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: prometheus
namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: prometheus
rules:
- apiGroups:
- ""
resources:
- nodes
- services
- endpoints
- pods
- nodes/proxy
verbs:
- get
- list
- watch
- apiGroups:
- "extensions"
resources:
- ingresses
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- configmaps
- nodes/metrics
verbs:
- get
- nonResourceURLs:
- /metrics
verbs:
- get
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: prometheus
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: prometheus
subjects:
- kind: ServiceAccount
name: prometheus
namespace: default
2)在 Kubernetes 集群中创建上面的资源对象,Kubernetes Master节点执行:
[root@k8s-master ~]# kubectl apply -f prom.rbac.yaml
3)然后获取上面的 Prometheus 对应的 Secret 的信息:
[root@k8s-master ~]# kubectl get sa prometheus -n default -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"ServiceAccount","metadata":{"annotations":{},"name":"prometheus","namespace":"default"}}
creationTimestamp: 2020-07-09T02:50:51Z
name: prometheus
namespace: default
resourceVersion: "40572186"
selfLink: /api/v1/namespaces/default/serviceaccounts/prometheus
uid: 003c567a-c18f-11ea-8555-6c92bfa51bf6
secrets:
- name: prometheus-token-td75r
[root@k8s-master ~]# kubectl describe secret prometheus-token-td75r -n default
Name: prometheus-token-td75r
Namespace: default
Labels: <none>
Annotations: kubernetes.io/service-account.name=prometheus
kubernetes.io/service-account.uid=003c567a-c18f-11ea-8555-6c92bfa51bf6
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 7 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InByb21ldGhldXMtdG9rZW4tdGQ3NXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoicHJvbWV0aGV1cyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjAwM2M1NjdhLWMxOGYtMTFlYS04NTU1LTZjOTJiZmE1MWJmNiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OnByb21ldGhldXMifQ.GG-VVlEiUohBAMldJ_cfYLUoOOkIivucNNi7gZTekqNN1_qLSrq9QsGRaQ7qr-RLjZLQQC54R3gDvm8cE1k0nPkDUfDVzYjXy_GuIjW0eqdSInwfNgh7acqDiZe5XmTJ9UCeSuevG_9D6Vf6RoGKzH9hVjUJBFi1HhfNfv6plGW4xuRAEfjmGLRnaEaM-TMM9c9H8_MhB9NrZ6CspMz7Iiya1noL-XCX5VV8ey_FsOt78tg8Zg_fVQKuTDSzN7auytmgE8c5DxFuaaK8tg_qI8jdffbQmEesdpWkVpRxKhQ5aTXjYDNPoZ9V0tUcgxQFS5RLCXK2MQl_tv4qUV2DJw
注意:上面的 token 和 ca.crt 信息就是我们用于访问 APIServer 的数据,可以将 token 信息复制保存到一个名为 k8s.token 的文本文件中。
检查k8s 核心组件监听地址:
netstat -tlunp | grep kube
tcp 0 0 0.0.0.0:50051 0.0.0.0:* LISTEN 86466/kube-router
tcp 0 0 127.0.0.1:10248 0.0.0.0:* LISTEN 108134/kubelet
tcp 0 0 0.0.0.0:10250 0.0.0.0:* LISTEN 108134/kubelet
tcp 0 0 0.0.0.0:6443 0.0.0.0:* LISTEN 175680/kube-apiserv
tcp 0 0 0.0.0.0:10252 0.0.0.0:* LISTEN 168570/kube-control
tcp 0 0 0.0.0.0:10255 0.0.0.0:* LISTEN 108134/kubelet
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 175680/kube-apiserv
tcp 0 0 0.0.0.0:10258 0.0.0.0:* LISTEN 86466/kube-router
tcp 0 0 0.0.0.0:179 0.0.0.0:* LISTEN 86466/kube-router
tcp 0 0 0.0.0.0:20244 0.0.0.0:* LISTEN 86466/kube-router
tcp 0 0 0.0.0.0:4194 0.0.0.0:* LISTEN 108134/kubelet
访问各个组件 metrics:
curl http://10.18.19.98:8080/metrics #kube-apiser
curl http://10.18.19.98:10251/metrics #kube-schedul
curl http://10.18.19.98:10252/metrics #kube-controlle
curl http://10.18.19.98:10255/metrics #kubelet
curl http://10.18.19.98:10258/metrics #kube-router
现在我们添加一个 Prometheus 监控外部 Kubernetes 集群数据的任务:
在 Prometheus 安装的服务器,找到prometheus.yml 配置文件,增加如下job
[root@VServer3 ~]# vi /usr/local/prometheus/prometheus.yml
- job_name: 'kubernetes-apiservers'
scheme: https
tls_config:
insecure_skip_verify: true
bearer_token_file: k8s.token
kubernetes_sd_configs:
- api_server: https://192.101.10.80:6443 # apiserver 地址,端口默认6443
role: endpoints
bearer_token_file: k8s.token
tls_config:
insecure_skip_verify: true
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: default;kubernetes;https
- job_name: 'kubernetes-nodes-kubelet'
scheme: https
tls_config:
insecure_skip_verify: true
bearer_token_file: k8s.token
kubernetes_sd_configs:
- api_server: https://192.101.10.80:6443 # apiserver 地址
role: node
bearer_token_file: k8s.token
tls_config:
insecure_skip_verify: true
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
# Only for Kubernetes ^1.7.3.
# See: https://github.com/prometheus/prometheus/issues/2916
- target_label: __address__
replacement: 192.101.10.80:6443
- source_labels: [__meta_kubernetes_node_name]
regex: (.+)
target_label: __metrics_path__
replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
metric_relabel_configs:
- action: replace
source_labels: [id]
regex: '^/machine\.slice/machine-rkt\\x2d([^\\]+)\\.+/([^/]+)\.service$'
target_label: rkt_container_name
replacement: '${2}-${1}'
- action: replace
source_labels: [id]
regex: '^/system\.slice/(.+)\.service$'
target_label: systemd_service_name
replacement: '${1}'
- job_name: 'kubernetes-pods'
scheme: https
tls_config:
insecure_skip_verify: true
bearer_token_file: k8s.token
kubernetes_sd_configs:
- api_server: https://192.101.10.80:6443 # apiserver 地址,端口默认6443
role: pod
bearer_token_file: k8s.token
tls_config:
insecure_skip_verify: true
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
action: replace
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
target_label: __address__
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_pod_name]
action: replace
target_label: kubernetes_pod_name
- job_name: 'kubernetes-services'
metrics_path: /probe
params:
module: [http_2xx]
scheme: https
tls_config:
insecure_skip_verify: true
bearer_token_file: k8s.token
kubernetes_sd_configs:
- api_server: https://192.101.10.80:6443 # apiserver 地址,端口默认6443
role: service
bearer_token_file: k8s.token
tls_config:
insecure_skip_verify: true
relabel_configs:
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_probe]
action: keep
regex: true
- source_labels: [__address__]
target_label: __param_target
- target_label: __address__
replacement: blackbox
- source_labels: [__param_target]
target_label: instance
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_service_name]
target_label: kubernetes_name
- job_name: 'kubernetes-service-endpoints'
scheme: https
tls_config:
insecure_skip_verify: true
bearer_token_file: k8s.token
kubernetes_sd_configs:
- api_server: https://192.101.10.80:6443 # apiserver 地址,端口默认6443
role: endpoints
bearer_token_file: k8s.token
tls_config:
insecure_skip_verify: true
relabel_configs:
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
action: replace
target_label: __scheme__
regex: (https?)
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- source_labels: [__address__]
action: replace
target_label: nodeIp
- source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
action: replace
target_label: __address__
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_service_name]
action: replace
target_label: kubernetes_name
这里 bearer_token_file 就是 Kubernetes Master 上面生成的 k8s.token 文件,然后通过scp 传到 prometheus.yml 的同一目录下,也就是 /usr/local/prometheus/ 下,另外我们也可以使用 bearer_token 直接将k8s.token中的字符串放置在这里,切记得将 api_server 替换成 Kubernetes APIServer 的地址(当然 Prometheus 所在的节点必须能访问到 APIServer 地址)。
我们这里监控 cAdvisor,可以通过 relabel_configs 来配置,将__metrics_path__转换为 /api/v1/nodes/${1}/proxy/metrics/cadvisor,相当于通过 APIServer 代理到 Kubelet 上获取数据,当然如果你的 Prometheus 能够直接访问到 kubelet,也可以配置成直接请求,这样就相当于服务发现使用 APIServer,采集直接走 Kubelet了。
配置完成后,直接启动 Prometheus 即可生效:
[root@VServer3 ~]# sh /script/prometheus_service.sh
现在去 Prometheus 页面就可以看到采集的外部 Kubernetes 集群的数据了!
Prometheus配置文件说明:
# Kubernetes的API SERVER会暴露API服务,Promethues集成了对Kubernetes的自动发现,它有5种模式:Node、Service
# 、Pod、Endpoints、ingress。
# 其实你就是把所有的relabel_configs去掉一样可以对kubernetes做服务发现。relabel_configs仅仅是对采集过来的指标做二次处理,比如
# 要什么不要什么以及替换什么等等。而以__meta_开头的这些元数据标签都是实例中包含的,而relabel则是动态的修改、覆盖、添加删除这些标签
# 或者这些标签对应的值。而且以__开头的标签通常是系统内部使用的,因此这些标签不会被写入样本数据中,如果我们要收集这些东西那么则要进行
# relabel操作。当然reabel操作也不仅限于操作__开头的标签。
#
# action的行为:
# replace:默认行为,不配置action的话就采用这种行为,它会根据regex来去匹配source_labels标签上的值,并将并将匹配到的值写入target_label中
# labelmap:它会根据regex去匹配标签名称,并将匹配到的内容作为新标签的名称,其值作为新标签的值
# keep:仅收集匹配到regex的源标签,而会丢弃没有匹配到的所有标签,用于选择
# drop:丢弃匹配到regex的源标签,而会收集没有匹配到的所有标签,用于排除
# labeldrop:使用regex匹配标签,符合regex规则的标签将从target实例中移除,其实也就是不收集不保存
# labelkeep:使用regex匹配标签,仅收集符合regex规则的标签,不符合的不收集
scrape_configs:
# 用于发现API SERVER
- job_name: 'kubernetes-apiservers'
kubernetes_sd_configs:
# 发现endpoints,它是从列出的服务端点发现目标,这个endpoints来自于Kubernetes中的service,每一个service都有对应的endpoints,这里是一个列表
# 可以是一个IP:PORT也可以是多个,这些IP:PORT就是service通过标签选择器选择的POD的IP和端口。所以endpoints角色就是用来发现server对应的pod的IP的
# kubernetes会有一个默认的service,通过找到这个service的endpoints就找到了api server的IP:PORT,那endpoints有很多,我怎么知道哪个是api server呢
# 这个就靠source_labels指定的标签名称了。
- role: endpoints
# 通过什么形式来连接,默认是https
scheme: https
# 下面这个ca_file和token_file的路径都是默认的,你可能默认设置能用么?其实可以,因为每一个运行起来的POD kubernetes都会为其
# 创建一个serviceaccout的Secret并且挂载到下面的目录上,里面就有ca.crt和token这两个文件,你可以自己启动一个POD,然后通过
# kubectl describe pods 来查看,一定会在Volumes下面有一个default-token-XXX的东西,并且Mounts里面有下面的目录。
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
# 下面的含义是源标签__meta_kubernetes_namespace等如果其值为default;kubernetes;https标签顺序和值要对应。换句话说就是
# 当__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name三者对应的
# 值为default、kubernetes、https则进行保留,而且该endpoints对应的地址为api server的地址。
#
# __meta_kubernetes_namespace 端点对象的命名空间,在不同对象上这个标签的含义不同,在角色是endpoints中这个是端点对象的名称空间
# __meta_kubernetes_service_name 端点对象的服务名称
# __meta_kubernetes_endpoint_port_name 端点的端口名称
#
# kubernetes默认在default名称空间有一个叫做kubernetes的service,所以这个service的有3个设置对应的就是下面三个标签
# __meta_kubernetes_namespace 值为default
# __meta_kubernetes_service_name 值为kubernetes
# __meta_kubernetes_endpoint_port_name 值为https
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: default;kubernetes;https
# 配置针对kubelet的服务发现以及对标签的处理,是获取kubelet上/metrics接口数据来获取node的资源使用情况
- job_name: 'kubernetes-nodes-kubelet'
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
# 跳过CA验证
# insecure_skip_verify: true
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
# 使用node角色,它使用默认的kubelet提供的http端口来发现集群中每个node节点。那具体地址是什么呢?
# 地址类型有四种NodeInternalIP, NodeExternalIP, NodeLegacyHostIP 和 NodeHostName,默认为这四个中第一个可用的地址。
# 那么这里为什么使用node角色呢?因为node角色就是用来发现kubelet的
# __meta_kubernetes_node_name:节点对象的名字
# __meta_kubernetes_node_label_<labelname>:表示节点对象上的每一个标签
# __meta_kubernetes_node_annotation_<annotationname>:表示节点对象上的每一个annotation
# __meta_kubernetes_node_address_<address_type>:如果存在,那么将是每一个节点地址类型的第一个地址
# Node模式,Prometheus会自动发现Kubernetes中所有Node节点的信息并作为监控的目标Target。
# 而这些Target的访问地址实际上就是Kubelet的访问地址,并且Kubelet实际上直接内置了对Promtheus的支持
- role: node
relabel_configs:
# 保留(.+)匹配到的内容,去掉__meta_kubernetes_node_label_,实际上就是把(.+)当做新标签,然后老标签的值给这个新标签,
# 这里没有设置source_labels,则表示匹配所有标签
- action: labelmap
# 匹配节点对象上的每一个标签
regex: __meta_kubernetes_node_label_(.+)
# 抓取cAdvisor数据,是获取kubelet上/metrics/cadvisor接口数据来获取容器的资源使用情况
- job_name: 'kubernetes-nodes-cadvisor'
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
# 使用角色为node
- role: node
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
# 把__metrics_path__的值替换为/metrics/cadvisor,因为默认是/metrics
- target_label: __metrics_path__
replacement: /metrics/cadvisor
# 抓取服务端点,整个这个任务都是用来发现node-exporter和kube-state-metrics-service的,这里用的是endpoints角色,这是通过这两者的service来发现
# 的后端endpoints。另外需要说明的是如果满足采集条件,那么在service、POD中定义的labels也会被采集进去
- job_name: 'kubernetes-service-endpoints'
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
# 重新打标仅抓取到的具有 "prometheus.io/scrape: true" 的annotation的端点,意思是说如果某个service具有prometheus.io/scrape = true annotation声明则抓取
# annotation本身也是键值结构,所以这里的源标签设置为键,而regex设置值,当值匹配到regex设定的内容时则执行keep动作也就是保留,其余则丢弃.
# node-exporter这个POD的service里面就有一个叫做prometheus.io/scrape = true的annotations所以就找到了node-exporter这个POD
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
action: keep
regex: true
# 应用中自定义暴露的指标,也许你暴露的API接口不是/metrics这个路径,那么你可以在这个POD对应的service中做一个
# "prometheus.io/path = /mymetrics" 声明,下面的意思就是把你声明的这个路径赋值给__metrics_path__
# 其实就是让prometheus来获取自定义应用暴露的metrices的具体路径,不过这里写的要和service中做好约定
# 如果service中这样写 prometheus.io/app-metrics-path: '/metrics' 那么你这里就要
# __meta_kubernetes_service_annotation_prometheus_io_app_metrics_path这样写
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
# 暴露自定义的应用的端口,就是把地址和你在service中定义的 "prometheus.io/port = <port>" 声明做一个拼接
# 然后赋值给__address__,这样prometheus就能获取自定义应用的端口,然后通过这个端口再结合__metrics_path__来获取
# 指标,如果__metrics_path__值不是默认的/metrics那么就要使用上面的标签替换来获取真正暴露的具体路径
- source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
action: replace
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
target_label: __address__
# 重新设置scheme
# 匹配源标签__meta_kubernetes_service_annotation_prometheus_io_scheme也就是prometheus.io/scheme annotation
# 如果源标签的值匹配到regex则把值替换为__scheme__对应的值
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
action: replace
target_label: __scheme__
regex: (https?)
# 下面主要是为了给样本添加额外信息
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_service_name]
action: replace
target_label: kubernetes_name
# 下面是自动发现service,不过如果要想监控service则需要安装blackbox-exporter
- job_name: 'kubernetes-services-http'
metrics_path: /probe
# 生成__param_module="http_2xx"的label,如果是TCP探测则使用 module: [tcp_connect]
params:
module: [http_2xx]
kubernetes_sd_configs:
- role: service
relabel_configs:
# 为了让service可以被探测到,那需要在service的annotation中增加 prometheus.io/scrape: true 声明
# 也就是只保留prometheus.io/scrape: true的service
- action: keep
regex: true
source_labels:
- __meta_kubernetes_service_annotation_prometheus_io_scrape
# 用__address__这个label的值创建一个名为__param_target的label为blackbox-exporter,值为内部service的访问地址,作为blackbox-exporter采集用
- source_labels: [__address__]
target_label: __param_target
# 用blackbox-exporter的service地址值”prometheus-blackbox-exporter:9115"替换原__address__的值
- target_label: __address__
replacement: blackbox-exporter.example.com:9115
- source_labels: [__param_target]
target_label: instance
# 下面主要是为了给样本添加额外信息
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_service_name]
target_label: kubernetes_name
# 下面是对ingresses监控,不过如果要想监控ingresses则需要安装blackbox-exporter
- job_name: 'kubernetes-ingresses'
metrics_path: /probe
# 生成__param_module="http_2xx"的label
params:
module: [http_2xx]
kubernetes_sd_configs:
- role: ingress
relabel_configs:
# Example relabel to probe only some ingresses that have "example.io/should_be_probed = true" annotation
# - source_labels: [__meta_kubernetes_ingress_annotation_example_io_should_be_probed]
# action: keep
# regex: true
- source_labels: [__meta_kubernetes_ingress_scheme,__address__,__meta_kubernetes_ingress_path]
regex: (.+);(.+);(.+)
replacement: ${1}://${2}${3}
target_label: __param_target
- target_label: __address__
replacement: blackbox-exporter.example.com:9115
- source_labels: [__param_target]
target_label: instance
# 下面主要是为了给样本添加额外信息
- action: labelmap
regex: __meta_kubernetes_ingress_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_ingress_name]
target_label: kubernetes_name
# 抓取POD进行监控
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
# POD的 annotation 中含有"prometheus.io/scrape: true" 的则保留,意思就是会被Prometheus抓取,不具有这个的POD则不会被抓取
- action: keep
regex: true
source_labels:
- __meta_kubernetes_pod_annotation_prometheus_io_scrape
# 获取POD的 annotation 中定义的"prometheus.io/path: XXX"定义的值,这个值就是你的程序暴露符合prometheus规范的metrics的地址
# 如果你的metrics的地址不是 /metrics 的话,通过这个标签说,那么这里就会把这个值赋值给 __metrics_path__这个变量,因为prometheus
# 是通过这个变量获取路径然后进行拼接出来一个完整的URL,并通过这个URL来获取metrics值的,因为prometheus默认使用的就是 http(s)://X.X.X.X/metrics
# 这样一个路径来获取的。
- action: replace
regex: (.+)
source_labels:
- __meta_kubernetes_pod_annotation_prometheus_io_path
target_label: __metrics_path__
# 这里是端口信息,因为你的程序很有可能在容器中并不是以80端口运行的,那么就需要做一个拼接http(s)://x.x.x.x:xx/metrics
# __address__在prometheus中代表的就是实例的IP地址,而POD中的annotation 中定义的"prometheus.io/port: XX"就是你程序
# 被访问到的端口,最终在prometheus中将会被显示为 instance=X.X.X.X:XX这样
- action: replace
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
source_labels:
- __address__
- __meta_kubernetes_pod_annotation_prometheus_io_port
target_label: __address__
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_pod_name]
action: replace
target_label: kubernetes_pod_name
我们要去采集 Kubernetes 集群 cAdvisor 的监控数据,在Kubernetes中,kubelet内嵌了cAdvisor,cAdvisor 作为 kubelet 内置的一部分程序可以直接使用,因此我们就可以利用 APIServer 通过 kubelet 去获取到对应的数据,而不需要单独安装cAdvisor了。对Kubernetes的监控Prometheus 通过自动发现KubeConfig 的模式访问 APIServer, Prometheus 单独部署在集群外部 Kubernetes APIServer 时需要 token 文件,所以就需要我们手动提供这个文件,才能够做到自动发现了。
接下来就首先构造 Prometheus 连接 APIServer 的信息,在通过 kubernetes_sd_configs 做服务发现的时候只需要填入 Kubernetes 集群的 api_server、ca_file、bearer_token_file 信息即可,要获得这几个文件信息通过如下操作获取。
在Kubernetes创建用于 Prometheus 访问 Kubernetes 资源对象的 RBAC 对象:
1)在Kubernetes Master节点创建如下yaml文件:
[root@k8s-master ~]#touch prom.rbac.yaml
[root@k8s-master ~]#chmod +x prom.rbac.yaml
[root@k8s-master ~]#vi prom.rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: prometheus
namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: prometheus
rules:
- apiGroups:
- ""
resources:
- nodes
- services
- endpoints
- pods
- nodes/proxy
verbs:
- get
- list
- watch
- apiGroups:
- "extensions"
resources:
- ingresses
verbs:
- get
- list
- watch
- apiGroups:
- ""
resources:
- configmaps
- nodes/metrics
verbs:
- get
- nonResourceURLs:
- /metrics
verbs:
- get
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: prometheus
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: prometheus
subjects:
- kind: ServiceAccount
name: prometheus
namespace: default
2)在 Kubernetes 集群中创建上面的资源对象,Kubernetes Master节点执行:
[root@k8s-master ~]# kubectl apply -f prom.rbac.yaml
3)然后获取上面的 Prometheus 对应的 Secret 的信息:
[root@k8s-master ~]# kubectl get sa prometheus -n default -o yaml
apiVersion: v1
kind: ServiceAccount
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"ServiceAccount","metadata":{"annotations":{},"name":"prometheus","namespace":"default"}}
creationTimestamp: 2020-07-09T02:50:51Z
name: prometheus
namespace: default
resourceVersion: "40572186"
selfLink: /api/v1/namespaces/default/serviceaccounts/prometheus
uid: 003c567a-c18f-11ea-8555-6c92bfa51bf6
secrets:
- name: prometheus-token-td75r
[root@k8s-master ~]# kubectl describe secret prometheus-token-td75r -n default
Name: prometheus-token-td75r
Namespace: default
Labels: <none>
Annotations: kubernetes.io/service-account.name=prometheus
kubernetes.io/service-account.uid=003c567a-c18f-11ea-8555-6c92bfa51bf6
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 7 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6InByb21ldGhldXMtdG9rZW4tdGQ3NXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoicHJvbWV0aGV1cyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjAwM2M1NjdhLWMxOGYtMTFlYS04NTU1LTZjOTJiZmE1MWJmNiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OnByb21ldGhldXMifQ.GG-VVlEiUohBAMldJ_cfYLUoOOkIivucNNi7gZTekqNN1_qLSrq9QsGRaQ7qr-RLjZLQQC54R3gDvm8cE1k0nPkDUfDVzYjXy_GuIjW0eqdSInwfNgh7acqDiZe5XmTJ9UCeSuevG_9D6Vf6RoGKzH9hVjUJBFi1HhfNfv6plGW4xuRAEfjmGLRnaEaM-TMM9c9H8_MhB9NrZ6CspMz7Iiya1noL-XCX5VV8ey_FsOt78tg8Zg_fVQKuTDSzN7auytmgE8c5DxFuaaK8tg_qI8jdffbQmEesdpWkVpRxKhQ5aTXjYDNPoZ9V0tUcgxQFS5RLCXK2MQl_tv4qUV2DJw
注意:上面的 token 和 ca.crt 信息就是我们用于访问 APIServer 的数据,可以将 token 信息复制保存到一个名为 k8s.token 的文本文件中。
检查k8s 核心组件监听地址:
netstat -tlunp | grep kube
tcp 0 0 0.0.0.0:50051 0.0.0.0:* LISTEN 86466/kube-router
tcp 0 0 127.0.0.1:10248 0.0.0.0:* LISTEN 108134/kubelet
tcp 0 0 0.0.0.0:10250 0.0.0.0:* LISTEN 108134/kubelet
tcp 0 0 0.0.0.0:6443 0.0.0.0:* LISTEN 175680/kube-apiserv
tcp 0 0 0.0.0.0:10252 0.0.0.0:* LISTEN 168570/kube-control
tcp 0 0 0.0.0.0:10255 0.0.0.0:* LISTEN 108134/kubelet
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 175680/kube-apiserv
tcp 0 0 0.0.0.0:10258 0.0.0.0:* LISTEN 86466/kube-router
tcp 0 0 0.0.0.0:179 0.0.0.0:* LISTEN 86466/kube-router
tcp 0 0 0.0.0.0:20244 0.0.0.0:* LISTEN 86466/kube-router
tcp 0 0 0.0.0.0:4194 0.0.0.0:* LISTEN 108134/kubelet
访问各个组件 metrics:
curl http://10.18.19.98:8080/metrics #kube-apiser
curl http://10.18.19.98:10251/metrics #kube-schedul
curl http://10.18.19.98:10252/metrics #kube-controlle
curl http://10.18.19.98:10255/metrics #kubelet
curl http://10.18.19.98:10258/metrics #kube-router
现在我们添加一个 Prometheus 监控外部 Kubernetes 集群数据的任务:
在 Prometheus 安装的服务器,找到prometheus.yml 配置文件,增加如下job
[root@VServer3 ~]# vi /usr/local/prometheus/prometheus.yml
- job_name: 'kubernetes-apiservers'
scheme: https
tls_config:
insecure_skip_verify: true
bearer_token_file: k8s.token
kubernetes_sd_configs:
- api_server: https://192.101.10.80:6443 # apiserver 地址,端口默认6443
role: endpoints
bearer_token_file: k8s.token
tls_config:
insecure_skip_verify: true
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: default;kubernetes;https
- job_name: 'kubernetes-nodes-kubelet'
scheme: https
tls_config:
insecure_skip_verify: true
bearer_token_file: k8s.token
kubernetes_sd_configs:
- api_server: https://192.101.10.80:6443 # apiserver 地址
role: node
bearer_token_file: k8s.token
tls_config:
insecure_skip_verify: true
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
# Only for Kubernetes ^1.7.3.
# See: https://github.com/prometheus/prometheus/issues/2916
- target_label: __address__
replacement: 192.101.10.80:6443
- source_labels: [__meta_kubernetes_node_name]
regex: (.+)
target_label: __metrics_path__
replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor
metric_relabel_configs:
- action: replace
source_labels: [id]
regex: '^/machine\.slice/machine-rkt\\x2d([^\\]+)\\.+/([^/]+)\.service$'
target_label: rkt_container_name
replacement: '${2}-${1}'
- action: replace
source_labels: [id]
regex: '^/system\.slice/(.+)\.service$'
target_label: systemd_service_name
replacement: '${1}'
- job_name: 'kubernetes-pods'
scheme: https
tls_config:
insecure_skip_verify: true
bearer_token_file: k8s.token
kubernetes_sd_configs:
- api_server: https://192.101.10.80:6443 # apiserver 地址,端口默认6443
role: pod
bearer_token_file: k8s.token
tls_config:
insecure_skip_verify: true
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
action: replace
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
target_label: __address__
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_pod_name]
action: replace
target_label: kubernetes_pod_name
- job_name: 'kubernetes-services'
metrics_path: /probe
params:
module: [http_2xx]
scheme: https
tls_config:
insecure_skip_verify: true
bearer_token_file: k8s.token
kubernetes_sd_configs:
- api_server: https://192.101.10.80:6443 # apiserver 地址,端口默认6443
role: service
bearer_token_file: k8s.token
tls_config:
insecure_skip_verify: true
relabel_configs:
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_probe]
action: keep
regex: true
- source_labels: [__address__]
target_label: __param_target
- target_label: __address__
replacement: blackbox
- source_labels: [__param_target]
target_label: instance
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_service_name]
target_label: kubernetes_name
- job_name: 'kubernetes-service-endpoints'
scheme: https
tls_config:
insecure_skip_verify: true
bearer_token_file: k8s.token
kubernetes_sd_configs:
- api_server: https://192.101.10.80:6443 # apiserver 地址,端口默认6443
role: endpoints
bearer_token_file: k8s.token
tls_config:
insecure_skip_verify: true
relabel_configs:
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
action: replace
target_label: __scheme__
regex: (https?)
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- source_labels: [__address__]
action: replace
target_label: nodeIp
- source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
action: replace
target_label: __address__
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_service_name]
action: replace
target_label: kubernetes_name
这里 bearer_token_file 就是 Kubernetes Master 上面生成的 k8s.token 文件,然后通过scp 传到 prometheus.yml 的同一目录下,也就是 /usr/local/prometheus/ 下,另外我们也可以使用 bearer_token 直接将k8s.token中的字符串放置在这里,切记得将 api_server 替换成 Kubernetes APIServer 的地址(当然 Prometheus 所在的节点必须能访问到 APIServer 地址)。
我们这里监控 cAdvisor,可以通过 relabel_configs 来配置,将__metrics_path__转换为 /api/v1/nodes/${1}/proxy/metrics/cadvisor,相当于通过 APIServer 代理到 Kubelet 上获取数据,当然如果你的 Prometheus 能够直接访问到 kubelet,也可以配置成直接请求,这样就相当于服务发现使用 APIServer,采集直接走 Kubelet了。
配置完成后,直接启动 Prometheus 即可生效:
[root@VServer3 ~]# sh /script/prometheus_service.sh
现在去 Prometheus 页面就可以看到采集的外部 Kubernetes 集群的数据了!
Prometheus配置文件说明:
# Kubernetes的API SERVER会暴露API服务,Promethues集成了对Kubernetes的自动发现,它有5种模式:Node、Service
# 、Pod、Endpoints、ingress。
# 其实你就是把所有的relabel_configs去掉一样可以对kubernetes做服务发现。relabel_configs仅仅是对采集过来的指标做二次处理,比如
# 要什么不要什么以及替换什么等等。而以__meta_开头的这些元数据标签都是实例中包含的,而relabel则是动态的修改、覆盖、添加删除这些标签
# 或者这些标签对应的值。而且以__开头的标签通常是系统内部使用的,因此这些标签不会被写入样本数据中,如果我们要收集这些东西那么则要进行
# relabel操作。当然reabel操作也不仅限于操作__开头的标签。
#
# action的行为:
# replace:默认行为,不配置action的话就采用这种行为,它会根据regex来去匹配source_labels标签上的值,并将并将匹配到的值写入target_label中
# labelmap:它会根据regex去匹配标签名称,并将匹配到的内容作为新标签的名称,其值作为新标签的值
# keep:仅收集匹配到regex的源标签,而会丢弃没有匹配到的所有标签,用于选择
# drop:丢弃匹配到regex的源标签,而会收集没有匹配到的所有标签,用于排除
# labeldrop:使用regex匹配标签,符合regex规则的标签将从target实例中移除,其实也就是不收集不保存
# labelkeep:使用regex匹配标签,仅收集符合regex规则的标签,不符合的不收集
scrape_configs:
# 用于发现API SERVER
- job_name: 'kubernetes-apiservers'
kubernetes_sd_configs:
# 发现endpoints,它是从列出的服务端点发现目标,这个endpoints来自于Kubernetes中的service,每一个service都有对应的endpoints,这里是一个列表
# 可以是一个IP:PORT也可以是多个,这些IP:PORT就是service通过标签选择器选择的POD的IP和端口。所以endpoints角色就是用来发现server对应的pod的IP的
# kubernetes会有一个默认的service,通过找到这个service的endpoints就找到了api server的IP:PORT,那endpoints有很多,我怎么知道哪个是api server呢
# 这个就靠source_labels指定的标签名称了。
- role: endpoints
# 通过什么形式来连接,默认是https
scheme: https
# 下面这个ca_file和token_file的路径都是默认的,你可能默认设置能用么?其实可以,因为每一个运行起来的POD kubernetes都会为其
# 创建一个serviceaccout的Secret并且挂载到下面的目录上,里面就有ca.crt和token这两个文件,你可以自己启动一个POD,然后通过
# kubectl describe pods 来查看,一定会在Volumes下面有一个default-token-XXX的东西,并且Mounts里面有下面的目录。
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
# 下面的含义是源标签__meta_kubernetes_namespace等如果其值为default;kubernetes;https标签顺序和值要对应。换句话说就是
# 当__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name三者对应的
# 值为default、kubernetes、https则进行保留,而且该endpoints对应的地址为api server的地址。
#
# __meta_kubernetes_namespace 端点对象的命名空间,在不同对象上这个标签的含义不同,在角色是endpoints中这个是端点对象的名称空间
# __meta_kubernetes_service_name 端点对象的服务名称
# __meta_kubernetes_endpoint_port_name 端点的端口名称
#
# kubernetes默认在default名称空间有一个叫做kubernetes的service,所以这个service的有3个设置对应的就是下面三个标签
# __meta_kubernetes_namespace 值为default
# __meta_kubernetes_service_name 值为kubernetes
# __meta_kubernetes_endpoint_port_name 值为https
relabel_configs:
- source_labels: [__meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name]
action: keep
regex: default;kubernetes;https
# 配置针对kubelet的服务发现以及对标签的处理,是获取kubelet上/metrics接口数据来获取node的资源使用情况
- job_name: 'kubernetes-nodes-kubelet'
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
# 跳过CA验证
# insecure_skip_verify: true
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
# 使用node角色,它使用默认的kubelet提供的http端口来发现集群中每个node节点。那具体地址是什么呢?
# 地址类型有四种NodeInternalIP, NodeExternalIP, NodeLegacyHostIP 和 NodeHostName,默认为这四个中第一个可用的地址。
# 那么这里为什么使用node角色呢?因为node角色就是用来发现kubelet的
# __meta_kubernetes_node_name:节点对象的名字
# __meta_kubernetes_node_label_<labelname>:表示节点对象上的每一个标签
# __meta_kubernetes_node_annotation_<annotationname>:表示节点对象上的每一个annotation
# __meta_kubernetes_node_address_<address_type>:如果存在,那么将是每一个节点地址类型的第一个地址
# Node模式,Prometheus会自动发现Kubernetes中所有Node节点的信息并作为监控的目标Target。
# 而这些Target的访问地址实际上就是Kubelet的访问地址,并且Kubelet实际上直接内置了对Promtheus的支持
- role: node
relabel_configs:
# 保留(.+)匹配到的内容,去掉__meta_kubernetes_node_label_,实际上就是把(.+)当做新标签,然后老标签的值给这个新标签,
# 这里没有设置source_labels,则表示匹配所有标签
- action: labelmap
# 匹配节点对象上的每一个标签
regex: __meta_kubernetes_node_label_(.+)
# 抓取cAdvisor数据,是获取kubelet上/metrics/cadvisor接口数据来获取容器的资源使用情况
- job_name: 'kubernetes-nodes-cadvisor'
scheme: https
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
# 使用角色为node
- role: node
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
# 把__metrics_path__的值替换为/metrics/cadvisor,因为默认是/metrics
- target_label: __metrics_path__
replacement: /metrics/cadvisor
# 抓取服务端点,整个这个任务都是用来发现node-exporter和kube-state-metrics-service的,这里用的是endpoints角色,这是通过这两者的service来发现
# 的后端endpoints。另外需要说明的是如果满足采集条件,那么在service、POD中定义的labels也会被采集进去
- job_name: 'kubernetes-service-endpoints'
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
# 重新打标仅抓取到的具有 "prometheus.io/scrape: true" 的annotation的端点,意思是说如果某个service具有prometheus.io/scrape = true annotation声明则抓取
# annotation本身也是键值结构,所以这里的源标签设置为键,而regex设置值,当值匹配到regex设定的内容时则执行keep动作也就是保留,其余则丢弃.
# node-exporter这个POD的service里面就有一个叫做prometheus.io/scrape = true的annotations所以就找到了node-exporter这个POD
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape]
action: keep
regex: true
# 应用中自定义暴露的指标,也许你暴露的API接口不是/metrics这个路径,那么你可以在这个POD对应的service中做一个
# "prometheus.io/path = /mymetrics" 声明,下面的意思就是把你声明的这个路径赋值给__metrics_path__
# 其实就是让prometheus来获取自定义应用暴露的metrices的具体路径,不过这里写的要和service中做好约定
# 如果service中这样写 prometheus.io/app-metrics-path: '/metrics' 那么你这里就要
# __meta_kubernetes_service_annotation_prometheus_io_app_metrics_path这样写
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
# 暴露自定义的应用的端口,就是把地址和你在service中定义的 "prometheus.io/port = <port>" 声明做一个拼接
# 然后赋值给__address__,这样prometheus就能获取自定义应用的端口,然后通过这个端口再结合__metrics_path__来获取
# 指标,如果__metrics_path__值不是默认的/metrics那么就要使用上面的标签替换来获取真正暴露的具体路径
- source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
action: replace
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
target_label: __address__
# 重新设置scheme
# 匹配源标签__meta_kubernetes_service_annotation_prometheus_io_scheme也就是prometheus.io/scheme annotation
# 如果源标签的值匹配到regex则把值替换为__scheme__对应的值
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme]
action: replace
target_label: __scheme__
regex: (https?)
# 下面主要是为了给样本添加额外信息
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_service_name]
action: replace
target_label: kubernetes_name
# 下面是自动发现service,不过如果要想监控service则需要安装blackbox-exporter
- job_name: 'kubernetes-services-http'
metrics_path: /probe
# 生成__param_module="http_2xx"的label,如果是TCP探测则使用 module: [tcp_connect]
params:
module: [http_2xx]
kubernetes_sd_configs:
- role: service
relabel_configs:
# 为了让service可以被探测到,那需要在service的annotation中增加 prometheus.io/scrape: true 声明
# 也就是只保留prometheus.io/scrape: true的service
- action: keep
regex: true
source_labels:
- __meta_kubernetes_service_annotation_prometheus_io_scrape
# 用__address__这个label的值创建一个名为__param_target的label为blackbox-exporter,值为内部service的访问地址,作为blackbox-exporter采集用
- source_labels: [__address__]
target_label: __param_target
# 用blackbox-exporter的service地址值”prometheus-blackbox-exporter:9115"替换原__address__的值
- target_label: __address__
replacement: blackbox-exporter.example.com:9115
- source_labels: [__param_target]
target_label: instance
# 下面主要是为了给样本添加额外信息
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_service_name]
target_label: kubernetes_name
# 下面是对ingresses监控,不过如果要想监控ingresses则需要安装blackbox-exporter
- job_name: 'kubernetes-ingresses'
metrics_path: /probe
# 生成__param_module="http_2xx"的label
params:
module: [http_2xx]
kubernetes_sd_configs:
- role: ingress
relabel_configs:
# Example relabel to probe only some ingresses that have "example.io/should_be_probed = true" annotation
# - source_labels: [__meta_kubernetes_ingress_annotation_example_io_should_be_probed]
# action: keep
# regex: true
- source_labels: [__meta_kubernetes_ingress_scheme,__address__,__meta_kubernetes_ingress_path]
regex: (.+);(.+);(.+)
replacement: ${1}://${2}${3}
target_label: __param_target
- target_label: __address__
replacement: blackbox-exporter.example.com:9115
- source_labels: [__param_target]
target_label: instance
# 下面主要是为了给样本添加额外信息
- action: labelmap
regex: __meta_kubernetes_ingress_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_ingress_name]
target_label: kubernetes_name
# 抓取POD进行监控
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
# POD的 annotation 中含有"prometheus.io/scrape: true" 的则保留,意思就是会被Prometheus抓取,不具有这个的POD则不会被抓取
- action: keep
regex: true
source_labels:
- __meta_kubernetes_pod_annotation_prometheus_io_scrape
# 获取POD的 annotation 中定义的"prometheus.io/path: XXX"定义的值,这个值就是你的程序暴露符合prometheus规范的metrics的地址
# 如果你的metrics的地址不是 /metrics 的话,通过这个标签说,那么这里就会把这个值赋值给 __metrics_path__这个变量,因为prometheus
# 是通过这个变量获取路径然后进行拼接出来一个完整的URL,并通过这个URL来获取metrics值的,因为prometheus默认使用的就是 http(s)://X.X.X.X/metrics
# 这样一个路径来获取的。
- action: replace
regex: (.+)
source_labels:
- __meta_kubernetes_pod_annotation_prometheus_io_path
target_label: __metrics_path__
# 这里是端口信息,因为你的程序很有可能在容器中并不是以80端口运行的,那么就需要做一个拼接http(s)://x.x.x.x:xx/metrics
# __address__在prometheus中代表的就是实例的IP地址,而POD中的annotation 中定义的"prometheus.io/port: XX"就是你程序
# 被访问到的端口,最终在prometheus中将会被显示为 instance=X.X.X.X:XX这样
- action: replace
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
source_labels:
- __address__
- __meta_kubernetes_pod_annotation_prometheus_io_port
target_label: __address__
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_pod_name]
action: replace
target_label: kubernetes_pod_name
发表评论
-
HTTPS的加密原理解读
2021-12-31 11:25 280一、为什么需要加密? 因为http的内容是明文传输的,明文数据 ... -
容器技术的基石: cgroup、namespace和联合文件系统
2021-12-09 10:47 680Docker 是基于 Linux Kernel 的 Names ... -
链路追踪skywalking安装部署
2021-10-21 12:06 792APM 安装部署: 一、下载 版本目录地址:http://a ... -
自动化运维 Ansible 安装部署
2021-08-20 19:06 821一、概述 Ansible 实现了批量系统配置、批量程序部署、 ... -
Linux 下 Kafka Cluster 搭建
2021-07-08 11:23 957概述 http://kafka.apachecn.org/q ... -
ELK RPM 安装配置
2021-06-22 18:59 600相关组件: 1)filebeat。用于收集日志组件,经测试其 ... -
在Kubernetes上部署 Redis 三主三从 集群
2021-03-10 16:25 629NFS搭建见: Linux NFS搭建与配置(https:// ... -
docker-compose 部署ELK(logstash->elasticsearch->kibana)
2020-11-11 18:02 1558概述: ELK是三个开源软件的缩写,分别表示:elastic ... -
Kubernetes1.16.3下部署node-exporter+alertmanager+prometheus+grafana 监控系统
2020-10-28 10:48 1035准备工作 建议将所有的yaml文件存在如下目录: # mkd ... -
Linux NFS 搭建与配置
2020-10-21 17:58 405一、NFS 介绍 NFS 是 Network FileSys ... -
K8S 备份及升级
2020-10-20 15:48 857一、准备工作 查看集群版本: # kubectl get no ... -
API 网关 kong 的 konga 配置使用
2020-09-23 10:46 4104一、Kong 概述: kong的 ... -
云原生技术 Docker、K8S
2020-09-02 16:53 537容器的三大好处 1.资源 ... -
Kubernetes 应用编排、管理与运维
2020-08-24 16:40 562一、kubectl 运维命令 kubectl control ... -
API 网关 kong/konga 安装部署
2020-08-25 17:34 558一、概述 Kong是Mashape开 ... -
Linux 下 Redis Cluster 搭建
2020-08-13 09:14 708Redis集群演变过程: 单 ... -
Kubernetes离线安装的本地yum源构建
2020-08-08 22:41 499一、需求场景 在K8S的使用过程中有时候会遇到在一些无法上网 ... -
Kubernetes 证书延期
2020-08-01 22:28 432一、概述 kubeadm 是 kubernetes 提供的一 ... -
kubeadm方式部署安装kubernetes
2020-07-29 08:01 2336一、前提准备: 0、升级更新系统(切记升级一下,曾被坑过) ... -
Kubernetes 部署 Nginx 集群
2020-07-20 09:32 833一.设置标签 为了保证nginx之能分配到nginx服务器需要 ...
相关推荐
监控Kubernetes集群自身的关键指标,如Pod状态、Controller健康、网络和存储资源的使用情况等,需要在集群内部署Prometheus。由于Kubernetes的安全性(RBAC和证书认证),直接在集群内部署Prometheus更为便捷。然而...
本资源"**k8s集群部署prometheus监控.zip**"提供了一键部署Prometheus监控到Kubernetes集群的全套配置,涵盖了metrics服务发现、ingress访问控制以及配置管理等多个关键环节。 首先,我们来深入理解Prometheus。...
在Kubernetes(简称K8s)集群中,监控是非常重要的。使用Prometheus可以对K8s集群进行全方位的监控。Prometheus是一个基于云原生的监控系统,由Google开发, CNCF第二个开源项目。Prometheus具有多维度数据模型、...
Prometheus作为一款流行的开源监控系统和时间序列数据库,被广泛用于收集和分析K8S集群中的各种指标。为了实现全面的监控,包括对外部服务的黑盒监控,Prometheus引入了blackbox-exporter。本篇将详细讲解如何在K8S...
在Kubernetes(k8s)集群中安装`kube-prometheus`是监控系统的重要步骤,它提供了全面...通过以上步骤,可以在Kubernetes集群中快速安装并配置好kube-prometheus监控系统,从而有效地监控和管理集群的健康状况和性能。
- `prometheus-service.yaml` 和 `grafana-service.yaml`:分别定义了 Prometheus 和 Grafana 的 Kubernetes Service,使它们在集群内部可访问,并可能暴露到外部以供其他系统使用。 4. **集成与扩展**: - ...
在Kubernetes集群中,监控是确保系统稳定性和性能的关键组成部分。Kubernetes监控通常涉及收集、分析和可视化集群中各种组件和服务的状态数据。本篇将详细阐述在Kubernetes中使用到的一些核心监控工具及其镜像包,...
在Kubernetes 1.16版本中,部署Prometheus、node-exporter以及Grafana监控系统是一项关键的任务,用于实时...通过以上步骤,你可以建立起一个强大的监控系统,实时监控Kubernetes集群的运行状况,及时发现并解决问题。
- **Prometheus**:基于时间序列数据的容器监控解决方案,适合监控Docker容器和Kubernetes集群。 在实施监控系统时,公司应根据自身的业务特点和监控需求,选择适合的监控工具和实施策略。Prometheus由于其对容器和...
Kubernetes 集群监控变得简单 目录 关于该项目 ShipShape 是一个用于 Kubernetes 监控的开源 Web 应用程序。 ShipShape 允许用户通过不同粒度级别的易于解释的图表来跟踪大量 Kubernetes 集群指标。 主要功能包括...
本教程将带你深入理解如何在本地环境中设置并运行一个Kubernetes集群,以便进行学习、测试或开发。Kubernetes(简称K8s)是一个开源的容器编排系统,用于自动化容器化应用的部署、扩展和管理。通过在本地运行...
通过选择合适的监控对象和指标、快速部署集群级别的监控、监控 Cluster、Kubernetes Control Plane、ETCD、Node、Fluentd、Workload、Pod、Container、使用 Grafana、暴露自定义的监控指标、快速部署项目级别的监控...
这意味着在Kubernetes集群内部署Prometheus可以轻松实现对整个集群及其应用的全面监控。 #### 四、基础配置 下面是一些关于如何在服务端安装Prometheus的基本步骤示例: 1. **修改主机名**: ```shell ...
Kubernetes集群的健康监控和日志收集是维护集群稳定运行的关键。常用工具如Prometheus、Grafana、ELK(Elasticsearch、Logstash、Kibana)堆栈等。 六、Kubernetes实践案例 实践案例包括高可用集群部署、端口映射...
3. **健康检查与自我修复**:使用监控和告警系统,如Prometheus和Alertmanager,对集群组件进行健康检查,当检测到问题时触发自我修复流程。 **四、kubeadm高可用部署** 在kubeadm中实现HA部署,需要以下步骤: 1. ...
Ingress 是一种负载均衡器,用于将外部流量路由到集群内部。 3. 如何使用 Kubernetes 实现服务发现?使用 DNS 服务发现可以实现服务发现。 存储管理 1. Kubernetes 的存储管理有哪些?Kubernetes 的存储管理包括 ...
Kubernetes是当今最流行的...通过学习这些材料,你可以深入了解如何在生产环境中高效地利用Kubernetes进行应用部署,使用Prometheus监控Kubernetes集群的健康状况,以及如何将DevOps实践融入日常工作中,提升团队效率。
6. **设置监控和日志**:部署Prometheus、Grafana等监控工具,以及日志收集和分析解决方案,如Elasticsearch和Kibana。 7. **测试验证**:运行测试用例,确保FaaS框架在Kubernetes集群上成功运行并可以接受和执行...
总结来说,这个压缩包提供了一整套监控解决方案的yaml配置,涵盖了从数据收集(Prometheus、node-exporter)、数据存储和查询(Prometheus)、到数据展示(Grafana)以及在Kubernetes集群内部的自动化部署。...
Prometheus具有强大的性能,足以应对大规模集群的监控需求。 **核心特点** 1. **多维度数据模型**:Prometheus的数据模型允许灵活的查询和分析,通过PromQL查询语言实现。 2. **本地部署**:Prometheus不依赖外部...