用K8S+Prometheus四步搭建Ceph监控
用K8S+Prometheus四步搭建Ceph监控
Ceph的监控方案有很多,有专业的Calamari,也有collectd-ceph+influxdb的。不过不管用什么,我们的目的其实是能够第一时间直观的看到Ceph集群的运行状态。在这点上我觉得目前用Grafana+Prometheus的展示Ceph集群的状态还是挺直观方便的,重要的是得益于Prometheus和Kubernetes良好的结合,我们可以非常快的复制几个Ceph集群的监控。
对于Ceph监控,需求也很简单:
- Cluster、Mon节点、OSD节点和Pools的状态检查
- pg状态和object数量
- 存储总容量、使用量、iops和吞吐量
- Ceph存储网卡流量,CPU内存利用率等
- 查看数据的延迟
- 监控多套Ceph集群
目前Ceph网上流行的Grafana模板如下图:
Ceph集群Dashboard OSD信息 Pool信息其实可以看到默认的三个展示页面已经能够实现我的大部分需求了,日常工作中大部分时间都是关注集群的监控状态和iops,而且这个基于全开源的方案,基本没有开发成本,挺不错的。
那么如何快速搭建一套基于K8S+Prometheus的Ceph监控呢?
第1步. ceph-exporter
ceph-exporter是采集Ceph集群数据的客户端程序,启动时默认会从/etc/ceph目录下获取Ceph的配置信息。ceph-exporter是一个用Go写的二进制静态程序,运行它的方式可以是Pod,也可是在物理机上独立启动。
Pod
yaml文件如下:
apiVersion: v1
kind: Pod
metadata:
annotations:
kubernetes.io/created-by: |
{"kind":"SerializedReference","apiVersion":"v1","reference":{"kind":"DaemonSet","namespace":"monitoring","name":"ceph-exporter","uid":"3c5bf0d4-2fd9-11e7-8834-1866da6d9abb","apiVersion":"extensions","resourceVersion":"1336275"}}
labels:
app: ceph-exporter
pod-template-generation: "1"
name: ceph-exporter-1wfcd
namespace: monitoring
ownerReferences:
- apiVersion: extensions/v1beta1
blockOwnerDeletion: true
controller: true
kind: DaemonSet
name: ceph-exporter
spec:
containers:
- image: digitalocean/ceph_exporter
imagePullPolicy: IfNotPresent
name: ceph-exporter
resources:
limits:
cpu: 100m
memory: 200Mi
requests:
cpu: 100m
memory: 200Mi
volumeMounts:
- mountPath: /etc/ceph
name: ceph-conf
hostNetwork: true
nodeName: <hostname> #Ceph宿主机的ip
nodeSelector:
kubernetes.io/hostname: <hostname> #Ceph宿主机的ip
restartPolicy: Always
serviceAccount: default
serviceAccountName: default
volumes:
- hostPath:
path: /etc/ceph
name: ceph-conf
物理机
直接将ceph-exporter文件拷贝到目标节点,可以采用nohup或者手动编写systemd文件启动采集程序。
运行成功后可以在浏览器中直接访问http://目标ip:9128/metrics
第2步. 定义服务
Pod
---
apiVersion: v1
kind: Service
metadata:
labels:
app: ceph-exporter
k8s-app: ceph-exporter
name: ceph-exporter
namespace: monitoring
spec:
clusterIP: None
ports:
- name: web
port: 9128
protocol: TCP
targetPort: 9128
selector:
app: ceph-exporter
type: ClusterIP
---
apiVersion: monitoring.coreos.com/v1alpha1
kind: ServiceMonitor
metadata:
labels:
app: ceph-exporter
name: ceph-exporter
namespace: monitoring
spec:
endpoints:
- interval: 10s
port: web
namespaceSelector:
matchNames:
- monitoring
selector:
matchLabels:
app: ceph-exporter
物理机
---
apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: ocata-ceph
name: ocata-ceph
namespace: monitoring
spec:
clusterIP: None
ports:
- name: api
port: 9128
protocol: TCP
targetPort: 9128
sessionAffinity: None
type: ClusterIP
---
apiVersion: v1
kind: Endpoints
metadata:
labels:
k8s-app: ocata-ceph
name: ocata-ceph
namespace: monitoring
subsets:
- addresses:
- ip: <物理机ip>
nodeName: <物理机ip>
ports:
- name: api
port: 9128
protocol: TCP
---
apiVersion: monitoring.coreos.com/v1alpha1
kind: ServiceMonitor
metadata:
labels:
app: ocata-ceph
name: ocata-ceph
namespace: monitoring
spec:
endpoints:
- interval: 10s
port: api
namespaceSelector:
matchNames:
- monitoring
selector:
matchLabels:
k8s-app: ocata-ceph
创建成功后就可以在Prometheus的状态里面查看job是否被添加上,如果添加上了,prometheus就会定期去目标节点上拉去新数据。
Prometheus config Prometheus Target第3步. 测试
简单测试下Prometheus的查询语句,如果没问题就可以在前端Grafana上展示出来了。
metrics ceph_health_stats osd状态,根据job过滤第4步.. Grafana导入模板
原来模板不支持templating,我这里改了下,可以在这个页面上选择多个Ceph集群并展示状态。
我将改好的Grafana模板传到这里,欢迎下载。