1.Kubernetes集群内实现部署Prometheus的方案是什么,此方案的优势有什么?

1.使用Prometheus Operator以及helm工具在Kubernetes集群上部署Prometheus服务,Prometheus Operator允许用户能够使用简单配置和管理Prometheus实例。这些配置将响应、创建、配置及管理Prometheus监控实例。

使用Operator部署Prometheus,以后如果要添加监控对象或者添加告警规则,只需要编写对应的ServiceMonitor和Prometheus资源就,不用重启Prometheus服务,Operator会动态的观察配置的改动,并将其生成对应的Prometheus配置文件其中Operator可以部署、管理Prometheus Service。

2、在Prometheus Operator中,会创建Prometheus、ServiceMonitor、AlertManager以及PrometheusRule 4个CRD资源对象。这些API对象全都是用CRD定义好Schema的,api-server会帮我们做校验,这就大大降低了配置异常的风险。ServiceMonitor和PrometheusRule这两个对象解决了Prometheus配置难维护的问题。

Prometheus Operator借助Kubernetes把Prometheus服务平台进行优化,实现Prometheus as a Service。在有了Prometheus和Alertmanager非常明确API对象之后,用户就能够以Kubernetes 平台为底座,自助式地创建Prometheus服务或Alertmanager 服务。这些新的API对象基于Operator模式,具有基于Kubernetes进行扩展的优势。

容器平台Prometheus:

 1、单个生产机房按采集指标划分K8S调度部署多个prome 1、prome 2

 2、用K8S保证基层prome的可用性

 3、汇聚数据至上层prome A与prome B,两个节点独立写库,两套持久数据库单点部署,分别保留独立数据,以保证数据多副本

 4、告警数据从2个prome获取,经过gossip筛选产生告警

 5、Kibana经过负载均衡获取prome数据出图

3.Prometheus有snmp的exporter可以实现网络监控。Prometheus通过snmp_exporter抓取网络设备流量数据。用Prometheus监控网络设备流量首先需要确定安装prometheus 的机器已经被网络设备允许获取它的数据。

4.Prometheus监控k8s自动发现服务

在Kubernetes下Prometheus需要与Kubernetes的API进行交互,从而能够动态的发现Kubernetes中部署的所有可监控的目标资源。 

目前主要支持5种服务发现模式,分别是:Node、Service、Pod、Endpoints、Ingress。 

为了让Prometheus能够获取到当前集群中所有节点的信息, 在Prometheus配置文件中 ,添加如下Job配置:

- job_name: 'kubernetes-nodes'
  tls_config:
    ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
  bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
  # 指定用于访问Kubernetes API的ca以及token文件路径 
  kubernetes_sd_configs:
  - role: node
  # 指定kubernetes_sd_config的模式为node,Prometheus会自动从Ku

对于Ingress,Service,Endpoints, Pod的使用方式也是类似,Prometheus配置的示例:

apiVersion: v1
data:
  prometheus.yml: |-
    global:
      scrape_interval:     15s 
      evaluation_interval: 15s
    scrape_configs:
    
    - job_name: 'kubernetes-nodes'
      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:
      - role: node
      
    - job_name: 'kubernetes-service'
      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:
      - role: service
      
    - job_name: 'kubernetes-endpoints'
      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:
      - role: endpoints
      
    - job_name: 'kubernetes-ingress'
      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:
      - role: ingress
      
    - job_name: 'kubernetes-pods'
      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:
      - role: pod
      
kind: ConfigMap
metadata:
  name: prometheus-config

更新配置文件, 并重建Prometheus实例:

$ kubectl apply -f prometheus-config.yml
configmap "prometheus-config" configured
$ kubectl get pods
prometheus-69f9ddb588-rbrs2        1/1       Running   0          4m
$ kubectl delete pods prometheus-69f9ddb588-rbrs2
pod "prometheus-69f9ddb588-rbrs2" deleted
$ kubectl get pods
prometheus-69f9ddb588-rbrs2        0/1       Terminating   0          4m
prometheus-69f9ddb588-wtlsn        1/1       Running       0          14s

Prometheus使用新的配置文件重建之后,打开Prometheus UI,通过Service Discovery页面可以查看到当前Prometheus通过Kubernetes发现的所有资源对象。

同时Prometheus会自动将该资源的所有信息,并通过标签的形式体现在Target对象上。

5.Pod内存使用率高,怎样优化占用内存

Promtheus提供了基础的预测能力,基于当前的变化速度,推测一段时间后的值。Prometheus的Deriv和Predict_Linear函数可以满足这种需求。

predict_linear函数:对曲线变化速率进行计算,起到一定的预测作用。比如当前这1个小时的内存可用率急剧下降,这种情况可能导致内存已满,这时可以使用该函数,用当前1小时的数据去预测未来几个小时的状态,实现提前告警。

以mem_free为例,实际内存可用以mem_available为准。

执行查询:mem_free{instanceIP="xxx.xxxx.xxx.xxx"}/1024/1024

结果显示最近一小时的free值一直在下降。

deriv函数可以显示指标在一段时间的变化速度:

deriv(mem_free{instanceIP="xxx.xxxx.xxx.xxx"}[1h])

predict_linear函数是预测基于这种速度,最后可以达到的值:

predict_linear(mem_free{instanceIP="xxx.xxxx.xxx.xxx"}[1h], 2*3600)/1024/1024

可以基于设置合理的告警规则,如小于10时触发告警:

rule: predict_linear(mem_free{instanceIP="xxx.xxxx.xxx.xxx"}[1h], 2*3600)/1024/1024 <10

predict_linear与deriv的关系: 含义上约等于如下表达式,但predict_linear稍微要准确些。

deriv(mem_free{instanceIP="xxx.xxxx.xxx.xxx"}[1h]) * 2 * 3600
+
  mem_free{instanceIP="xxx.xxxx.xxx.xxx"}[1h]

2、如果采集任务的数据指标数量非常巨大,就要考虑Prometheus的hash分区采集,分摊压力。还可以考虑去掉一些没必要的指标。