首先要搭建K8S集群,请参考另外一篇文档: https://www.cnblogs.com/taoweizhong/p/10467795.htmlhtml
在此基础上,本文安装K8s dashboard、prometheus、grafana进行监控(注意上篇文档中一个虚拟机的IP地址和这里有不一样,缘由没有配置静态IP)。前端
本文中涉及容器的部署方式说明:node
本文须要下载对应的镜像以下:linux
prom/prometheus latestsql
grafana/grafana latestdocker
docker.io/siriuszg/kubernetes-dashboard-amd64 latest数据库
docker.io/google/cadvisor v0.24.1(不知道为啥latest没法链接上prometheus)api
quay.io/prometheus/node-exporter latest浏览器
本文组网以下图:网络
K8S Dashboard是官方的一个基于WEB的用户界面(我的以为比较简陋),专门用来管理K8S集群,并可展现集群的状态。K8S集群安装好后默认没有包含Dashboard,咱们须要额外建立它,下面咱们具体实现如何安装它。
第一步:查找镜像
[root@slave1 taoweizhong]# docker search dashboard
docker.io docker.io/siriuszg/kubernetes-dashboard-amd64
docker.io/siriuszg/kubernetes-dashboard-amd64 v1.5.1 be6763d992e0 2 years ago 104 MB
这里省略了其余相似镜像。
第二步:拉取镜像:
[root@slave1 taoweizhong]# docker pull docker.io/siriuszg/kubernetes-dashboard-amd64
第三步:编写脚本(这里dashboard采用K8S集群管理)
dashboard-service.yaml
[root@master democonfig]# cat dashboard-service.yaml
kind: Service
apiVersion: v1
metadata:
labels:
app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
type: NodePort
ports:
- port: 80
targetPort: 9090
selector:
app: kubernetes-dashboard
[root@master democonfig]# cat kubernetes-dashboard.yaml
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
labels:
app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kube-system
spec:
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: kubernetes-dashboard
template:
metadata:
labels:
app: kubernetes-dashboard
annotations:
scheduler.alpha.kubernetes.io/tolerations: |
[
{
"key": "dedicated",
"operator": "Equal",
"value": "master",
"effect": "NoSchedule"
}
]
spec:
containers:
- name: kubernetes-dashboard
image: docker.io/siriuszg/kubernetes-dashboard-amd64:v1.5.1
imagePullPolicy: Always
ports:
- containerPort: 9090
protocol: TCP
args:
- --apiserver-host=http://192.168.135.128:8080
livenessProbe:
httpGet:
path: /
port: 9090
initialDelaySeconds: 30
timeoutSeconds: 30
第四步:执行并部署
[root@master democonfig]# kubectl create -f kubernetes-dashboard.yaml
[root@master democonfig]# kubectl create -f dashboard-service.yaml
这里对应的删除脚本为:
[root@master democonfig]# kubectl delete -f kubernetes-dashboard.yaml
[root@master democonfig]# kubectl delete -f dashboard-service.yaml
第五步:访问Dashboard
先查询下容器是否启动:
[root@master democonfig]# kubectl get pods --all-namespaces -o wide
(注意这里是namespace为 kube-system,查询时须要增长命名空间)
打开浏览器并输入:
http://192.168.135.128:8080/ui 或者
http://192.168.135.128:8080/api/v1/proxy/namespaces/kube-system/services/kubernetes-dashboard/
遇到的问题说明:
1.关闭iptables防火墙 (若是是防火墙缘由致使的master节点没法ping通node之上的Pod节点)
systemctl stop iptables
systemctl disable iptables
即便关闭了防火墙跨主机间容器、pod始终没法ping通
这是因为linux还有底层的iptables,因此在node上分别执行:
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
iptables -L -n
2.因为关闭或者重启docker而致使的网络未更新问题引发。
Master节点启动 注意先启动kubernetes,再启动docker(若是是关闭docker或者重启docker致使的网络问题,重启master和node节点,注意重启顺序)
主Master节点重启顺序
systemctl enable docker
systemctl enable etcd kube-apiserver kube-scheduler kube-controller-manager
systemctl restart etcd kube-apiserver kube-scheduler kube-controller-manager
systemctl restart flanneld docker
Node从节点重启顺序
systemctl restart kubelet kube-proxy
systemctl restart flanneld docker
systemctl enable flanneld kubelet kube-proxy docker
Prometheus 是由 SoundCloud 开发的开源监控报警系统和时序列数据库(TSDB),自2012年起,许多公司及组织已经采用 Prometheus,该项目有着很是活跃的开发者和用户社区,如今已成为一个独立的开源项目核。
其工做流程是:Prometheus server 按期从配置好的 jobs 或者 exporters 中拉 metrics,或者接收来自 Pushgateway 发过来的 metrics,或者从其余的 Prometheus server 中拉 metrics。
Prometheus server 在本地存储收集到的 metrics,并运行已定义好的 alert.rules,记录新的时间序列或者向 Alertmanager 推送警报。Alertmanager 根据配置文件,对接收到的警报进行处理,发出告警。在图形界面中,可视化采集数据。
Prometheus 中存储的数据为时间序列,是由 metric 的名字和一系列的标签(键值对)惟一标识的,不一样的标签则表明不一样的时间序列。
metric 名字:该名字应该具备语义,通常用于表示 metric 的功能,例如:http_requests_total, 表示 http 请求的总数。
标签:使同一个时间序列有了不一样维度的识别。例如 http_requests_total{method="Get"} 表示全部 http 请求中的 Get 请求。当 method="post" 时,则为新的一个 metric。
样本:实际的时间序列,每一个序列包括一个 float64 的值和一个毫秒级的时间戳。
格式:<metric name>{<label name>=<label value>, …},例如:http_requests_total{method="POST",endpoint="/api/tracks"}。
下面介绍其安装步骤(这里直接采用容器化安装,非基于K8S集群管理安装,所以在K8S的pods中看不到):
【步骤1到4在master节点安装】
第一步:查找镜像
[root@master prometheus]# docker search prometheus
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
prom/prometheus 692 [OK]
第二步:拉取镜像
[root@master prometheus]# docker pull prom/prometheus
第三步编写:prometheus.yml文件
root@master prometheus-1.7.1.linux-amd64]# cat prometheus.yml
global:
scrape_interval: 15s
external_labels:
monitor: 'codelab-monitor'
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 5s
static_configs:
- targets: ['192.168.135.128:9090']
- job_name: 'kubernetes-nodes-cadvisor'
kubernetes_sd_configs:
- api_server: 'http://192.168.135.128:8080'
role: node
relabel_configs:
- action: labelmap
regex: __meta_kubernetes_node_label_(.+)
- source_labels: [__meta_kubernetes_role]
action: replace
target_label: kubernetes_role
- source_labels: [__address__]
regex: '(.*):10250'
replacement: '${1}:8080'
target_label: __address__
- job_name: 'kubernetes_node'
kubernetes_sd_configs:
- role: node
api_server: 'http://192.168.135.128:8080'
relabel_configs:
- source_labels: [__address__]
regex: '(.*):10250'
replacement: '${1}:9100'
target_label: __address__
说明:一个典型的配置格式
global:
# 抓取间隔,默认为 1m
[ scrape_interval: <duration> | default = 1m ]
# 抓取超时时间,默认为 10s
[ scrape_timeout: <duration> | default = 10s ]
# 规则评估间隔,默认为 1m
[ evaluation_interval: <duration> | default = 1m ]
# 抓取配置
scrape_configs:
[ - <scrape_config> ... ]
# 规则配置
rule_files:
[ - <filepath_glob> ... ]
# 告警配置
alerting:
alert_relabel_configs:
[ - <relabel_config> ... ]
alertmanagers:
[ - <alertmanager_config> ... ]
第四步:启动镜像
[root@master prometheus]# docker run -d -p 9090:9090 --name=prometheus -v /home/taoweizhong/data/prometheus/prometheus-1.7.1.linux-amd64/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
因为是容器化安装, 这里须要注意虚拟机上编写的prometheus.yml 文件位置,不然会启动错误。
【步骤5到7须要每一个slave节点上都须要安装】
在下面的步骤开始以前先了解下:
Prometheus提供的NodeExporter项目能够提取主机节点的关键度量指标,经过Kubernetes的DeamonSet模式能够在各主机节点上部署一个NodeExporter实例,实现对主机性能指标数据的监控。
Cadvisor Google用来监测单节点的资源信息的监控工具,提供了一目了然的单节点多容器的资源监控功能。Google的Kubernetes中也缺省地将其做为单节点的资源监控工具,各个节点缺省会被安装上Cadvisor。总结起来主要两点:展现 Host 和容器两个层次的监控数据;展现历史变化数据。
因为 cAdvisor 提供的操做界面简陋,且须要在不一样页面之间跳转,只能监控一个 host。但 cAdvisor 的一个亮点是它能够将监控到的数据导出给第三方工具,由这些工具进一步加工处理。咱们能够把 cAdvisor 定位为一个监控数据收集器,收集和导出数据是它的强项,而非展现数据。
第五步:拉取cadvisor和node-exporter镜像
[root@slave1 taoweizhong]# docker pull docker.io/google/cadvisor
[root@slave1 taoweizhong]# docker pull quay.io/prometheus/node-exporter:v0.24.1
注意这里拉取node-exporter的是:v0.24.1版本,latest不知为啥没法和Prometheus集成起来。
第六步:启动cadvisor和node-exporter镜像
[root@slave1 taoweizhong]#docker run -d -p 9100:9100 -v "/proc:/host/proc" -v "/sys:/host/sys" -v "/:/rootfs" --net=host quay.io/prometheus/node-exporter --path.procfs /host/proc --path.sysfs /host/sys --collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)"
[root@slave1 taoweizhong]#docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --privileged=true --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --publish=8080:8080 --detach=true --name=cadvisor --restart=always google/cadvisor:v0.24.1
这里参数不作具体说明了,这两个容器的目的是在slave节点采集数据给Prometheus
第七步:检查镜像启动状态
第八步:先查看下cadvisor 和node-exporter在http端口提供的指标项
在浏览器中输入:http://192.168.135.136:9100/metrics
(注意:IP地址为部署容器的宿主机,端口是容器映射到虚拟机上的端口) node-exporter返回的指标以下,有不少指标:
在浏览器中输入:http://192.168.135.136:8080/metrics
(注意:IP地址为部署容器的宿主机,端口是容器映射到虚拟机上的端口)cadvisor返回的指标以下,有不少指标:
第九步:查看cadvisor 的简陋图形界面:
cAdvisor 会显示当前 host 的资源使用状况,包括 CPU、内存、网络、文件系统等。
第十步:访问prometheus图形界面:
在运行后,访问 http://192.168.135.128:9090/graph (IP地址是prometheus容器所在宿主机,端口是启动时候指定的映射到虚拟机端口)
第十一步:切换到target(从菜单status->Targets),这样Prometheus的安装就成功了,咱们能够看到EndPoint已经链接正常UP,若是这里状态为down,表示链接不正常,须要查看缘由,多是防火墙之类的。
因为Grafana提供了很漂亮的图形界面,下面咱们将Prometheus和Grafana集成起来。
Grafana是一个开源的度量分析与可视化套件。常常被用做基础设施的时间序列数据和应用程序分析的可视化。Grafana支持许多不一样的数据源。每一个数据源都有一个特定的查询编辑器,该编辑器定制的特性和功能是公开的特定数据来源。 官方支持如下数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB。
基本概念说明:
Data Source:grafana确切的说是一个前端展现工具,将数据以很是美观直接的图形展现出来。那么这些数据必须有一个来源吧,grafana获取数据的地方就称为Data Source。
DashBoard:仪表盘,就像汽车仪表盘同样能够展现不少信息,包括车速,水箱温度等。Grafana的DashBoard就是以各类图形的方式来展现从Datasource拿到的数据。
Row:DashBoard的基本组成单元,一个DashBoard能够包含不少个row。一个row能够展现一种信息或者多种信息的组合,好比系统内存使用率,CPU五分钟及十分钟平均负载等。因此在一个DashBoard上能够集中展现不少内容。
Panel:面板,实际上就是row展现信息的方式,支持表格(table),列表(alert list),热图(Heatmap)等多种方式,具体能够去官网上查阅。
Query Editor:用来指定获取哪一部分数据。相似于sql查询语句,好比你要在某个row里面展现test这张表的数据,那么Query Editor里面就能够写成select *from test。
Organization:org是一个很大的概念,每一个用户能够拥有多个org,grafana有一个默认的main org。用户登陆后能够在不一样的org之间切换,前提是该用户拥有多个org。不一样的org之间彻底不同,包括datasource,dashboard等都不同。
User:这个概念应该很简单,不用多说。Grafana里面用户有三种角色admin,editor,viewer。admin权限最高,能够执行任何操做,包括建立用户,新增Datasource,建立DashBoard。editor角色不能够建立用户,不能够新增Datasource,能够建立DashBoard。viewer角色仅能够查看DashBoard。在2.1版本及以后新增了一种角色read only editor(只读编辑模式),这种模式容许用户修改DashBoard,可是不容许保存。每一个user能够拥有多个organization。
这里我采用容器化部署,可是grafana容器并无归入K8S管理范围,所以安装后使用kubectl get pod命令是查找不到的,具体操做以下:
第一步:查找镜像
[root@master prometheus-1.7.1.linux-amd64]# docker search grafana
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
grafana/grafana The official Grafana docker container 1084
【这里省略了一部分镜像列表】
第二步:下载镜像
[root@master prometheus-1.7.1.linux-amd64]# docker pull grafana/Grafana
第三步:启动镜像
[root@master prometheus-1.7.1.linux-amd64]# docker run -d --name grafana -p 3000:3000 grafana/grafana Grafana
d68d28806b435bee1cce00745820be92dc3f39353e3aabf6c72eb5ab15a0b652
注意端口映射到3000,后续访问须要
第四步:浏览界面
在浏览器打开 http://192.168.135.128:3000 (这里是虚拟机的IP地址),输入默认用户名密码 (admin/admin) 能够进入 Grafana 。
第五步:数据源配置
Configuration - Data Resource - Add Data Resource
编辑数据源,输入正确的URL:
第六步:选择Prometheus2.0的dashboard(默认已经安装),这样咱们就能够看到漂亮的监控界面了。
下面咱们演示如何更换换一个dashboard:
grafana能够支持根据本身的需求手动新建一个 Dashboard, grafana 的官方网站上有不少公共的 Dashboard 能够供使用,咱们这里可使用(dashboard id 为315)这个 Dashboard 来展现 Kubernetes 集群的监控信息:
第一步:先下载下来,地址以下
https://grafana.com/dashboards/315/revisions
第二步:在左侧侧边栏 Create 中点击import导入,将上面第一个输入框输入315,下面文本框直接将下载的文件内容复制到里面,点击load
第三步:选择prometheus这个名字的数据源,执行import操做,就能够进入到 dashboard 页面:
第四步:这样就能够看到结果了(下面截图供参考学习)
--结束---