Longhorn,企业级云原生容器分布式存储之监控

发布时间:2025-03-18 点击:10
目录 设置 prometheus 和 grafana 来监控 longhorn 将 longhorn 指标集成到 rancher 监控系统中 longhorn 监控指标 支持 kubelet volume 指标 longhorn 警报规则示例设置 prometheus 和 grafana 来监控 longhorn
概览longhorn 在 rest 端点 http://longhorn_manager_ip:port/metrics 上以 prometheus 文本格式原生公开指标。有关所有可用指标的说明,请参阅 longhorn's metrics。您可以使用 prometheus, graphite, telegraf 等任何收集工具来抓取这些指标,然后通过 grafana 等工具将收集到的数据可视化。
本文档提供了一个监控 longhorn 的示例设置。监控系统使用 prometheus 收集数据和警报,使用 grafana 将收集的数据可视化/仪表板(visualizing/dashboarding)。高级概述来看,监控系统包含:
prometheus 服务器从 longhorn 指标端点抓取和存储时间序列数据。prometheus 还负责根据配置的规则和收集的数据生成警报。prometheus 服务器然后将警报发送到 alertmanager。 alertmanager 然后管理这些警报(alerts),包括静默(silencing)、抑制(inhibition)、聚合(aggregation)和通过电子邮件、呼叫通知系统和聊天平台等方法发送通知。 grafana 向 prometheus 服务器查询数据并绘制仪表板进行可视化。下图描述了监控系统的详细架构。
上图中有 2 个未提及的组件:
longhorn 后端服务是指向 longhorn manager pods 集的服务。longhorn 的指标在端点 http://longhorn_manager_ip:port/metrics 的 longhorn manager pods 中公开。 prometheus operator 使在 kubernetes 上运行 prometheus 变得非常容易。operator 监视 3 个自定义资源:servicemonitor、prometheus 和 alertmanager。当用户创建这些自定义资源时,prometheus operator 会使用用户指定的配置部署和管理 prometheus server, alermanager。安装
按照此说明将所有组件安装到 monitoring 命名空间中。要将它们安装到不同的命名空间中,请更改字段 namespace: other_namespace
创建 monitoring 命名空间
apiversion:v1 kind:namespace metadata: name:monitoring安装 prometheus operator
部署 prometheus operator 及其所需的 clusterrole、clusterrolebinding 和 service account。
apiversion:rbac.authorization.k8s.io/v1 kind:clusterrolebinding metadata: labels: app.kubernetes.io/component:controller app.kubernetes.io/name:prometheus-operator app.kubernetes.io/version:v0.38.3 name:prometheus-operator namespace:monitoring roleref: apigroup:rbac.authorization.k8s.io kind:clusterrole name:prometheus-operator subjects: -kind:serviceaccount name:prometheus-operator namespace:monitoring --- apiversion:rbac.authorization.k8s.io/v1 kind:clusterrole metadata: labels: app.kubernetes.io/component:controller app.kubernetes.io/name:prometheus-operator app.kubernetes.io/version:v0.38.3 name:prometheus-operator namespace:monitoring rules: -apigroups: -apiextensions.k8s.io resources: -customresourcedefinitions verbs: -create -apigroups: -apiextensions.k8s.io resourcenames: -alertmanagers.monitoring.coreos.com -podmonitors.monitoring.coreos.com -prometheuses.monitoring.coreos.com -prometheusrules.monitoring.coreos.com -servicemonitors.monitoring.coreos.com -thanosrulers.monitoring.coreos.com resources: -customresourcedefinitions verbs: -get -update -apigroups: -monitoring.coreos.com resources: -alertmanagers -alertmanagers/finalizers -prometheuses -prometheuses/finalizers -thanosrulers -thanosrulers/finalizers -servicemonitors -podmonitors -prometheusrules verbs: -'*' -apigroups: -apps resources: -statefulsets verbs: -'*' -apigroups: -"" resources: -configmaps -secrets verbs: -'*' -apigroups: -"" resources: -pods verbs: -list -delete -apigroups: -"" resources: -services -services/finalizers -endpoints verbs: -get -create -update -delete -apigroups: -"" resources: -nodes verbs: -list -watch -apigroups: -"" resources: -namespaces verbs: -get -list -watch --- apiversion:apps/v1 kind:deployment metadata: labels: app.kubernetes.io/component:controller app.kubernetes.io/name:prometheus-operator app.kubernetes.io/version:v0.38.3 name:prometheus-operator namespace:monitoring spec: replicas:1 selector: matchlabels: app.kubernetes.io/component:controller app.kubernetes.io/name:prometheus-operator template: metadata: labels: app.kubernetes.io/component:controller app.kubernetes.io/name:prometheus-operator app.kubernetes.io/version:v0.38.3 spec: containers: -args: ---kubelet-service=kube-system/kubelet ---logtostderr=true ---config-reloader-image=jimmidyson/configmap-reload:v0.3.0 ---prometheus-config-reloader=quay.io/prometheus-operator/prometheus-config-reloader:v0.38.3 image:quay.io/prometheus-operator/prometheus-operator:v0.38.3 name:prometheus-operator ports: -containerport:8080 name:http resources: limits: cpu:200m memory:200mi requests: cpu:100m memory:100mi securitycontext: allowprivilegeescalation:false nodeselector: beta.kubernetes.io/os:linux securitycontext: runasnonroot:true runasuser:65534 serviceaccountname:prometheus-operator --- apiversion:v1 kind:serviceaccount metadata: labels: app.kubernetes.io/component:controller app.kubernetes.io/name:prometheus-operator app.kubernetes.io/version:v0.38.3 name:prometheus-operator namespace:monitoring --- apiversion:v1 kind:service metadata: labels: app.kubernetes.io/component:controller app.kubernetes.io/name:prometheus-operator app.kubernetes.io/version:v0.38.3 name:prometheus-operator namespace:monitoring spec: clusterip:none ports: -name:http port:8080 targetport:http selector: app.kubernetes.io/component:controller app.kubernetes.io/name:prometheus-operator安装 longhorn servicemonitor
longhorn servicemonitor 有一个标签选择器 app: longhorn-manager 来选择 longhorn 后端服务。稍后,prometheus crd 可以包含 longhorn servicemonitor,以便 prometheus server 可以发现所有 longhorn manager pods 及其端点。
apiversion:monitoring.coreos.com/v1 kind:servicemonitor metadata: name:longhorn-prometheus-servicemonitor namespace:monitoring labels: name:longhorn-prometheus-servicemonitor spec: selector: matchlabels: app:longhorn-manager namespaceselector: matchnames: -longhorn-system endpoints: -port:manager安装和配置 prometheus alertmanager
使用 3 个实例创建一个高可用的 alertmanager 部署:
apiversion:monitoring.coreos.com/v1 kind:alertmanager metadata: name:longhorn namespace:monitoring spec: replicas:3除非提供有效配置,否则 alertmanager 实例将无法启动。有关 alertmanager 配置的更多说明,请参见此处。下面的代码给出了一个示例配置:
global: resolve_timeout:5m route: group_by:[alertname] receiver:email_and_slack receivers: -name:email_and_slack email_configs: -to:<theemailaddresstosendnotificationsto> from:<thesenderaddress> smarthost:<thesmtphostthroughwhichemailsaresent> #smtpauthenticationinformation. auth_username:<theusername> auth_identity:<theidentity> auth_password:<thepassword> headers: subject:'longhorn-alert' text:|- {{range.alerts}} *alert:*{{.annotations.summary}}-`{{.labels.severity}}` *description:*{{.annotations.description}} *details:* {{range.labels.sortedpairs}}•*{{.name}}:*`{{.value}}` {{end}} {{end}} slack_configs: -api_url:<theslackwebhookurl> channel:<thechannelorusertosendnotificationsto> text:|- {{range.alerts}} *alert:*{{.annotations.summary}}-`{{.labels.severity}}` *description:*{{.annotations.description}} *details:* {{range.labels.sortedpairs}}•*{{.name}}:*`{{.value}}` {{end}} {{end}}将上述 alertmanager 配置保存在名为 alertmanager.yaml 的文件中,并使用 kubectl 从中创建一个 secret。
alertmanager 实例要求 secret 资源命名遵循 alertmanager-{alertmanager_name} 格式。在上一步中,alertmanager 的名称是 longhorn,所以 secret 名称必须是 alertmanager-longhorn
$kubectlcreatesecretgenericalertmanager-longhorn--from-file=alertmanager.yaml-nmonitoring为了能够查看 alertmanager 的 web ui,请通过 service 公开它。一个简单的方法是使用 nodeport 类型的 service :
apiversion:v1 kind:service metadata: name:alertmanager-longhorn namespace:monitoring spec: type:nodeport ports: -name:web nodeport:30903 port:9093 protocol:tcp targetport:web selector: alertmanager:longhorn创建上述服务后,您可以通过节点的 ip 和端口 30903 访问 alertmanager 的 web ui。
使用上面的 nodeport 服务进行快速验证,因为它不通过 tls 连接进行通信。您可能希望将服务类型更改为 clusterip,并设置一个 ingress-controller 以通过 tls 连接公开 alertmanager 的 web ui。
安装和配置 prometheus server
创建定义警报条件的 prometheusrule 自定义资源。
apiversion:monitoring.coreos.com/v1 kind:prometheusrule metadata: labels: prometheus:longhorn role:alert-rules name:prometheus-longhorn-rules namespace:monitoring spec: groups: -name:longhorn.rules rules: -alert:longhornvolumeusagecritical annotations: description:longhornvolume{{$labels.volume}}on{{$labels.node}}isat{{$value}}%usedfor morethan5minutes. summary:longhornvolumecapacityisover90%used. expr:100*(longhorn_volume_usage_bytes/longhorn_volume_capacity_bytes)>90 for:5m labels: issue:longhornvolume{{$labels.volume}}usageon{{$labels.node}}iscritical. severity:critical有关如何定义警报规则的更多信息,请参见https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/#alerting-rules
如果激活了 rbac 授权,则为 prometheus pod 创建 clusterrole 和 clusterrolebinding:
apiversion:v1 kind:serviceaccount metadata: name:prometheus namespace:monitoring apiversion:rbac.authorization.k8s.io/v1beta1 kind:clusterrole metadata: name:prometheus namespace:monitoring rules: -apigroups:[""] resources: -nodes -services -endpoints -pods verbs:["get","list","watch"] -apigroups:[""] resources: -configmaps verbs:["get"] -nonresourceurls:["/metrics"] verbs:["get"] apiversion:rbac.authorization.k8s.io/v1beta1 kind:clusterrolebinding metadata: name:prometheus roleref: apigroup:rbac.authorization.k8s.io kind:clusterrole name:prometheus subjects: -kind:serviceaccount name:prometheus namespace:monitoring创建 prometheus 自定义资源。请注意,我们在 spec 中选择了 longhorn 服务监视器(service monitor)和 longhorn 规则。
apiversion:monitoring.coreos.com/v1 kind:prometheus metadata: name:prometheus namespace:monitoring spec: replicas:2 serviceaccountname:prometheus alerting: alertmanagers: -namespace:monitoring name:alertmanager-longhorn port:web servicemonitorselector: matchlabels: name:longhorn-prometheus-servicemonitor ruleselector: matchlabels: prometheus:longhorn role:alert-rules为了能够查看 prometheus 服务器的 web ui,请通过 service 公开它。一个简单的方法是使用 nodeport 类型的 service:
apiversion:v1 kind:service metadata: name:prometheus namespace:monitoring spec: type:nodeport ports: -name:web nodeport:30904 port:9090 protocol:tcp targetport:web selector: prometheus:prometheus创建上述服务后,您可以通过节点的 ip 和端口 30904 访问 prometheus server 的 web ui。
此时,您应该能够在 prometheus server ui 的目标和规则部分看到所有 longhorn manager targets 以及 longhorn rules。
使用上述 nodeport service 进行快速验证,因为它不通过 tls 连接进行通信。您可能希望将服务类型更改为 clusterip,并设置一个 ingress-controller 以通过 tls 连接公开 prometheus server 的 web ui。
安装 grafana
创建 grafana 数据源配置:
apiversion:v1 kind:configmap metadata: name:grafana-datasources namespace:monitoring data: prometheus.yaml:|- { "apiversion":1, "datasources":[ { "access":"proxy", "editable":true, "name":"prometheus", "orgid":1, "type":"prometheus", "url":"http://prometheus:9090", "version":1 } ] }创建 grafana 部署:
apiversion:apps/v1 kind:deployment metadata: name:grafana namespace:monitoring labels: app:grafana spec: replicas:1 selector: matchlabels: app:grafana template: metadata: name:grafana labels: app:grafana spec: containers: -name:grafana image:grafana/grafana:7.1.5 ports: -name:grafana containerport:3000 resources: limits: memory:"500mi" cpu:"300m" requests: memory:"500mi" cpu:"200m" volumemounts: -mountpath:/var/lib/grafana name:grafana-storage -mountpath:/etc/grafana/provisioning/datasources name:grafana-datasources readonly:false volumes: -name:grafana-storage emptydir:{} -name:grafana-datasources configmap: defaultmode:420 name:grafana-datasources在 nodeport 32000 上暴露 grafana:
apiversion:v1 kind:service metadata: name:grafana namespace:monitoring spec: selector: app:grafana type:nodeport ports: -port:3000 targetport:3000 nodeport:32000使用上述 nodeport 服务进行快速验证,因为它不通过 tls 连接进行通信。您可能希望将服务类型更改为 clusterip,并设置一个 ingress-controller 以通过 tls 连接公开 grafana。
使用端口 32000 上的任何节点 ip 访问 grafana 仪表板。默认凭据为:
user:admin pass:admin安装 longhorn dashboard
进入 grafana 后,导入预置的面板:https://grafana.com/grafana/dashboards/13032
有关如何导入 grafana dashboard 的说明,请参阅 https://grafana.com/docs/grafana/latest/reference/export_import/
成功后,您应该会看到以下 dashboard:
将 longhorn 指标集成到 rancher 监控系统中
关于 rancher 监控系统
使用 rancher,您可以通过与的开源监控解决方案 prometheus 的集成来监控集群节点、kubernetes 组件和软件部署的状态和进程。
有关如何部署/启用 rancher 监控系统的说明,请参见https://rancher.com/docs/rancher/v2.x/en/monitoring-alerting/
将 longhorn 指标添加到 rancher 监控系统
如果您使用 rancher 来管理您的 kubernetes 并且已经启用 rancher 监控,您可以通过简单地部署以下 servicemonitor 将 longhorn 指标添加到 rancher 监控中:
apiversion:monitoring.coreos.com/v1 kind:servicemonitor metadata: name:longhorn-prometheus-servicemonitor namespace:longhorn-system labels: name:longhorn-prometheus-servicemonitor spec: selector: matchlabels: app:longhorn-manager namespaceselector: matchnames: -longhorn-system endpoints: -port:manager创建 servicemonitor 后,rancher 将自动发现所有 longhorn 指标。
然后,您可以设置 grafana 仪表板以进行可视化。
longhorn 监控指标
volume(卷)
指标名 说明 示例 longhorn_volume_actual_size_bytes 对应节点上卷的每个副本使用的实际空间 longhorn_volume_actual_size_bytes{node="worker-2",volume="testvol"} 1.1917312e+08 longhorn_volume_capacity_bytes 此卷的配置大小(以 byte 为单位) longhorn_volume_capacity_bytes{node="worker-2",volume="testvol"} 6.442450944e+09 longhorn_volume_state 本卷状态:1=creating, 2=attached, 3=detached, 4=attaching, 5=detaching, 6=deleting longhorn_volume_state{node="worker-2",volume="testvol"} 2 longhorn_volume_robustness 本卷的健壮性: 0=unknown, 1=healthy, 2=degraded, 3=faulted longhorn_volume_robustness{node="worker-2",volume="testvol"} 1 node(节点)
指标名 说明 示例 longhorn_node_status 该节点的状态:1=true, 0=false longhorn_node_status{condition="ready",condition_reason="",node="worker-2"} 1

淄博网站建设网站如何规划?
秀峰企业网站开发包括什么
实现企业网站建设的必要性有哪几个方面?
网站建设开发具体流程是怎样的?
企业网站制作需要注意几个方面
百度正式取消百度快照时间
网站建设做伪静态吗?
网站建设规划前提找家专业建站公司