k8s资源监控


k8s 资源监控

kubernetes新一代的监控模型由:核心指标流水线和第三方非核心监控流水线组成。核心指标流水线由kubeletmetric-server 以及由API-server提供的API组成;负责CPU累积使用率、内存实时使用率、POD资源占用率、 Container磁盘占用率等。而第三方非核心监控流水线 负责从OS收集各种指标数据并提供给终端用户、存储系统、 以及HPA等。 监控系统收集两种指标: 资源指标与自定义指标。

Metrics-server 是资源指标API 。它提供核心指标,包括CPU累积使用率、内存实时使用率、Pod 的资源占用率及 容器的磁盘占用率。这些指标由kubeletmetrics-server以及由API server提供的。

Prometheus是自定义指标的提供者。它收集的数据还需要经过kube-state-metrics转换处理,再由 k8s-prometheus-adapter 输出为metrics-api 才能被 kubernetes cluster 所读取。用于从系统收集各种指标数据,并经过处理提供给 终端用户、存储系统以及 HPA,这些数据包括核心指标和许多非核心指标。

资源指标**API** 负责收集各种资源指标,但它需要扩展APIServer 。 可以利用 aggregatormetrics-serverAPIServer进行聚合,达到扩展功能的效果。这样 就可以利用扩展的 API Server 功能(即资源指标API)进行收集 各种资源指标(1.8+支持)。kubectl topHPA等功能组件 必须依赖资源指标 API (早期版本它们依赖heapster)。

``HPA`根据CPUMemoryIOnet connections等指标进行扩展或收缩(早期的heapster只能提供CPUMemory指标)

一、metrics-server

是托管在kubernetes cluster上的一个Pod ,再由 kube-aggregator 将它和原API Server 进行聚合,达到扩展API 的 效果。它是现在 kubectl top 、HPA的前提依赖。

部署**metrics-server** 如下:

参考 :https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/metrics-server

当metrics-server部署完毕后,如上所示可以查看到 metrics相关的API,并且可以使用kubectl top 命令查看node或 pod的资源占用情况 。

如果需要安装最新版本可以

git clone https://github.com/kubernetes-incubator/metrics-server.git

cd metrics-server/deploy/1.8+/

kubectl apply -f ./

如果发现metrics-serverpod可以正常启动,但在执行kubectl top node时提示metrics-server 不可用,在执行 kubectl log metrics-server-* -n kube-system 时有错 误提示,很可能是因为:resource-reader.yaml 文件中 ClusterRolerules中缺少 namespaces 权限,以及metrics-server-deployment.yaml文件中container下缺少以下语句,以忽略tls认证。

command:
   - /metrics-server
   - --kubelet-insecure-tls
   - --kubelet-preferred-address-types=InternalIP
二、Prometheus

官网 : https://prometheus.io

Architecture

BNhGyF.png

Prometheus 通过node_exporter获取各Nodes的信息。 node_exporter**它只负责节点级别的信息汇总,如果需要**

采集其它指标数据,就需要部署专用的**exporter** 。 Prometheus 通过 metrics-url 地址到各Pods获取数据 。

prometheus 提供了一个Restful 风格的PromQL接口,可以让用户输入查询表达式。但K8s的 API Server 无法查询

其值 ,因为它们默认的数据格式不统一。数据需要kube-state-metrics组件将其处理、转换,然后由k8s

prometheus-adapter组件读取并聚合到API上,最后 kubernetes cluster 的API server 才能识别。 所以各节点需

要部署**node_exporter** 组件,然后**Prometheus从各节点的node_exporter上获取infomation**,然后就可以通过

PromQL 查询各种数据。这些数据的格式再由**kube-state-metrics组件进行转换,然后再由kube-prometheus**

adapter**组件将转换后的数据输出为**Custom metrics API ,并聚合到**API**上,以便用户使用

BNhWFI.png

部署**kubernetes**, 如下:

参考 :https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/prometheus

1) 定义名称空间

kubectl apply -f namespace.yaml

2) 部署**node_exporter**

cd node_exporter/ 
kubectl apply -f ./

3) 部署**prometheus**

cd ../prometheus/ 
kubectl apply -f ./

4) 部署**kube-state-metrics**

cd ../kube-state-metrics/ 
kubectl apply -f ./

5) 部署**prometheus-adapter**

参考 :https://github.com/DirectXMan12/k8s-prometheus-adapter/tree/master/deploy

cd ../k8s-prometheus-adapter/ 
grep secretName custom-metrics-apiserver-deployment.yaml 
cd /etc/kubernetes/pki/ 
(umask 077; openssl genrsa -out serving.key 2048)
openssl req -new -key serving.key -out serving.csr -subj "/CN=serving" 
openssl x509 -req -in serving.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out serving.crt -days 3650 
kubectl create secret generic cm-adapter-serving-certs --from-file=serving.crt=./serving.crt --from-file=serving.key=./serving.key -n prom kubectl get secret -n prom 
cd - 
kubectl apply -f ./

6) 部署**alertmanager**

cd ../alertmanager/ 
kubectl create secret generic dingtalk-secret --from- literal=token=fasdfsfsdfgsdfg944dsfgsdfgsadfsdfgsdfgsdfgsdfgsdfgsdfgsdfgfasert -n prom 
kubectl apply -f ./

钉钉报警参考:https://github.com/cnych/alertmanager-dingtalk-hook

route: 
  group_by: ['alertname'] # 报警分组依据 
  group_wait: 10s # 最初即第一次等待多久时间发送一组警报的通知 
  group_interval: 10s # 在发送新警报前的等待时间 
  repeat_interval: 5m # 发送重复警报的周期 对于email配置中,此项不可以设置过低,否则将会由于邮件发送太 多频繁,被smtp服务器拒绝 
  receiver: 'email' # 发送警报的接收者的名称,以下receivers name的名称
三、**Grafana**

grafana 是一个可视化面板,有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编辑器,支持 Graphite、zabbix、InflfluxDB、Prometheus、OpenTSDB、Elasticsearch 等作为数据源,比 Prometheus 自带的 图表展示功能强大太多,更加灵活,有丰富的插件,功能更加强大。(使用promQL语句查询出了一些数据,并且在 Prometheus 的 Dashboard 中进行了展示,但是明显可以感觉到 Prometheus 的图表功能相对较弱,所以一般会使用第三方的工具展示这些数据,例Grafana)

部署**Grafana** 参考 :https://github.com/kubernetes/heapster/tree/master/deploy/kube-confifig/inflfluxdb

cd grafana/ 
kubectl apply -f grafana.yaml 
kubectl get pods -n prom

Grafana的使用,默认用户名密码都是admin,登录后首先添加数据源 (如果登录grafana web 时不用输入用户名、 密码即可操作,说明在grafana.yml 文件中的GF_AUTH_ANONYMOUS_ENABLED 项设置了true,导致匿名用户以 admin的角色登录;将其更改为 false,然后再次kubectl apply -f grafana.yml 即可解决 )

BNtacT.png

四、**Ingress-nginx**
# cat ingress-rule-monitor-svc.yaml
apiVersion: extensions/v1beta1 
kind: Ingress 
metadata: 
  name: ingress-rule-monitor 
  namespace: prom 
  annotations: 
    kubernetes.io/ingress.class: "nginx" 
    nginx.ingress.kubernetes.io/whitelist-source-range: "10.0.0.0/8, 192.168.0.0/16" 
spec: 
  rules: 
  - host: grafana-devel.domain.cn 
    http: 
      paths: 
      - path: /v1
        backend: 
          serviceName: monitoring-grafana 
          servicePort: 80 
  - host: prometheus-devel.domain.cn 
    http: 
      paths: 
      - path: /v1
        backend: 
          serviceName: prometheus 
          servicePort: 9090 

# kubectl apply -f ingress-rule-monitor-svc.yaml
五、**Exporters and integrations**
--- 
apiVersion: v1 
kind: Service 
metadata: 
  name: nginx-svc 
  labels: 
    app: nginx 
  annotations: 
    prometheus.io/scrape: "true" 
    prometheus.io/port: "9113" 
spec: 
  ports: 
  - port: 80 
    name: http 
  - port: 443 
    name: https 
  - port: 9113
    name: exporter-port
  selector: 
    app: nginx 
    #type: NodePort 

--- 
apiVersion: apps/v1 
kind: Deployment 
metadata: 
  name: nginx 
spec: 
  replicas: 1 
  selector: 
    matchLabels: 
      app: nginx 
  template: 
    metadata: 
      labels: 
        app: nginx 
      annotations: 
        prometheus.io/scrape: "true" 
        prometheus.io/port: "9113" 
    spec: 
      containers: 
      - name: nginx 
        image: nginx:latest 
        imagePullPolicy: IfNotPresent 
        ports: 
        - containerPort: 80 
          name: http 
        - containerPort: 443 
          name: https 
      - name: nginx-exporter 
        image: nikosch86/nginx_exporter:latest 
        resources: 
         requests: 
           cpu: 100m 
           memory: 100Mi 
        ports: 
        - containerPort: 9113 
          name: exporter-port

 上一篇
Kubernetes-二进制部署 Kubernetes-二进制部署
安装1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式: · kubeadm Kubeadm是一个K8s部署工具,提供kubeadm init和kubeadm join,用于快速部署
2020-11-15
下一篇 
SQL语句优化 SQL语句优化
1、注意通配符中Like的使用以下写法会造成全表的扫描,例如: select id,name from userinfo where name like '%name%' select id,name from userinfo wher
2020-11-10
  目录