一、k8s监控方案
1、 监控k8s包含监控基础架构平台和监控正在运行的工作负载,利k8s本身的命令可能无法满足实际的需求,因此在实际的生产环境中,可以将k8s与外部的监控系统进行集成。
2、 k8s监控主要体现在对集群的监控和对pod的监控,包括节点资源利用率、节点数、运行pod的容器指标等。
3、 常用的监控工具有Prometheus、Grafana、Heapster、InfluxDB、Telegraf、Elasticsearch、Kibana、Fluentd、Datadog、cAdvisor等
4、 部分监控工具介绍
①,Prometheus:是一种开源的系统和服务监控工具,特别使用于监控k8s集群,提供了丰富的指标收集和查询功能、并支持强大的告警和通知机制。
②,Grafana:它是一款用go语言开发的开源可视化监控工具,可以与Prometheus等数据源集成,提供仪表盘和图表展示,它还支持灵活的查询和可视化选项,使用户能够直观的监控k8s集群的状态。
③,Heapster:它是k8s集群监控和性能收集的工具(集群级别监控解决方案),用于收集和聚合集群中各个节点和容器的性能指标,它支持与多个后端存储(如InfluxDB)的集成。它会与k8s的监控进程cAdvisor进行通信,将每个node节点上的监控进程cAdvisor的监控数据进行汇总,然后导到第三方工具(如InfluxDB)中。
④,InfluxDB:是一个高性能的时间序列数据库,适用于保存和查询包含大量时间戳的数据。它可以与其他工具集成(如Heapster、Telegraf)作为后端存储,实现数据的收集和持久化。
⑤,Telegraf:是一种轻量级的数据收集代理,可用于从各种来源收集和传输指标数据,它支持多种输出插件,可以将数据发送到InfluxDB、Prometheus等目标。
⑥,Elasticsearch:是一个分布式搜索和分析引擎,也可以用于存储和查询监控数据,它常与Logstash和Kibana一起构成ELK堆栈,提供了强大的日志和指标分析功能。
⑦,Kibana:是一个数据可视化平台,与Elasticsearch集成,用于创建交互式仪表盘和图表,可以帮助用户直观的分析和可视化k8s集群的日志和指标数据。
⑧,Fluentd:是一个开源的日志收集代理,可用于从多个源收集、传输和转发日志数据,它支持与Elasticsearch、Kafka等工具集成。
⑨,Datadog:是一种云原生监控和分析平台,支持监控k8s集群的性能和健康状态。提供了实时的指标监控、告警、日志收集和可视化功能。
⑩,cAdvisor(Container Advisor):是一个针对容器的监控工具,用于收集和展示容器的资源使用情况和性能指标,可以与其他监控工具集成,提供容器级别的监控数据。k8s已经将监控进程cAdvisor的功能集成到了kubelet组件中了。
二、部署k8s监控系统
1、 创建一个实验目录jkong,再创建一个k8s命名空间,用以资源隔离
mkdir jkong
kubectl create ns influxdb #创建命名空间
2、使用deployment控制器部署,创建influxdb.yaml资源文件部署influxdb
[root@zsl jkong]# vim influxdb.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: influxdb
namespace: influxdb
spec:
replicas: 1
selector:
matchLabels:
app: influxdb
task: monitoring
template:
metadata:
labels:
app: influxdb
task: monitoring
spec:
containers:
- name: influxdb
image: influxdb:1.8.4-alpine #之前试了几个版本的镜像,都无法顺利创建数据源,要么报网关错误,要么报请求错误,网上查到用该镜像,提前下载镜像
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /test #创建pod时同时创建一个节点数据卷,
name: influxdb-test
volumes:
- name: influxdb-test
emptyDir: {} #临时数据卷,该临时数据卷挂载到了pod下的/test目录下
---
apiVersion: v1
kind: Service
metadata:
name: influxdb
namespace: influxdb
labels:
task: monitoring
kubernetes.io/cluster-service: 'true'
kubernetes.io/name: influxdb #标签值同service名称
spec:
ports:
- port: 8086
targetPort: 8086
selector:
app: influxdb
3、使用deployment控制器部署,创建heapster.yaml资源文件部署heapster
[root@zsl jkong]# vim heapster.yaml
apiVersion: v1
kind: ServiceAccount #创建一个k8s服务账号
metadata:
name: heapster
namespace: influxdb
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding #创建集群角色绑定
metadata:
name: heapster
roleRef: #角色
kind: ClusterRole
name: cluster-admin #集群角色名称
apiGroup: rbac.authorization.k8s.io
subjects: #主体
- kind: ServiceAccount
name: heapster #服务账号名称
namespace: influxdb
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: heapster
namespace: influxdb
spec:
replicas: 1
selector:
matchLabels:
task: monitoring
app: heapster
template:
metadata:
labels:
task: monitoring
app: heapster
spec:
serviceAccountName: heapster
containers:
- name: heapster
image: registry.cn-hangzhou.aliyuncs.com/google_containers/heapster-amd64:v1.5.4
imagePullPolicy: IfNotPresent
command:
- /heapster
- --source=kubernetes.summary_api:https://kubernetes.default?kubeletPort=10250&kubeletHttps=true&insecure=true #指定数据源
- --sink=influxdb:http://10.96.183.103:8086 #此地址为influxdb的pod地址,默认端口为8086,先创建influxdb资源,得到influxdb pod的ip地址
---
apiVersion: v1
kind: Service
metadata:
name: heapster
namespace: influxdb
labels:
task: monitoring
kubernetes.io/cluster-service: 'true'
kubernetes.io/name: Heapster
#app: heapster
spec:
type: NodePort #指定类型为nodeport(也可以不设置该类型)
ports:
- port: 80
targetPort: 8082
nodePort: 30012 #指定nodeport端口
selector:
app: heapster
注:由于heapster要连接apiserver来获取每个节点的监控指标,所以需要RBAC授权和每个节点都开启监控指标暴露端口(10225端口)
按照以下步骤开启每个节点的10225端口(包含master节点)
①,编辑/etc/sysconfig/kubelet文件,修改参数
[root@zsl jkong]# vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd --read-only-port=10255" #添加开启端口这一参数
②,重启k8s服务,并查看端口是否开启
[root@zsl ~]# systemctl restart kubelet.service
[root@node ~]# systemctl restart kubelet.service #重启k8s服务
[root@zsl ~]# netstat -ntulp |grep 10255
tcp6 0 0 :::10255 :::* LISTEN 49200/kubelet
[root@node ~]# netstat -ntulp |grep 10255
tcp6 0 0 :::10255 :::* LISTEN 74123/kubelet
③,测试能否获取metrics信息
[root@zsl ~]# curl 192.168.1.8:10255/metrics | more
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0# HELP aggregator_discovery_aggregation_count_total [ALPHA] Counter of number of times discovery was aggregated
# TYPE aggregator_discovery_aggregation_count_total counter
aggregator_discovery_aggregation_count_total 0
# HELP apiserver_audit_event_total [ALPHA] Counter of audit events generated and sent to the audit backend.
# TYPE apiserver_audit_event_total counter
apiserver_audit_event_total 0
[root@node ~]# curl 192.168.1.13:10255/metrics | more
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
4、使用deployment控制器部署,创建grafana.yaml资源文件部署grafana
[root@zsl jkong]# vim grafana.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: grafana
namespace: influxdb
spec:
replicas: 1
selector:
matchLabels:
task: monitoring
app: grafana
template:
metadata:
labels:
task: monitoring
app: grafana
spec:
containers:
- name: grafana
image: grafana/grafana
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3000
protocol: TCP
volumeMounts:
- mountPath: /var/opt/grafana #pod内部挂载点目录
name: grafana-var
env:
- name: INFLUXDB_HOST
value: influxdb #与influxdb服务名一致
# - name: GF_SERVER_HTTP_PORT
# value: "3000"
- name: GF_AUTH_BASIC_ENABLED
value: "false"
- name: GF_AUTH_ANONYMOUS_ENABLED
value: "true"
- name: GF_AUTH_ANONYMOUS_ORG_ROLE
value: Admin
- name: GF_SERVER_ROOT_URL
value: /
volumes:
- name: grafana-var
emptyDir: {} #临时数据卷,该临时数据卷挂载到pod的/var/opt/grafana目录下
---
apiVersion: v1
kind: Service
metadata:
name: grafana
namespace: influxdb
labels:
kubernetes.io/cluster-service: 'true'
kubernetes.io/name: grafana
spec:
type: NodePort #指定port类型
ports:
- port: 80
targetPort: 3000
nodePort: 30011 #指定端口
selector:
app: grafana
5、执行kube-apply命令,应用资源文件,创建pod及svc等对象
注:先创建influxdb资源,得到influxdb pod的ip地址,修改heapster资源文件中–sink=influxdb:http://处的为influxdb pod的IP地址
[root@zsl jkong]# kubectl apply -f influxdb.yaml
[root@zsl jkong]# kubectl apply -f heapster.yaml
[root@zsl jkong]# kubectl apply -f grafana.yaml
6、查看资源对象
[root@zsl jkong]# kubectl -n influxdb get pods,deploy,svc
NAME READY STATUS RESTARTS AGE
pod/grafana-5cc86b454c-f2nhz 1/1 Running 0 53m
pod/heapster-77cdf95d94-zlbpv 1/1 Running 0 42m
pod/influxdb-9b9f4db88-dmsjb 1/1 Running 0 54m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/grafana 1/1 1 1 53m
deployment.apps/heapster 1/1 1 1 53m
deployment.apps/influxdb 1/1 1 1 54m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/grafana NodePort 10.96.5.167 <none> 80:30011/TCP 53m
service/heapster NodePort 10.96.64.186 <none> 80:30012/TCP 53m
service/influxdb ClusterIP 10.96.183.103 <none> 8086/TCP 54m
三、配置grafana
1、访问grafana的页面:http://ip:端口(任一节点ip都可以,端口为grafana svc的nodeport端口)
2、单机add your first data source链接根据下表内容添加一个influxdb的数据源
参数 | 值 |
---|---|
name | 数据源名称,自定义,如influxdb |
query language | influxql默认值 |
URL | http://10.96.183.103:8086(该地址为influxdb容器的地址) |
access | server(默认) |
database | k8s,自定义 |
user | root(可选) |
password | root(可选) |
3、保存并查看数据源
最后点击保存,出现“data source is working(数据源正在工作)”数据源创建成功
从“齿轮”设置中查看创建的数据源
四、导入监控模板
1、选择+号>import导入grafana官方提供的监控模板文件
模板文件可以到官网下载:https://grafana.com/grafana/dashboards/?search=linux,数据源可以选择influxdb。
导入展示k8s集群node的JSON文件模板: