使用开源工具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 正常运行。
我们也来创建一下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应用程序,如下所示。
然后,在Grafana上添加Graphite作为数据源。请参考以下所示的Grafana的数据源部分,并将Graphite作为数据源添加进去。
接下来,在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数据源。
一旦仪表板被导入,就会立即在仪表板上显示如下指标。
同样,还有另一个名为Kubernetes节点主机度量的仪表板。一旦导入,仪表板将显示所选主机的度量。
如果这些仪表板的值超过了重要的阈值,您可以在这些仪表板上设置警报。有关如何设置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如何支持您的公司有任何问题,请务必预订演示,并直接与我们公司联系。