基于Influxdb、Heapster与Grafana部署k8s监控

一、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 languageinfluxql默认值
URLhttp://10.96.183.103:8086(该地址为influxdb容器的地址)
accessserver(默认)
databasek8s,自定义
userroot(可选)
passwordroot(可选)

3、保存并查看数据源

最后点击保存,出现“data source is working(数据源正在工作)”数据源创建成功

从“齿轮”设置中查看创建的数据源

四、导入监控模板

1、选择+号>import导入grafana官方提供的监控模板文件

模板文件可以到官网下载:https://grafana.com/grafana/dashboards/?search=linux,数据源可以选择influxdb。

导入展示k8s集群node的JSON文件模板:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值