k8s 资源监控
kubernetes
新一代的监控模型由:核心指标流水线和第三方非核心监控流水线组成。核心指标流水线由kubelet
、metric-server
以及由API-server
提供的API
组成;负责CPU
累积使用率、内存实时使用率、POD
资源占用率、Container
磁盘占用率等。而第三方非核心监控流水线 负责从OS
收集各种指标数据并提供给终端用户、存储系统、 以及HPA
等。 监控系统收集两种指标: 资源指标与自定义指标。
Metrics-server
是资源指标API
。它提供核心指标,包括CPU
累积使用率、内存实时使用率、Pod
的资源占用率及 容器的磁盘占用率。这些指标由kubelet
、metrics-server
以及由API server
提供的。
Prometheus
是自定义指标的提供者。它收集的数据还需要经过kube-state-metrics
转换处理,再由k8s-prometheus-adapter
输出为metrics-ap
i 才能被kubernetes cluster
所读取。用于从系统收集各种指标数据,并经过处理提供给 终端用户、存储系统以及HPA
,这些数据包括核心指标和许多非核心指标。
资源指标**
API
** 负责收集各种资源指标,但它需要扩展APIServer
。 可以利用aggregator
将metrics-server
与APIServer
进行聚合,达到扩展功能的效果。这样 就可以利用扩展的API Server
功能(即资源指标API
)进行收集 各种资源指标(1.8+支持)。kubectl top
、HPA
等功能组件 必须依赖资源指标API
(早期版本它们依赖heapster
)。
``HPA`根据
CPU
、Memory
、IO
、net connections
等指标进行扩展或收缩(早期的heapster
只能提供CPU
、Memory
指标)
一、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-server
的pod
可以正常启动,但在执行kubectl top node时提示metrics-server
不可用,在执行 kubectl log metrics-server-* -n kube-system
时有错 误提示,很可能是因为:resource-reader.yaml
文件中 ClusterRole
的rules
中缺少 namespaces
权限,以及metrics-server-deployment.yaml
文件中container
下缺少以下语句,以忽略tls
认证。
command:
- /metrics-server
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP
二、Prometheus
Architecture
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**上,以便用户使用。
部署**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 即可解决 )
四、**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