• 1. 概述
    • 1.1. cAdvisor
    • 1.2. Heapster
    • 1.3. InfluxDB
    • 1.4. Grafana
    • 1.5. 总体架构图
  • 2. 部署与使用
    • 2.1. cAdvisor
    • 2.2. Service
    • 2.2.1. heapster-service
    • 2.2.2. influxdb-service
    • 2.2.3. grafana-service
    • 2.2.4. 创建service
    • 2.3. ReplicationController
    • 2.3.1. influxdb-grafana-controller
    • 2.3.2. heapster-controller
    • 2.3.3. 创建ReplicationController
  • 3. 查看界面及数据
    • 3.1. InfluxDB
    • 3.2. Grafana
  • 4. 容器化部署
    • 4.1. 拉取镜像
    • 4.2. 运行容器
    • 4.2.1. influxdb
    • 4.2.2. cadvisor
    • 4.2.3. grafana
    • 4.2.4. heapster
    • 4.3. 访问

    title: “[Kubernetes] Kubernetes集群监控”
    catalog: true
    date: 2017-08-13 10:50:57
    type: “categories”
    subtitle:
    header-img:
    tags:

    • Kubernetes
      catagories:
    • Kubernetes

    1. 概述

    1.1. cAdvisor

    cAdvisor对Node机器上的资源及容器进行实时监控和性能数据采集,包括CPU使用情况、内存使用情况、网络吞吐量及文件系统使用情况,cAdvisor集成在Kubelet中,当kubelet启动时会自动启动cAdvisor,即一个cAdvisor仅对一台Node机器进行监控。kubelet的启动参数—cadvisor-port可以定义cAdvisor对外提供服务的端口,默认为4194。可以通过浏览器Node_IP:port访问。项目主页:http://github.com/google/cadvisor。

    1.2. Heapster

    是对集群中的各个Node、Pod的资源使用数据进行采集,通过访问每个Node上Kubelet的API,再通过Kubelet调用cAdvisor的API来采集该节点上所有容器的性能数据。由Heapster进行数据汇聚,保存到后端存储系统中,例如InfluxDB,Google Cloud Logging等。项目主页为:https://github.com/kubernetes/heapster。

    1.3. InfluxDB

    是分布式时序数据库(每条记录带有时间戳属性),主要用于实时数据采集、事件跟踪记录、存储时间图表、原始数据等。提供REST API用于数据的存储和查询。项目主页为http://InfluxDB.com。

    1.4. Grafana

    通过Dashboard将InfluxDB的时序数据展现成图表形式,便于查看集群运行状态。项目主页为http://Grafana.org。

    1.5. 总体架构图

    k8s监控架构图

    其中当前Kubernetes中,Heapster、InfluxDB、Grafana均以Pod的形式启动和运行。Heapster与Master需配置安全连接。

    2. 部署与使用

    2.1. cAdvisor

    kubelet的启动参数—cadvisor-port可以定义cAdvisor对外提供服务的端口,默认为4194。可以通过浏览器Node_IP:port访问。也提供了REST API供客户端远程调用,API返回的格式为JSON,可以采用URL访问:http://`hostname`:`port`/api/`version`/`request`/

    例如:http://14.152.49.100:4194/api/v1.3/machine 获取主机信息。

    2.2. Service

    2.2.1. heapster-service

    heapster-service.yaml

    1. apiVersion:v1
    2. kind:Service
    3. metadata:
    4. label:
    5. kubenetes.io/cluster-service:"true"
    6. kubernetes.io/name:Heapster
    7. name:heapster
    8. namespace:kube-system
    9. spec:
    10. ports:
    11. - port:80
    12. targetPort:8082
    13. selector:
    14. k8s-app:heapster

    2.2.2. influxdb-service

    influxdb-service.yaml

    1. apiVersion:v1
    2. kind:Service
    3. metadata:
    4. label:null
    5. name:monitoring-InfluxDB
    6. namespace:kube-system
    7. spec:
    8. type:Nodeport
    9. ports:
    10. - name:http
    11. port:80
    12. targetPort:8083
    13. - name:api
    14. port:8086
    15. targetPort:8086
    16. Nodeport:8086
    17. selector:
    18. name:influxGrafana

    2.2.3. grafana-service

    grafana-service.yaml

    1. apiVersion:v1
    2. kind:Service
    3. metadata:
    4. label:
    5. kubenetes.io/cluster-service:"true"
    6. kubernetes.io/name:monitoring-Grafana
    7. name:monitoring-Grafana
    8. namespace:kube-system
    9. spec:
    10. type:Nodeport
    11. ports:
    12. port:80
    13. targetPort:8080
    14. Nodeport:8085
    15. selector:
    16. name:influxGrafana

    使用type=NodePort将InfluxDB和Grafana暴露在Node的端口上,以便通过浏览器进行访问。

    2.2.4. 创建service

    1. kubectl create -f heapster-service.yaml
    2. kubectl create -f InfluxDB-service.yaml
    3. kubectl create -f Grafana-service.yaml

    2.3. ReplicationController

    2.3.1. influxdb-grafana-controller

    influxdb-grafana-controller-v3.yaml

    1. apiVersion:v1
    2. kind:ReplicationController
    3. metadata:
    4. name:monitoring-influxdb-grafana-v3
    5. namespace:kube-system
    6. labels:
    7. k8s-app:influxGrafana
    8. version:v3
    9. kubernetes.io/cluster-service:"true
    10. spec:
    11. replicas:1
    12. selector:
    13. k8s-app:influxGrafana
    14. version:v3
    15. template:
    16. metadata:
    17. labels:
    18. k8s-app:influxGrafana
    19. version:v3
    20. kubernetes.io/cluster-service:"true
    21. spec:
    22. containers:
    23. - image:gcr.io/google_containers/heapster_influxdb:v0.5
    24. name:influxdb
    25. resources:
    26. limits:
    27. cpu:100m
    28. memory:500Mi
    29. requests:
    30. cpu:100m
    31. memory:500Mi
    32. ports:
    33. - containerPort:8083
    34. - containerPort:8086
    35. volumeMounts:
    36. -name:influxdb-persistent-storage
    37. mountPath:/data
    38. - image:grc.io/google_containers/heapster_grafana:v2.6.0-2
    39. name:grafana
    40. resources:
    41. limits:
    42. cpu:100m
    43. memory:100Mi
    44. requests:
    45. cpu:100m
    46. memory:100Mi
    47. env:
    48. - name:INFLUXDB_SERVICE_URL
    49. value:http://monitoring-influxdb:8086
    50. - name:GF_AUTH_BASIC_ENABLED
    51. value:"false"
    52. - name:GF_AUTH_ANONYMOUS_ENABLED
    53. value:"true"
    54. - name:GF_AUTH_ANONYMOUS_ORG_ROLE
    55. value:Admin
    56. - name:GF_SERVER_ROOT_URL
    57. value:/api/v1/proxy/namespace/kube-system/services/monitoring-grafana/
    58. volumeMounts:
    59. - name:grafana-persistent-storage
    60. mountPath:/var
    61. volumes:
    62. - name:influxdb-persistent-storage
    63. emptyDir{}
    64. - name:grafana-persistent-storage
    65. emptyDir{}

    2.3.2. heapster-controller

    heapster-controller.yaml

    1. apiVersion:v1
    2. kind:ReplicationController
    3. metadata:
    4. labels:
    5. k8s-app:heapster
    6. name:heapster
    7. version:v6
    8. name:heapster
    9. namespace:kube-system
    10. spec:
    11. replicas:1
    12. selector:
    13. name:heapster
    14. k8s-app:heapster
    15. version:v6
    16. template:
    17. metadata:
    18. labels:
    19. k8s-app:heapster
    20. version:v6
    21. spec:
    22. containers:
    23. - image:gcr.io/google_containers/heapster:v0.17.0
    24. name:heapster
    25. command:
    26. - /heapster
    27. - --source=kubernetes:http://192.168.1.128:8080?inClusterConfig=flase&kubeletHttps=true&useServiceAccount=true&auth=
    28. - --sink=InfluxDB:http://monitoring-InfluxDB:8086

    Heapster设置启动参数说明:

    1、–source

    配置监控来源,本例中表示从k8s-Master获取各个Node的信息。在URL的参数部分,修改kubeletHttps、inClusterConfig、useServiceAccount的值。

    2、–sink

    配置后端的存储系统,本例中使用InfluxDB。URL中主机名的地址是InfluxDB的Service名字,需要DNS服务正常工作,如果没有配置DNS服务可使用Service的ClusterIP地址。

    2.3.3. 创建ReplicationController

    1. kubelet create -f InfluxDB-Grafana-controller.yaml
    2. kubelet create -f heapster-controller.yaml

    3. 查看界面及数据

    3.1. InfluxDB

    访问任意一台Node机器的30083端口。

    3.2. Grafana

    访问任意一台Node机器的30080端口。

    4. 容器化部署

    4.1. 拉取镜像

    1. docker pull influxdb:latest
    2. docker pull cadvisor:latest
    3. docker pull grafana:latest
    4. docker pull heapster:latest

    4.2. 运行容器

    4.2.1. influxdb

    1. #influxdb
    2. docker run -d -p 8083:8083 -p 8086:8086 --expose 8090 --expose 8099 --volume=/opt/data/influxdb:/data --name influxsrv influxdb:latest

    4.2.2. cadvisor

    1. #cadvisor
    2. docker run --volume=/:/rootfs:ro --volume=/var/run:/var/run:rw --volume=/sys:/sys:ro --volume=/var/lib/docker/:/var/lib/docker:ro --publish=8080:8080 --detach=true --link influxsrv:influxsrv --name=cadvisor cadvisor:latest -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086

    4.2.3. grafana

    1. #grafana
    2. docker run -d -p 3000:3000 -e INFLUXDB_HOST=influxsrv -e INFLUXDB_PORT=8086 -e INFLUXDB_NAME=cadvisor -e INFLUXDB_USER=root -e INFLUXDB_PASS=root --link influxsrv:influxsrv --name grafana grafana:latest

    4.2.4. heapster

    1. docker run -d -p 8082:8082 --net=host heapster:canary --source=kubernetes:http://`k8s-server-ip`:8080?inClusterConfig=false/&useServiceAccount=false --sink=influxdb:http://`influxdb-ip`:8086

    4.3. 访问

    在浏览器输入IP:PORT