Kubernetes 监控方案:Heapster+InfluxDB+Grafana

  • A+
所属分类:Kubernetes

监控方案

heapster是一个监控计算、存储、网络等集群资源的工具,以k8s内置的cAdvisor作为数据源收集集群信息,并汇总出有价值的性能数据(Metrics):cpu、内存、network、filesystem等,然后将这些数据输出到外部存储(backend),如InfluxDB,最后再通过相应的UI界面进行可视化展示,如grafana。 另外heapster的数据源和外部存储都是可插拔的,所以可以很灵活的组建出很多监控方案,如:Heapster+ElasticSearch+Kibana等等。

在 kubernetes 的监控方案中,Heapster+Influxdb+Grafana 的组合相比 prometheus(普罗米修斯)等开源方案而言更为简单直接。而且 Heapster 在 kubernetes 中承担的责任远不止监控数据的采集,控制台的监控接口、HPA的 POD 弹性伸缩等都依赖于 Heapster 的功能。因此 Heapster 成为 kubernetes 中一个必不可少的组件,在阿里云的 Kubernetes 集群中已经内置了 Heapster+Influxdb 的组合,如果需要将监控的数据进行展示,只需要配置一个可用的 Grafana 与相应的 Dashboard 即可。

部署

下载官方提供的yml 文件

wget https://github.com/kubernetes-retired/heapster/archive/v1.5.3.tar.gz
tar -xvf v1.5.3.tar.gz

一共四个文件

[root@k8s-master01 influxdb]# ll /root/tools/heapster-1.5.3/deploy/kube-config/influxdb/
-rw-rw-r--. 1 root root 2354 Mar 14 10:24 grafana.yaml
-rw-rw-r--. 1 root root 1390 Mar 14 11:19 heapster.yaml
-rw-rw-r--. 1 root root 1038 Mar 14 10:23 influxdb.yaml

三个文件镜像源替换成阿里

image: registry.cn-hangzhou.aliyuncs.com/google_containers/heapster-influxdb-amd64:v1.3.3

注意rbac文件也要创建,否则heapster启动报错(启动后kubectl logs 可以查看日志)

[root@k8s-master01 influxdb]# ll /root/tools/heapster-1.5.3/deploy/kube-config/rbac/
-rw-rw-r--. 1 root root 264 May  1  2018 heapster-rbac.yam

kubectl create -f .

部署模版

Kubernetes 监控方案:Heapster+InfluxDB+Grafanayaml.zip

修改后文件模版如下(rbac已经写到heapster.yaml)

修改阿里云grafana镜像

本示例使用的 Grafana 的镜像地址是 registry.cn-hangzhou.aliyuncs.com/acs/grafana:5.0.4,内置了相关监控模板。

创建InfluxDB资源对象

apiVersion: apps/v1
kind: Deployment
metadata:
  name: monitoring-influxdb
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      task: monitoring
      k8s-app: influxdb
  template:
    metadata:
      labels:
        task: monitoring
        k8s-app: influxdb
    spec:
      containers:
      - name: influxdb
        image: k8s.gcr.io/heapster-influxdb-amd64:v1.3.3
        volumeMounts:
        - mountPath: /data
          name: influxdb-storage
      volumes:
      - name: influxdb-storage
        emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  labels:
    task: monitoring
    kubernetes.io/cluster-service: 'true'
    kubernetes.io/name: monitoring-influxdb
  name: monitoring-influxdb
  namespace: kube-system
spec:
  type: NodePort
  ports:
  - nodePort: 31001
    port: 8086
    targetPort: 8086
  selector:
    k8s-app: influxdb

注意:NotePort暴露influxdb服务在主机的31001端口,InfluxDB服务端的地址:http://[host-ip]:31001 ,记下这个地址,以便创建heapster和为grafana配置数据源时,可以直接使用。

创建Grafana资源对象

apiVersion: apps/v1
kind: Deployment
metadata:
  name: monitoring-grafana
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      task: monitoring
      k8s-app: grafana
  template:
    metadata:
      labels:
        task: monitoring
        k8s-app: grafana
    spec:
      containers:
      - name: grafana
        image: k8s.gcr.io/heapster-grafana-amd64:v4.4.3
        ports:
        - containerPort: 3000
          protocol: TCP
        volumeMounts:
        - mountPath: /etc/ssl/certs
          name: ca-certificates
          readOnly: true
        - mountPath: /var
          name: grafana-storage
        env:
        - name: INFLUXDB_HOST
          value: monitoring-influxdb
        - name: GF_SERVER_HTTP_PORT
          value: "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_ENABLED
          value: "false"
        - name: GF_AUTH_ANONYMOUS_ENABLED
          value: "true"
        - name: GF_AUTH_ANONYMOUS_ORG_ROLE
          value: 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/proxy
          value: /
      volumes:
      - name: ca-certificates
        hostPath:
          path: /etc/ssl/certs
      - name: grafana-storage
        emptyDir: {}
---
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-grafana
  name: monitoring-grafana
  namespace: 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 port
  type: NodePort
  ports:
  - nodePort: 30108
    port: 80
    targetPort: 3000
  selector:
    k8s-app: grafana

Heapster已经预先配置好了Grafana的Datasource和Dashboard,但是为了方便访问,这里我们使用NotePort暴露grafana服务在主机的30108上,Grafana服务端的地址:http://192.168.20.212:30108 ,通过浏览器访问,为Grafana修改数据源

创建Heapster资源对象

apiVersion: v1
kind: ServiceAccount
metadata:
  name: heapster
  namespace: kube-system
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: heapster
  namespace: kube-system
spec:
  replicas: 1
  selector:
    matchLabels:
      task: monitoring
      k8s-app: heapster
  template:
    metadata:
      labels:
        task: monitoring
        k8s-app: heapster
    spec:
      serviceAccountName: heapster
      containers:
      - name: heapster
        image: k8s.gcr.io/heapster-amd64:v1.4.2
        imagePullPolicy: IfNotPresent
        command:
        - /heapster
        - --source=kubernetes:https://kubernetes.default 
        - --sink=influxdb:http://150.109.39.33:31001  # 这里填写刚刚记录下的InfluxDB服务端的地址
---
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: Heapster
  name: heapster
  namespace: kube-system
spec:
  ports:
  - port: 80
    targetPort: 8082
  selector:
    k8s-app: heapster

--source 为heapster指定获取集群信息的数据源。参考:https://github.com/kubernetes/heapster/blob/master/docs/source-configuration.md

--sink 为heaster指定后端存储,这里我们使用InfluxDB,其他的,请参考:https://github.com/kubernetes/heapster/blob/master/docs/sink-owners.md

注意:务必执行heaster rbac进行授权,否则报错

通过dashboard查看集群概况

在k8s集群中,应用程序的性能指标,需要从不同的维度(containers, pods, services, and whole clusters)进行统计。以便于使用户深入了解他们的应用程序是如何执行的以及可能出现的应用程序瓶颈。通过grafana查看(cpu、memory、filesystem、network)

dashboard出图暂时没实现,正常可以在web查看内存和cpu信息

http://192.168.20.212:30108

默认的 Grafana 的用户名和密码都是 admin,建议在登录后先修改为更复杂的密码。

修改influxdb地址,测试连接成功

Kubernetes 监控方案:Heapster+InfluxDB+Grafana

Heapster无缝衔接Grafana,提供了完美的数据展示,很直观、友好。我们也可以学习 Grafana 来自定制出更美观和满足特定业务需求的Dashboard。

您可选择内置的监控模板 ,查看 Pod 和 Node 的监控 Dahsboard。

本示例使用的 Grafana 版本内置了两个模板,一个负责展示节点级别的物理资源,一个负责展示 Pod 相关的资源。开发者也可以通过添加自定义的 Dashboard 的方式进行更复杂的展现,也可以基于 Grafana 进行资源的告警等。

Kubernetes 监控方案:Heapster+InfluxDB+Grafana

Kubernetes 监控方案:Heapster+InfluxDB+Grafana

总结

Heapster监控方案,主要监控的是pod和node,对于kubernetes其他组件(API Server、Scheduler、Controller Manager等)的监控显得力不从心,而prometheus(一套开源的监控&报警&时间序列数据库的组合)功能更全面。监控是一个非常大的话题,监控的目的是为预警,预警的目的是为了指导系统自愈。只有把 监控=》预警 =》自愈 三个环节都完成了,实现自动对应用程序性能和故障管理,才算得上是一个真正意义的应用程序性能管理系统(APM)

Influxdb修改数据保留策略

Influxdb默认的数据保留策略的duration是0s,即长期保留。如果业务上无需长期保留,可以修改数据保留策略。

客户端安装influxdb

wget  https://dl.influxdata.com/influxdb/releases/influxdb-1.1.0.x86_64.rpm
yum localinstall influxdb-1.1.0.x86_64.rpm

[root@k8s-master01 influxdb]# influx -host 192.168.20.212 -port '31001'
Visit https://enterprise.influxdata.com to register for updates, InfluxDB server management, and monitoring.
Connected to http://192.168.20.212:31001 version unknown
InfluxDB shell version: 1.1.0
> show databases         #查看库
name: databases
name
----
_internal
k8s

> use k8s              #使用库
Using database k8s
> SHOW MEASUREMENTS  #查看所有表

查看数据库当前策略

> show retention policies on k8s;
name	duration	shardGroupDuration	replicaN	default
----	--------	------------------	--------	-------
default	0s		168h0m0s		1		true

修改数据策略

alter retention policy "autogen" on "k8s" duration 4320h replication 1 default;

确认策略修改结果

show retention policies on k8s;

参考:

https://www.cnblogs.com/justmine/p/8723467.html

https://www.cnblogs.com/lion.net/p/10408510.html#%E9%83%A8%E7%BD%B2-heapster-%E7%BB%84%E4%BB%B6

https://help.aliyun.com/document_detail/86786.html?spm=a2c4g.11186623.6.677.6f3254adgzDNMQ

YaLei

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: