Kubernetes监控篇
目录
1、K8S监控指标
1.1 Kubernetes本身监控
1.2 Pod监控
1.3 Prometheus监控K8S架构
2、部署Prometheus+Grafana
2.1 部署Prometheus
2.1.1 创建rbac
2.1.2 创建配置项
2.1.3 部署prometheus
2.1.4 配置service
2.1.5 访问prometheus
2.2 部署Grafana
3、参考网站
1、K8S监控指标
1.1 Kubernetes本身监控
• Node资源利用率 :一般生产环境几十个node,几百个node去监控
• Node数量 :一般能监控到node,就能监控到它的数量了,因为它是一个实例,一个node能跑多少个项目,也是需要去评估的,整体资源率在一个什么样的状态,什么样的值,所以需要根据项目,跑的资源利用率,还有值做一个评估的,比如再跑一个项目,需要多少资源。
• Pods数量(Node):其实也是一样的,每个node上都跑多少pod,不过默认一个node上能跑110个pod,但大多数情况下不可能跑这么多,比如一个128G的内存,32核cpu,一个java的项目,一个分配2G,也就是能跑50-60个,一般机器,pod也就跑几十个,很少很少超过100个。
• 资源对象状态 :比如pod,service,deployment,job这些资源状态,做一个统计。
1.2 Pod监控
• Pod数量(项目):你的项目跑了多少个pod的数量,大概的利益率是多少,好评估一下这个项目跑了多少个资源占有多少资源,每个pod占了多少资源。
• 容器资源利用率 :每个容器消耗了多少资源,用了多少CPU,用了多少内存
• 应用程序:这个就是偏应用程序本身的指标了,这个一般在我们运维很难拿到的,所以在监控之前呢,需要开发去给你暴露出来,这里有很多客户端的集成,客户端库就是支持很多语言的,需要让开发做一些开发量将它集成进去,暴露这个应用程序的想知道的指标,然后纳入监控,如果开发部配合,基本运维很难做到这一块,除非自己写一个客户端程序,通过shell/python能不能从外部获取内部的工作情况,如果这个程序提供API的话,这个很容易做到。
1.3 Prometheus监控K8S架构
如果想监控node的资源,就可以放一个node_exporter,这是监控node资源的,node_exporter是Linux上的采集器,你放上去你就能采集到当前节点的CPU、内存、网络IO,等待都可以采集的。
如果想监控容器,k8s内部提供cAdvisor采集器,pod呀,容器都可以采集到这些指标,都是内置的,不需要单独部署,只知道怎么去访问这个Cadvisor就可以了。
如果想监控k8s资源对象,会部署一个kube-state-metrics这个服务,它会定时的API中获取到这些指标,帮你存取到Prometheus里,要是告警的话,通过Alertmanager发送给一些接收方,通过Grafana可视化展示。
监控指标 |
具体实现 |
举例 |
pod性能 |
cAdvisor |
容器CPU,内存利用率 |
node性能 |
node-exporter |
节点CPU,内存利用率 |
k8s资源对象 |
kube-state-metrics |
pod/deployment/service |
2、部署Prometheus+Grafana
2.1 部署Prometheus
2.1.1 创建rbac
现在先来创建rbac,因为部署它的主服务主进程要引用这几个服务。因为prometheus来连接你的API,从API中获取很多的指标,并且设置了绑定集群角色的权限,只能查看,不能修改。
cat prometheus-ra.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: prometheus
rules:
- apiGroups: [""]resources:- nodes- nodes/proxy- services- endpoints- podsverbs: ["get", "list", "watch"]
- apiGroups:- extensionsresources:- ingressesverbs: ["get", "list", "watch"]
- nonResourceURLs: ["/metrics"]verbs: ["get"]
---
apiVersion: v1
kind: ServiceAccount
metadata:name: prometheusnamespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: prometheus
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: prometheus
subjects:
- kind: ServiceAccountname: prometheusnamespace: kube-system
创建rbac
kubectl create -f prometheus-ra.yaml
[root@VM-0-12-tlinux ~]# kubectl create -f prometheus-ra.yaml
clusterrole.rbac.authorization.k8s.io/prometheus created
serviceaccount/prometheus created
clusterrolebinding.rbac.authorization.k8s.io/prometheus created
2.1.2 创建配置项
cat prometheus-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: prometheus-confignamespace: kube-system
data:prometheus.yml: |global:scrape_interval: 15sevaluation_interval: 15sscrape_configs:- job_name: 'kubernetes-apiservers'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- job_name: 'kubernetes-nodes'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_(.+)- target_label: __address__replacement: kubernetes.default.svc:443- source_labels: [__meta_kubernetes_node_name]regex: (.+)target_label: __metrics_path__replacement: /api/v1/nodes/${1}/proxy/metrics- job_name: 'kubernetes-cadvisor'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_(.+)- target_label: __address__replacement: kubernetes.default.svc:443- source_labels: [__meta_kubernetes_node_name]regex: (.+)target_label: __metrics_path__replacement: /api/v1/nodes/${1}/proxy/metrics/cadvisor- job_name: 'kubernetes-service-endpoints'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: (.+)- source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]action: replacetarget_label: __address__regex: ([^:]+)(?::\d+)?;(\d+)replacement: $1:$2- action: labelmapregex: __meta_kubernetes_service_label_(.+)- source_labels: [__meta_kubernetes_namespace]action: replacetarget_label: kubernetes_namespace- source_labels: [__meta_kubernetes_service_name]action: replacetarget_label: kubernetes_name- job_name: 'kubernetes-services'kubernetes_sd_configs:- role: servicemetrics_path: /probeparams:module: [http_2xx]relabel_configs:- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_probe]action: keepregex: true- source_labels: [__address__]target_label: __param_target- target_label: __address__replacement: blackbox-exporter.example.com:9115- source_labels: [__param_target]target_label: instance- action: labelmapregex: __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-ingresses'kubernetes_sd_configs:- role: ingressrelabel_configs:- source_labels: [__meta_kubernetes_ingress_annotation_prometheus_io_probe]action: keepregex: 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: labelmapregex: __meta_kubernetes_ingress_label_(.+)- source_labels: [__meta_kubernetes_namespace]target_label: kubernetes_namespace- source_labels: [__meta_kubernetes_ingress_name]target_label: kubernetes_name- job_name: 'kubernetes-pods'kubernetes_sd_configs:- role: podrelabel_configs:- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]action: keepregex: true- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]action: replacetarget_label: __metrics_path__regex: (.+)- source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]action: replaceregex: ([^:]+)(?::\d+)?;(\d+)replacement: $1:$2target_label: __address__- action: labelmapregex: __meta_kubernetes_pod_label_(.+)- source_labels: [__meta_kubernetes_namespace]action: replacetarget_label: kubernetes_namespace- source_labels: [__meta_kubernetes_pod_name]action: replacetarget_label: kubernetes_pod_name
kubectl create -f prometheus-config.yaml
[root@VM-0-12-tlinux ~]# kubectl create -f prometheus-config.yaml
configmap/prometheus-config created
2.1.3 部署prometheus
cat prometheus.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:name: prometheus-deploymentname: prometheusnamespace: kube-system
spec:replicas: 1selector:matchLabels:app: prometheustemplate:metadata:labels:app: prometheusspec:containers:- image: prom/prometheus:v2.0.0name: prometheuscommand:- "/bin/prometheus"args:- "--config.file=/etc/prometheus/prometheus.yml"- "--storage.tsdb.path=/prometheus"- "--storage.tsdb.retention=24h"ports:- containerPort: 9090protocol: TCPvolumeMounts:- mountPath: "/prometheus"name: data- mountPath: "/etc/prometheus"name: config-volumeresources:requests:cpu: 100mmemory: 100Milimits:cpu: 500mmemory: 1500MiserviceAccountName: prometheus volumes:- name: dataemptyDir: {}- name: config-volumeconfigMap:name: prometheus-config
执行下面命令
[root@VM-0-12-tlinux ~]# kubectl create -f prometheus.yaml
deployment.apps/prometheus created
[root@VM-0-12-tlinux ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-65d9c796fc-jhrgt 0/1 Pending 0 3h24m
coredns-65d9c796fc-pb66f 1/1 Running 0 3h24m
ip-masq-agent-sn6nw 1/1 Running 0 3h21m
kube-proxy-qv9q9 1/1 Running 0 3h21m
l7-lb-controller-66c5cd4f46-fj6mt 1/1 Running 0 3h24m
prometheus-5dd6c4b799-9jjmm 1/1 Running 0 44s
tke-bridge-agent-4czmq 1/1 Running 0 3h21m
tke-cni-agent-kdnrd 1/1 Running 0 3h21m
2.1.4 配置service
[root@VM-0-12-tlinux ~]# cat prometheus-service.yaml
apiVersion: v1
kind: Service
metadata:name: prometheus-servicenamespace: kube-systemlabels:app: prometheus-service
spec:type: NodePortports:- port: 80name: httptargetPort: 9090selector:app: prometheus
执行命令
[root@VM-0-12-tlinux ~]# kubectl create -f prometheus-service.yaml
service/prometheus-service created
[root@VM-0-12-tlinux ~]# kubectl get svc -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hpa-metrics-service ClusterIP 172.20.255.174 <none> 443/TCP 3h27m
kube-dns ClusterIP 172.20.255.135 <none> 53/TCP,53/UDP 3h27m
prometheus-service NodePort 172.20.254.64 <none> 80:32264/TCP 14s
2.1.5 访问prometheus
点开链接:http://127.0.0.1:32264
http://${service IP}:${随机端口}/graph
2.2 部署Grafana
执行命令
docker run -d -p 3000:3000 --network=host --name grafana grafana/grafana
3、参考网站
官方网站:Prometheus - Monitoring system & time series database
GitHub地址:Prometheus · GitHub
服务发现: Configuration | Prometheus
Kubernetes监控篇相关推荐
- Kubernetes监控之Heapster源码分析
源码版本 heapster version: release-1.2 简介 Heapster是Kubernetes下的一个监控项目,用于进行容器集群的监控和性能分析. 基本的功能及概念介绍可以回顾我之 ...
- Kubernetes监控在小米的落地
戳蓝字"CSDN云计算"关注我们哦! 转自:小米云技术 作者:郭如意 本文介绍了高可用.持久存储.可动态调整的Kubernetes监控方案的实现过程. 小米的弹性调度平台(Ocea ...
- Kubernetes监控:部署Heapster、InfluxDB和Grafana
全栈工程师开发手册 (作者:栾鹏) 架构系列文章 Kubernetes 监控方案 可选的方案: Heapster + InfluxDB + Grafana Prometheus + Grafana C ...
- 系统架构面临的三大挑战,看 Kubernetes 监控如何解决?
作者|炎寻 审核&校对:白玙 编辑&排版:雯燕 大家好,我是阿里云云原生应用平台的炎寻,很高兴能与大家继续分享 Kubernetes 监控系列公开课.前两期公开课我们讲到了 Vol.1 ...
- 通过Kubernetes监控探索应用架构,发现预期外的流量
大家好,我是阿里云云原生应用平台的炎寻,很高兴能和大家一起在 Kubernetes 监控系列公开课上进行交流.本次公开课期望能够给大家在 Kubernetes 容器化环境中快速发现和定位问题带来新的解 ...
- 简单、有效、全面的Kubernetes监控方案
简介:近年来,Kubernetes作为众多公司云原生改造的首选容器化编排平台,越来越多的开发和运维工作都围绕Kubernetes展开,保证Kubernetes的稳定性和可用性是最基础的需求,而这其中最 ...
- 云原生应用 Kubernetes 监控与弹性实践
前言 云原生应用的设计理念已经被越来越多的开发者接受与认可,而Kubernetes做为云原生的标准接口实现,已经成为了整个stack的中心,云服务的能力可以通过Cloud Provider.CRD C ...
- 搭建前端监控系统(四)接口请求异常监控篇
背景:市面上的监控系统有很多,大多收费,对于小型前端项目来说,必然是痛点.另一点主要原因是,功能虽然通用,却未必能够满足我们自己的需求, 所以我们自给自足也许是个不错的办法. 这是搭建前端监控系统的第 ...
- 微服务之服务监控篇 ActuatorAdmin
微服务之服务监控篇 Actuator 服务监控 什么是服务监控? 主要是查看当前系统的运行状态,例如内存.线程.堆栈.日志等等,通过服务监控可以快速准确的发现问题,以减少或避免对用户的影响. 为什么使 ...
- 企业实战-Kubernetes(十一)Kubernetes监控
Kubernetes监控 1 k8s容器资源限制 内存限制 CPU限制 为namespace设置资源限制 2 kubernetes资源监控 Metrics-Server部署 Dashboard部署(可 ...
最新文章
- 拒绝穿模!新方法让虚拟偶像自由互动无障碍“贴贴”,8000网友追着点赞
- Ember.js系列文章
- CG CTF WEB file_get_contents
- 使用expdp导出时评估所需存储容量大小
- jpa java.util.map_使用JPA存储Map String,String
- 网站攻击软件_佳能遭严重勒索软件攻击,10TB的数据被窃取,大量服务宕机
- webService简单入门实战(一)
- 中文论文万能句型_干货|SCI论文写作的万能句型~
- 【c++】字符串的冒泡排序【存疑,待查】
- linux socket 开源库,linux c websocket开源库libwebsockets的编译和使用-Go语言中文社区...
- ALtium 16等长布线、差分布线
- KAIST 电子工程系半导体实验室ISSCC会议发表的文章(Deep-Learning Processor)
- Linux【环境部署 02】yum源镜像下载+挂载镜像+本地yum源配置+局域网yum源服务搭建+局域网yum源使用(一篇学会离线yum源配置)
- 插值方法: 拉格朗日插值--逐步插值的自适应算法
- Wretch超雅虎奇摩成台湾省第一大网站
- 关于职称评审的一些见解
- 腾讯QQ、新浪微博第三方登录接口申请说明
- Spark作业提交流程
- mysql | left join 出现的结果会重复的问题
- win10开启自带移动热点以及解决无法设置移动热点,请打开WLAN问题