声明:这是我在大学毕业后进入第一家互联网工作学习的内容


背景

刚刚部署完压测环境kubernertes(以下简称k8s),测试人员需要对项目进行压测,我需要组装一个监控系统帮助测试人员更好地测试个项目性能,百度了很多方案,目前选择了Kubernetes-dashboard+heapster+influxdb+grafana这种方案。

要求说明

项目 版本号 targetPort nodePort
kubernetes 1.15
kubernetes-dashboard v1.10.1 9090 32666
heapster-amd64 v1.5.4 8082
heapster-grafana-amd64 v5.0.4 3000 31234
heapster-influxdb-amd64 v1.5.2 8086 30444

确保nodeport在整个k8s集群内唯一,版本号k8s和kubernetes-dashboard 有一些对应关系

kubernetes-dashboard的这个版本我没有做权限控制,比较麻烦,如果需要

heapster-grafana-amd64 是为了进一步监控每个容器的cpu、内存等更为具体的使用情况,如果你只需要kubernetes-dashboard的基础监控(页面上直观看到)那么只用装heapster-influxdb-amd64和heapster-amd64

简介

Kubernetes-dashboard

Kubernetes Dashboard 是 Kubernetes 集群的基于 Web 的通用 UI。它允许用户管理在群集中运行的应用程序并对其进行故障排除,以及管理群集本身。

由于Kubernetes API版本之间的重大更改,某些功能可能无法在仪表板中正常运行,这也导致了kubernetes-dashboard的兼容性问题比较严重,最好一个版本使用一个版本最稳定的dashboard。

比如kubernetes-dashboard 新版本:v2.0.0 兼容 Kubernetes 版本:1.18以上,对以下的版本不兼容。

如果想安装高版本可以看 Kubernetes 部署 Kubernetes-Dashboard v2.0.0

而本文kubernetes-dashboard:v1.10.1 兼容 kubernetes:1.15版本

Heapster

Heapster是容器集群监控和性能分析工具,天然的支持Kubernetes和CoreOS。

Kubernetes有个出名的监控agent—cAdvisor。在每个kubernetes Node上都会运行cAdvisor,它会收集本机以及容器的监控数据(cpu,memory,filesystem,network,uptime)。在较新的版本中,K8S已经将cAdvisor功能集成到kubelet组件中。每个Node节点可以直接进行web访问。

Heapster是一个收集者,Heapster可以收集Node节点上的cAdvisor数据,将每个Node上的cAdvisor的数据进行汇总,还可以按照kubernetes的资源类型来集合资源,比如Pod、Namespace,可以分别获取它们的CPU、内存、网络和磁盘的metric。默认的metric数据聚合时间间隔是1分钟。还可以把数据导入到第三方工具(如InfluxDB)。

Kubernetes原生dashboard的监控图表信息来自heapster。在Horizontal Pod Autoscaling中也用到了Heapster,HPA将Heapster作为Resource Metrics API,向其获取metric。

InfluxDB

InfluxDB是一个开源的时序数据库,使用GO语言开发,特别适合用于处理和分析资源监控数据这种时序相关数据。而InfluxDB自带的各种特殊函数如求标准差,随机取样数据,统计数据变化比等,使数据统计和实时分析变得十分方便。

时序数据库产品的发明都是为了解决传统关系型数据库在时序数据存储和分析上的不足和缺陷,这类产品被统一归类为时序数据库。针对时序数据的特点对写入、存储、查询等流程进行了优化,这些优化与时序数据的特点息息相关:

  • 存储成本:
    利用时间递增、维度重复、指标平滑变化的特性,合理选择编码压缩算法,提高数据压缩比;
    通过预降精度,对历史数据做聚合,节省存储空间。

  • 高并发写入:
    批量写入数据,降低网络开销;
    数据先写入内存,再周期性的dump为不可变的文件存储。

  • 低查询延时,高查询并发:
    优化常见的查询模式,通过索引等技术降低查询延时;
    通过缓存、routing等技术提高查询并发。

Grafana

Grafana是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示,并及时通知。它主要有以下六大特点:

  • 展示方式:快速灵活的客户端图表,面板插件有许多不同方式的可视化指标和日志,官方库中具有丰富的仪表盘插件,比如热图、折线图、图表等多种展示方式;

  • 数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB等;

  • 通知提醒:以可视方式定义最重要指标的警报规则,Grafana将不断计算并发送通知,在数据达到阈值时通过Slack、PagerDuty等获得通知;

  • 混合展示:在同一图表中混合使用不同的数据源,可以基于每个查询指定数据源,甚至自定义数据源;

  • 注释:使用来自不同数据源的丰富事件注释图表,将鼠标悬停在事件上会显示完整的事件元数据和标记;

  • 过滤器:Ad-hoc过滤器允许动态创建新的键/值过滤器,这些过滤器会自动应用于使用该数据源的所有查询。

部署

下载安装

项目文件信息链接

一共有5个yaml文件及2个json文件

[root@vm-26-11 ~]# tree
├── kubernetes-dashboard
│   ├── grafana.yaml
│   ├── heapster-rbac.yaml
│   ├── heapster.yaml
│   ├── kubernetes-dashboard.yaml
│   └── influxdb.yaml确认kubernetes-dashboard目录的yaml文件正确(json先不用管)[root@vm-26-11 ~]# kubectl create -f kubernetes-dashboard

kubernetes-dashboard访问地址:

http://nodeip:32666/

配置grafana

grafana访问地址:http://nodeip:31234/

选择添加 Dashboard模板(上面下载的json文件)

kubernetes-node-statistics_rev1.json

kubernetes-pod-statistics_rev1.json

问题排查

下面有几个问题,我记录下当时的排坑操作

kubernetes-dashboard

大视报没有开权限控制,所以只用保证镜像号在国内可以找到就行,这里我用的事阿里云的镜像号
registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:v1.10.1

heapster

  • 权限控制
E0409 06:05:27.448890 1 reflector.go:190] k8s.io/heapster/metrics/util/util.go:30: Failed to list *v1.Node: nodes is forbidden: User "system:serviceaccount:kube-system:heapster" cannot list nodes at the cluster scope报错原因是无权访问,这个需要创建heapster-rbac.yaml就行
  • 端口不通
E0302 06:11:05.004391       1 manager.go:101] Error in scraping containers from kubelet:172.16.8.12:10255: failed to get all container stats from Kubelet URL "http://172.16.8.12:10255/stats/container/": Post http://172.16.8.12:10255/stats/container/: dial tcp 172.16.8.12:10255: getsockopt: connection refused报错原因是10255端口不通(k8s默认使用10250作为kubelet端口)
需要将heapster的
- --source=kubernetes:https://kubernetes.default
改为
- --source=kubernetes:kubernetes:https://kubernetes.default?useServiceAccount=true&kubeletHttps=true&kubeletPort=10250&insecure=true

grafana

导入2个json文件后可以看到node、namespace的整体资源,但是看不了pod的资源,大视报显示的namespace的pod资源都是none。

我觉得很奇怪,但是又不太懂这个监控组件。
找了很久,在kubernetes-pod-statistics_rev1.json里找到了

        "query": "SHOW TAG VALUES FROM \"uptime\" WITH KEY=pod_name WHERE \"namespace_name\"='$ns'","refresh": 1,"regex": "/^(.*)-\\d{9,}-\\w{5,}$/",

虽然我不知道作者为什么把pod的查找结果还给过滤一道(真心不懂)
但是把"regex": "/^(.*)-\d{9,}-\w{5,}$/"改成 “regex”: “” 保存,就可以看到pod的资源监控情况了。

总结

我花了接近一天的时间才慢慢把坑排完,看国内文章大部分都是转载,纯水文,关键时候还是看各种官方文档才能找出问题。不过最后还是按时完成任务,完美!

附件

如果下载很慢,可以直接粘贴下面的yaml文件。

kubernetes-dashboard.yaml

# Copyright 2017 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.# Configuration to deploy release version of the Dashboard UI compatible with
# Kubernetes 1.8.
#
# Example usage: kubectl create -f <this_file>---
apiVersion: v1
kind: Secret
metadata:labels:k8s-app: kubernetes-dashboard# Allows editing resource and makes sure it is created first.addonmanager.kubernetes.io/mode: EnsureExistsname: kubernetes-dashboard-certsnamespace: kube-system
type: Opaque
---
apiVersion: v1
kind: Secret
metadata:labels:k8s-app: kubernetes-dashboard# Allows editing resource and makes sure it is created first.addonmanager.kubernetes.io/mode: EnsureExistsname: kubernetes-dashboard-key-holdernamespace: kube-system
type: Opaque
---
# ------------------- Dashboard Service Account ------------------- #apiVersion: v1
kind: ServiceAccount
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboard-adminnamespace: kube-system---
# ------------------- Dashboard Role & Role Binding ------------------- #
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: kubernetes-dashboard-adminnamespace: kube-system
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin
subjects:
- kind: ServiceAccountname: kubernetes-dashboard-adminnamespace: kube-system---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: cluster-watcher
rules:
- apiGroups:- '*'resources:- '*'verbs:- 'get'- 'list'
- nonResourceURLs:- '*'verbs:- 'get'- 'list'
- apiGroups: [""]resources: ["secrets"]resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs"]verbs: ["get", "update", "delete"]# Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.
- apiGroups: [""]resources: ["configmaps"]resourceNames: ["kubernetes-dashboard-settings"]verbs: ["get", "update"]# Allow Dashboard to get metrics from heapster.
- apiGroups: [""]resources: ["services"]resourceNames: ["heapster"]verbs: ["proxy"]
---
# ------------------- Dashboard Deployment ------------------- #
apiVersion: apps/v1
kind: Deployment
metadata:name: kubernetes-dashboardnamespace: kube-systemlabels:k8s-app: kubernetes-dashboardkubernetes.io/cluster-service: "true"addonmanager.kubernetes.io/mode: Reconcile
spec:selector:matchLabels:k8s-app: kubernetes-dashboardtemplate:metadata:labels:k8s-app: kubernetes-dashboardannotations:scheduler.alpha.kubernetes.io/critical-pod: ''seccomp.security.alpha.kubernetes.io/pod: 'docker/default'spec:priorityClassName: system-cluster-criticalcontainers:- name: kubernetes-dashboard# image: registry.cn-beijing.aliyuncs.com/kubernetes-cn/kubernetes-dashboard-amd64:v1.10.1image: registry.cn-hangzhou.aliyuncs.com/google_containers/kubernetes-dashboard-amd64:v1.10.1resources:#limits:#  cpu: 100m#  memory: 300Mirequests:cpu: 50mmemory: 200Miports:- containerPort: 9090protocol: TCPargs:#- --auto-generate-certificatesvolumeMounts:- name: kubernetes-dashboard-certsmountPath: /certs- name: tmp-volumemountPath: /tmplivenessProbe:httpGet:scheme: HTTPpath: /port: 9090initialDelaySeconds: 30timeoutSeconds: 30volumes:- name: kubernetes-dashboard-certssecret:secretName: kubernetes-dashboard-certs- name: tmp-volumeemptyDir: {}serviceAccountName: kubernetes-dashboard-admintolerations:- key: node-role.kubernetes.io/mastereffect: NoSchedule---
# ------------------- Dashboard Service ------------------- #kind: Service
apiVersion: v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kube-system
spec:ports:- port: 443targetPort: 9090selector:k8s-app: kubernetes-dashboard---kind: Service
apiVersion: v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboard-externalnamespace: kube-system
spec:ports:- port: 9090targetPort: 9090nodePort: 32666type: NodePortselector:k8s-app: kubernetes-dashboard

influxdb.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: monitoring-influxdbnamespace: kube-system
spec:replicas: 1template:metadata:labels:task: monitoringk8s-app: influxdbspec:containers:- name: influxdbimage: registry.cn-hangzhou.aliyuncs.com/google_containers/heapster-influxdb-amd64:v1.5.2 volumeMounts:- mountPath: /dataname: influxdb-storagevolumes:- name: influxdb-storageemptyDir: {}
---
apiVersion: v1
kind: Service
metadata:labels:task: monitoringkubernetes.io/cluster-service: 'true'kubernetes.io/name: monitoring-influxdbname: monitoring-influxdbnamespace: kube-system
spec:type: NodePortports:- port: 8086targetPort: 8086nodePort: 30444name: httpselector:k8s-app: influxdb

heapster.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: heapsternamespace: kube-system
spec:replicas: 1template:metadata:labels:task: monitoringk8s-app: heapsterspec:serviceAccountName: heapstercontainers:- name: heapsterimage: registry.cn-hangzhou.aliyuncs.com/google_containers/heapster-amd64:v1.5.4imagePullPolicy: IfNotPresentcommand:- /heapster- --source=kubernetes:https://kubernetes.default?useServiceAccount=true&kubeletHttps=true&kubeletPort=10250&insecure=true- --sink=influxdb:http://monitoring-influxdb:8086
---
apiVersion: v1
kind: Service
metadata:labels:task: monitoring# For use as a Cluster add-on (https://github.com/kubernetes/kubernetes/tree/master/cluster/addons)# If you are NOT using this as an addon, you should comment out this line.kubernetes.io/cluster-service: 'true'kubernetes.io/name: Heapstername: heapsternamespace: kube-system
spec:ports:- port: 80targetPort: 8082selector:k8s-app: heapster

heapster-rbac.yaml

apiVersion: v1
kind: ServiceAccount
metadata:name: heapsternamespace: kube-system---kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:name: heapster
subjects:- kind: ServiceAccountname: heapsternamespace: kube-system
roleRef:kind: ClusterRolename: cluster-adminapiGroup: rbac.authorization.k8s.io

grafana.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: monitoring-grafananamespace: kube-system
spec:replicas: 1template:metadata:labels:task: monitoringk8s-app: grafanaspec:containers:- name: grafanaimage: registry.cn-hangzhou.aliyuncs.com/google_containers/heapster-grafana-amd64:v5.0.4ports:- containerPort: 3000protocol: TCPvolumeMounts:- mountPath: /etc/ssl/certsname: ca-certificatesreadOnly: true- mountPath: /varname: grafana-storageenv:- name: INFLUXDB_HOSTvalue: monitoring-influxdb- name: GF_SERVER_HTTP_PORTvalue: "3000"# The following env variables are required to make Grafana accessible via# the kubernetes api-server proxy. On production clusters, we recommend# removing these env variables, setup auth for grafana, and expose the grafana# service using a LoadBalancer or a public IP.- name: GF_AUTH_BASIC_ENABLEDvalue: "false"- name: GF_AUTH_ANONYMOUS_ENABLEDvalue: "true"- name: GF_AUTH_ANONYMOUS_ORG_ROLEvalue: Admin- name: GF_SERVER_ROOT_URL# If you're only using the API Server proxy, set this value instead:# value: /api/v1/namespaces/kube-system/services/monitoring-grafana/proxyvalue: /volumes:- name: ca-certificateshostPath:path: /etc/ssl/certs- name: grafana-storageemptyDir: {}
---
apiVersion: v1
kind: Service
metadata:labels:# For use as a Cluster add-on (https://github.com/kubernetes/kubernetes/tree/master/cluster/addons)# If you are NOT using this as an addon, you should comment out this line.kubernetes.io/cluster-service: 'true'kubernetes.io/name: monitoring-grafananame: monitoring-grafananamespace: kube-system
spec:# In a production setup, we recommend accessing Grafana through an external Loadbalancer# or through a public IP.# type: LoadBalancer# You could also use NodePort to expose the service at a randomly-generated porttype: NodePortports:- port: 80targetPort: 3000nodePort: 31234selector:k8s-app: grafana

参考资料

Heapster-Github

在具有InfluxDB后端和Grafana UI的Kubernetes集群中运行Heapster

Grafana的Dashboards模板

kubernetes监控方案之:heapster+influxdb+grafana详解

时序数据库介绍和使用

Kubernetes可视化界面及监控安装相关推荐

  1. K8s安装dashboard可视化界面

    部署dashboard kubernetes官方提供可视化界面 1.使用网络拉取yaml文件 kubectl apply -f https://raw.githubusercontent.com/ku ...

  2. Kubernetes 可视化管理工具Kuboard V3

    目前Kubernetes可视化工具如雨后春笋,数不胜数.接下来介绍一款非常美观的可视化工具 Kuboard免费版只有3个集群的权限,企业使用需要付费,出于学习的目标可以自己玩玩.kuboard外观比较 ...

  3. 实战 | 深度学习轻松学:如何用可视化界面来部署深度学习模型

    翻译 | AI科技大本营 参与 | 王赫 上个月,我有幸结识了 DeepCognition.ai 的创始人. Deep Cognition (深度认知) 建立的深度学习工作室,为很多准备部署深度学习框 ...

  4. R语言分类模型:逻辑回归模型LR、决策树DT、推理决策树CDT、随机森林RF、支持向量机SVM、Rattle可视化界面数据挖掘、分类模型评估指标(准确度、敏感度、特异度、PPV、NPV)

    R语言分类模型:逻辑回归模型LR.决策树DT.推理决策树CDT.随机森林RF.支持向量机SVM.Rattle可视化界面数据挖掘.分类模型评估指标(准确度.敏感度.特异度.PPV.NPV) 目录

  5. 第四次作业---四则运算升级版(带可视化界面)

    本次作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2213 同伴的github远程仓库的地址:https://githu ...

  6. python拿什么做可视化界面好-手把手教你用Python做个可视化的“剪刀石头布”小游戏...

    /1 前言/ 最近在学习PyQt5可视化界面,这是一个内容非常丰富的gui库,相对于tkinter库,功能更加强大,界面更加美观,操作也不难.于是我开始小试牛刀,用PyQt5做个可视化的"剪 ...

  7. python可视化窗口编程-Python可视化界面编程入门

    Python可视化界面编程入门具体实现代码如所示: (1)普通可视化界面编程代码入门: import sys from PyQt5.QtWidgets import QWidget,QApplicat ...

  8. 实战 | 深度学习轻松学:如何用可视化界面来部署深度学习模型 转载 2017年12月27日 00:00:00 109 翻译 | AI科技大本营 参与 | 王赫 上个月,我有幸结识了 DeepCogn

    实战 | 深度学习轻松学:如何用可视化界面来部署深度学习模型 转载 2017年12月27日 00:00:00 标签: 109 编辑 删除 翻译 | AI科技大本营 参与 | 王赫 上个月,我有幸结识了 ...

  9. python基于web可视化_Python Selenium实现无可视化界面

    有时候我们爬取网页数据,并不希望看其中的过程,只想看到最后的数据结果就可以了,这时候,***面就很有必要了! 代码如下 from selenium import webdriver from time ...

最新文章

  1. React项目动态设置title标题
  2. python numba库是什么,如何给python代码加速?JIT、autoit、LLVM
  3. 北邮OJ 884. 16校赛-Average Modulo
  4. linux什么用户什么任务,linux任务里的1 和2是什么意思
  5. Flutter Container 容器以及对齐方式 Alignment
  6. vue4 跳转外部链接_vue跳转到外部链接
  7. 三、Dart Hello World
  8. 【IDEA】关于 IDEA 中新建 web 项目的 webapp 文件夹没有小蓝点 ,启动服务,访问不到解决方案
  9. 用vue-cli3导入外部的iconfont.css图标样式遇到的坑:These relative modules were not found:...
  10. 家庭组网 光猫+交换机利用VLAN划分实现客厅IPTV机顶盒与上网路由器单线复用(上)
  11. 网站安全不可忽视--一个收费网站的破解过程
  12. 关于运行opendaylight时client: JAVA_HOME not set; results may vary
  13. VnlnHub Momentum
  14. 小米手机录音删除了怎么恢复?可自动备份的录音便签
  15. bootstrap读书笔记
  16. 实现swiper实现缩图
  17. 道路设计标高p1p2php3p4,西南交通大学19春《道路工程》在线作业12
  18. 基于多种群机制的PSO算法Python实现
  19. LaTeX插入图表模板
  20. 欧尼酱讲JVM(22)——分代收集算法

热门文章

  1. SpringBoot实现分布式锁
  2. 高频通信电子线路—经典七管半导体超外差式调幅(AM)收音机(恒兴HX-6B)电路深度剖析介绍(上)
  3. 【OpenPose-Windows】OpenPose1.4.0+VS2017+CUDA9.2+cuDNN9.2+Windows配置教程
  4. 理科计算机专业分数线,武汉大学2017年计算机专业录取分数线(贵州理科考生)...
  5. led显示屏应用于舞台搭建的解决方案以及需要注意的细节分析
  6. Mybatis系列全解(五):全网最全!详解Mybatis的Mapper映射文件
  7. 2021-12-06 自动化专业C语言上机作业参考答案04
  8. iOS 8人机界面指南(一):UI设计基础
  9. 净现值NPV(Net Present Value)
  10. python npv 计算公式_PMP知识点总结 -- 净现值(NPV)