使用开源工具Graphite对Kubernetes进行监控

首先

本文将介绍如何使用开源的监控工具Graphite监视Kubernetes,并使用Grafana进行可视化。重点是监视和绘制用于监视Kubernetes集群的重要指标。您可以从Grafana仪表板资源中下载Kubernetes的自定义仪表板,并进行实施和监视。这些监控仪表板具有可以在数据上进行细致钻取的变量。

再說明中國本土的選項:
MetricFire在未進行任何自行設置的情況下,已經完成了Graphite和Grafana的整合並提供了額外的功能。請務必在MetricFire免費試用中註冊。您可以直接在MetricFire平台上使用Graphite和Grafana。MetricFire是一個托管式的Graphite、Grafana和Prometheus服務,我們負責設置和管理這些開源工具,因此客戶無需進行任何操作。

Kubernetes的概述

根据Kubernetes官方定义,Kubernetes被称为一种”可移植且可扩展的开源平台”,用于管理容器化的工作负载和服务,并且能够提供声明式配置和自动化功能。Kubernetes生态系统正在快速且广泛地发展,用户可以广泛地利用Kubernetes的服务、支持和工具。

在今天的行业中,监控Kubernetes部署是一项困难但必要的活动。本文将详细解释如何使用仪表板来监控Kubernetes部署,不涉及Kubernetes的基础知识。如需了解更多关于Kubernetes监控的详细信息,请参阅MetricFire博客中关于Kubernetes监控的概述。

石墨的概述

Graphite是一个非常受欢迎的企业监控工具。MetricFire自2012年以来一直在开发和改进Hosted Graphite产品。Graphite是一个时序监控工具,它接收由StatsD等收集器推送的度量数据。它收集用户指定的时序度量并进行监视。如果您想了解有关Graphite的基础知识,请在阅读本文之前查看有关架构和概念以及Graphite安装和设置的文章。

Graphite、Grafana、Kubernetes的安装准备

本文介绍了如何使用在AWS上部署的Kubernetes集群。请根据Amazon AWS EKS用户指南的说明安装AWS CLI,并安装kubectl命令行工具。

一旦安装了kubectl,执行命令”kubectl cluster-info”时,将显示以下输出。

~ ./kubectl cluster-info
Kubernetes master is running at https://92797800687320683968AF0937C2B5D3.yl4.ap-south-1.eks.amazonaws.com
CoreDNS is running at https://92797800687320683968AF0937C2B5D3.yl4.ap-south-1.eks.amazonaws.com/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

接下来,我们将在 Kubernetes 集群中设置 Grafana。以下是一个简单的配置文件,用于创建 Grafana Pod 和在 Kubernetes 上运行的服务。

| apiVersion: apps/v1 |
|:--|
| kind: Deployment |
| metadata: |
|  labels: |
|    app: grafana |
|  name: grafana |
| spec: |
|  replicas: 1 |
|  selector: |
|    matchLabels: |
|      app: grafana |
|  template: |
|    metadata: |
|      labels: |
|        app: grafana |
|    spec: |
|      containers: |
|      - image: grafana/grafana:5.4.3 |
|        name: grafana |
|        ports: |
|        - containerPort: 3000 |
|          name: http |
|  |
|        volumeMounts: |
|          - name: grafana-storage |
|            mountPath: /var/lib/grafana |
|      volumes: |
|        - name: grafana-storage |
|          persistentVolumeClaim: |
|            claimName: grafana-storage |
|      securityContext: |
|        runAsNonRoot: true |
|        runAsUser: 65534 |
|        fsGroup: 472 |
| --- |
| kind: PersistentVolumeClaim |
| apiVersion: v1 |
| metadata: |
|  name: grafana-storage |
| spec: |
|  accessModes: |
|    - ReadWriteOnce |
|  resources: |
|    requests: |
|      storage: 1Gi |
| --- |
| apiVersion: v1 |
| kind: Service |
| metadata: |
|  name: grafana |
|  labels: |
|    app: grafana |
| spec: |
|  type: LoadBalancer |
|  ports: |
|  - port: 3000 |
|    protocol: TCP |
|    targetPort: 3000 |
|  selector: |
|    app: grafana |

执行「kubectl create -f grafana-deployment.yml」命令来创建Grafana的pod和服务。
执行命令「kubectl get service」,将会显示如下输出。

➜  ~/github/k8-graphite-monitoring (master) kubectl get service
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP                                                                PORT(S)                       AGE
grafana      LoadBalancer   10.100.252.229   a942a31a4780f11eaa9010a814a720da-1449083553.ap-south-1.elb.amazonaws.com   3000:31159/TCP                3d21h
kubernetes   ClusterIP      10.100.0.1       <none>                                                                     443/TCP                       3d22h

a942a31a4780f11eaa9010a814a720da-1449083553.ap-south-1.elb.amazonaws.com 是新创建服务的主机名,3000 是访问端口。请访问 http://a942a31a4780f11eaa9010a814a720da-1449083553.ap-south-1.elb.amazonaws.com:3000,并使用 admin/admin 登录,确认 Grafana 正常运行。

image.png

我们也来创建一下Graphite的Pod和服务吧。使用以下配置文件来创建Graphite服务。

apiVersion: apps/v1
kind: Deployment
metadata:
 labels:
   app: graphite
 name: graphite
spec:
 replicas: 1
 selector:
   matchLabels:
     app: graphite
 template:
   metadata:
     labels:
       app: graphite
   spec:
     containers:
     - image: graphiteapp/docker-graphite-statsd
       name: graphite
       ports:
       - containerPort: 2003
         name: carbon-plain     
       - containerPort: 2004
         name: carbon-pkl   
       - containerPort: 2023
         name: carbon-ag-plain
       - containerPort: 2024
         name: carbon-ag-pkl   
       - containerPort: 8125
         name: statsd   
       - containerPort: 8126
         name: statsd-admin  
       - containerPort: 80
         name: http       
---
apiVersion: v1
kind: Service
metadata:
 name: graphite
 labels:
   app: graphite
spec:
 type: LoadBalancer
 ports:
 - port: 80
   protocol: TCP
   targetPort: 80
   name: http
 - port: 2003
   protocol: TCP
   targetPort: 2003
   name: carbon
 selector:
   app: graphite

运行「kubectl create -f Graphite-deployment.yml」以创建此Pod和服务。
此时应该同时正在运行Grafana和Graphite。
运行「kubectl get service」以确认两个服务都在运行。

➜  ~/github/k8-graphite-monitoring (master) kubectl get service
NAME         TYPE           CLUSTER-IP       EXTERNAL-IP                                                                PORT(S)                       AGE
grafana      LoadBalancer   10.100.252.229   a942a31a4780f11eaa9010a814a720da-1449083553.ap-south-1.elb.amazonaws.com   3000:31159/TCP                3d21h
graphite     LoadBalancer   10.100.216.91    ac0f466207b2211eaa9010a814a720da-687823427.ap-south-1.elb.amazonaws.com    80:32198/TCP,2003:32041/TCP   104s
kubernetes   ClusterIP      10.100.0.1       <none>                                                                     443/TCP                       3d22h

您可以像Grafana一样,在浏览器中输入http://ac0f466207b2211eaa9010a814a720da-687823427.ap-south-1.elb.amazonaws.com,然后打开GraphiteWeb应用程序,如下所示。

image.png

然后,在Grafana上添加Graphite作为数据源。请参考以下所示的Grafana的数据源部分,并将Graphite作为数据源添加进去。

image.png

接下来,在Kubernetes集群中运行Snap Daemon。Snap Daemon是一个监控守护程序,它会拉取各种Kubernetes监控指标,并将它们推送到Graphite。

在执行Snap Daemon之前,您需要对snap_ds.yml文件进行一个小的修改。请按照以下方式在config部分更新Graphite服务的主机名和端口:

apiVersion: apps/v1
kind: DaemonSet
metadata:
 name: snap
spec:
 selector:
   matchLabels:
     name: snap
 template:
   metadata:
     name: snap
     labels:
       name: snap
   spec:
     hostPID: true
     hostNetwork: true
     containers:
     - name: snap
       image: raintank/snap_k8s:v4
       volumeMounts:
         - mountPath: /sys/fs/cgroup
           name: cgroup
         - mountPath: /var/run/docker.sock
           name: docker-sock
         - mountPath: /var/lib/docker
           name: fs-stats
         - mountPath: /usr/local/bin/docker
           name: docker
         - mountPath: /proc_host
           name: proc
         - mountPath: /opt/snap/tasks
           name: snap-tasks
       ports:
       - containerPort: 8181
         hostPort: 8181
         name: snap-api
       imagePullPolicy: IfNotPresent
       securityContext:
         privileged: true
       env:
         - name: PROCFS_MOUNT
           value: /proc_host
     volumes:
       - name: dev
         hostPath:
           path: /dev
       - name: cgroup
         hostPath:
           path: /sys/fs/cgroup
       - name: docker-sock
         hostPath:
           path: /var/run/docker.sock
       - name: fs-stats
         hostPath:
           path: /var/lib/docker
       - name: docker
         hostPath:
           path: /usr/bin/docker
       - name: proc
         hostPath:
           path: /proc
       - name: snap-tasks
         configMap:
           name: snap-tasks
---
apiVersion: v1
kind: ConfigMap
metadata:
 name: snap-tasks
data:
 core.json: |-
   {
       "version": 1,
       "schedule": {
           "type": "simple",
           "interval": "10s"
       },
       "workflow": {
           "collect": {
               "metrics": {
                   "/intel/docker/*":{},
                   "/intel/procfs/cpu/*": {},
                   "/intel/procfs/meminfo/*": {},
                   "/intel/procfs/iface/*": {},
                   "/intel/linux/iostat/*": {},
                   "/intel/procfs/load/*": {}
               },
               "config": {
                   "/intel/procfs": {
                       "proc_path": "/proc_host"
                   }
               },
               "process": null,
               "publish": [
                   {
                       "plugin_name": "graphite",                   
                       "config": {
                           "prefix": "snap.dev.<%NODE%>",
                           "server": "ac0f466207b2211eaa9010a814a720da-687823427.ap-south-1.elb.amazonaws.com",
                           "port": 2003
                       }
                   }
               ]
           }
       }
   }

执行「kubectl create -f snap_ds.yml」命令来创建并启动Snap守护进程。执行「kubectl get pod」命令会显示以下输出。

NAME                       READY   STATUS    RESTARTS   AGE
grafana-6f64b8c7f6-tc7qn   1/1     Running   0          3d23h
graphite-775d8b989-zwp9x   1/1     Running   0          65m
snap-dblx2                 1/1     Running   0          56m
snap-g5pzm                 1/1     Running   0          56m
snap-jdqrg                 1/1     Running   0          56m

Grafana需要一个Pod,Graphite需要一个Pod,Snap需要三个Pod进行展示。这是因为Kubernetes集群中有三个节点,并且Snap在每个节点上作为守护程序运行,从中拉取指标并将其推送到Graphite。

使用Grafana进行监控可视化绘图

Grafana内部附带了许多预构建的仪表盘,可以在Grafana仪表盘资源网站上找到。我们将使用其中一个仪表盘来监控Kubernetes:Kubernetes容器统计数据。

在Kubernetes容器状态页面上,单击下载JSON链接,将它导入Grafana门户。请正确选择Graphite数据源。

image.png

一旦仪表板被导入,就会立即在仪表板上显示如下指标。

image.png

同样,还有另一个名为Kubernetes节点主机度量的仪表板。一旦导入,仪表板将显示所选主机的度量。

image.png

如果这些仪表板的值超过了重要的阈值,您可以在这些仪表板上设置警报。有关如何设置Grafana警报和创建自定义仪表板的方法,请参阅文章“从基础到细节的Grafana仪表板”。

您还可以根据由Kubernetes提供的指标创建其他类型的可视化。请查看”您喜爱的Grafana仪表板”文章,并创建几个更高级的仪表板。

使用MetricFire进行监控设置

在上述设置中,它适用于包含仅几个节点的非常基本的 Kubernetes 基础设施。要处理数百个节点并具有数 Mbps 的网络流量的生产级负载,需要扩展 Graphite 和 Grafana 以处理不断增加的负载。

推出了Hosted Graphite和Hosted Grafana,这样一来可以根据长期存储需求进行扩展,并自动提供数据的冗余存储。

通过MetricFire提供的托管Graphite和托管Grafana,充分利用MetricFire所有产品的持续成长和基于开源项目的基础,可以实现新功能的持续活跃部署。现在就注册MetricFire的免费试用,几分钟内即可开始构建Kubernetes仪表板。

概括一下

在这篇文章中,我们介绍了使用Graphite设置Kubernetes监控的方法。我们还介绍了使用Graphite和Grafana对Kubernetes进行高级可视化监控。

请注册免费试用Hosted Graphite和Grafana。如果您对MetricFire的产品或MetricFire如何支持您的公司有任何问题,请务必预订演示,并直接与我们公司联系。

广告
将在 10 秒后关闭
bannerAds