Longhorn, 엔터프라이즈급 클라우드 네이티브 컨테이너 분산 스토리지 - 모니터링(Prometheus+AlertManager+Grafana)

출처: Longhorn 1.1.2 공식 기술 매뉴얼

시리즈

  • Longhorn이란?
  • Longhorn 엔터프라이즈급 클라우드 네이티브 컨테이너 분산 스토리지 솔루션 설계 아키텍처 및 개념
  • Longhorn 엔터프라이즈급 클라우드 네이티브 컨테이너 분산 스토리지 - 배포篇
  • Longhorn 엔터프라이즈급 클라우드 네이티브 컨테이너 분산 스토리지 - 볼륨(Volume)과 노드(Node)
  • Longhorn, 엔터프라이즈급 클라우드 네이티브 컨테이너 분산 스토리지 - K8S 리소스 설정 예시

목차

  1. PrometheusGrafana를 활용한 Longhorn 모니터링 구축
  2. Longhorn 지표를 Rancher 모니터링 시스템에 통합
  3. Longhorn 모니터링 지표
  4. Kubelet 볼륨 지표 지원
  5. Longhorn 알림 규칙 예시

PrometheusGrafana를 활용한 Longhorn 모니터링 구축

개요

Longhorn은 REST 엔드포인트 http://LONGHORN_MANAGER_IP:PORT/metrics에서 Prometheus 텍스트 형식으로 지표를 기본적으로 노출합니다. 사용 가능한 모든 지표에 대한 설명은 Longhorn의 metrics 문서를 참조하세요. Prometheus, Graphite, Telegraf 등 다양한 수집 도구를 사용하여 이러한 지표를 스크레이프한 후, Grafana와 같은 시각화 도구로 데이터를 확인할 수 있습니다.

이 문서에서는 Longhorn 모니터링 설정 예시를 제공합니다. 모니터링 시스템은 Prometheus로 데이터 수집 및 알림을 처리하고, Grafana로 수집된 데이터를 시각화/대시보딩합니다. 고수준 구조는 다음과 같습니다:

  • Prometheus 서버가 Longhorn 지표 엔드포인트에서 시계열 데이터를 스크레이프하고 저장합니다. Prometheus는 설정된 규칙과 수집된 데이터를 기반으로 알림을 생성합니다. 그 후 Prometheus 서버는 Alertmanager로 알림을 전송합니다.
  • AlertManager는 이러한 알림을 관리하며, 알림静音(silencing), 억제(inhibition), 집계(aggregation) 및 이메일, 콜백 시스템, 채팅 플랫폼 등을 통한 알림 전송을 담당합니다.
  • Grafana는 Prometheus 서버에 데이터를 쿼리하여 대시보드를 통해 시각화합니다.

다음 그림은 모니터링 시스템의 상세 아키텍처를 보여줍니다.

위 그림에 언급되지 않은 2개의 구성 요소가 있습니다:

  • Longhorn 백엔드 서비스는 Longhorn manager pods 집합을 대상으로 하는 서비스입니다. Longhorn의 지표는 Longhorn manager pods의 엔드포인트 http://LONGHORN_MANAGER_IP:PORT/metrics에서 공개됩니다.
  • Prometheus operator를 사용하면 Kubernetes에서 Prometheus 실행이 매우 용이해집니다. operator는 3개의 사용자 정의 리소스(ServiceMonitor, Prometheus, AlertManager)를 감시합니다. 사용자가 이러한 사용자 정의 리소스를 생성하면 Prometheus Operator는 사용자가 지정한 설정으로 Prometheus 서버와 AlertManager를 배포하고 관리합니다.

설치

모든 구성 요소를 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에는 Longhorn 백엔드 서비스를 선택하기 위한 레이블 선택자 app: longhorn-manager가 있습니다. 이후 Prometheus CRD에 Longhorn ServiceMonitor를 포함하면 Prometheus 서버가 모든 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 설치 및 설정

  1. 3개의 인스턴스로 고가용성 Alertmanager 배포 생성:
apiVersion: monitoring.coreos.com/v1
kind: Alertmanager
metadata:
  name: longhorn
  namespace: monitoring
spec:
  replicas: 3
  1. 유효한 구성을 제공하지 않으면 Alertmanager 인스턴스가 시작되지 않습니다. Alertmanager 설정에 대한 자세한 설명은 여기에서 확인하세요. 다음은 예시 설정입니다:
global:
  resolve_timeout: 5m
route:
  group_by: [alertname]
  receiver: email_and_slack
receivers:
- name: email_and_slack
  email_configs:
  - to: <알림을 받을 이메일 주소>
    from: <발신자 주소>
    smarthost: <이메일이 전송되는 SMTP 호스트>
    # SMTP 인증 정보
    auth_username: <사용자 이름>
    auth_identity: <아이덴티티>
    auth_password: <비밀번호>
    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: <Slack 웹훅 URL>
    channel: <알림을 보낼 채널 또는 사용자>
    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이어야 합니다.

$ kubectl create secret generic alertmanager-longhorn --from-file=alertmanager.yaml -n monitoring
  1. 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에 접근할 수 있습니다.

빠른 검증에는 TLS 연결을 사용하지 않으므로 위에 언급된 NodePort 서비스를 사용하세요. Service 유형을 ClusterIP로 변경하고 Ingress-controller를 설정하여 TLS 연결을 통해 Alertmanager의 web UI를 노출하는 것이 좋습니다.

Prometheus 서버 설치 및 설정

  1. 알림 조건을 정의하는 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: Longhorn volume {{$labels.volume}} on {{$labels.node}} is at {{$value}}% used for more than 5 minutes.
        summary: Longhorn volume capacity is over 90% used.
      expr: 100 * (longhorn_volume_usage_bytes / longhorn_volume_capacity_bytes) > 90
      for: 5m
      labels:
        issue: Longhorn volume {{$labels.volume}} usage on {{$labels.node}} is critical.
        severity: critical

알림 규칙 정의에 대한 자세한 내용은 https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/#alerting-rules를 참조하세요. 2. 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
  1. Prometheus 사용자 정의 리소스를 생성합니다. 注意: 여기서는 spec에서 Longhorn 서비스 모니터와 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
  1. 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 서버의 web UI에 접근할 수 있습니다.

此时, Prometheus 서버 UI의 Targets 및 Rules 섹션에서 모든 Longhorn manager targets과 Longhorn rules가 표시되어야 합니다.

빠른 검증에는 TLS 연결을 사용하지 않으므로 위에 언급된 NodePort 서비스를 사용하세요. Service 유형을 ClusterIP로 변경하고 Ingress-controller를 설정하여 TLS 연결을 통해 Prometheus 서버의 web UI를 노출하는 것이 좋습니다.

Grafana 설치

  1. 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
            }
        ]
    }
  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
  1. 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

빠른 검증에는 TLS 연결을 사용하지 않으므로 위에 언급된 NodePort 서비스를 사용하세요. Service 유형을 ClusterIP로 변경하고 Ingress-controller를 설정하여 TLS 연결을 통해 Grafana를 노출하는 것이 좋습니다.

  1. 포트 32000의 노드 IP를 사용하여 Grafana 대시보드에 접근하세요. 기본 자격 증명:
사용자: admin
비밀번호: admin
  1. Longhorn 대시보드 설치

Grafana에 접속한 후 사전 제작된 대시보드를 가져오세요: https://grafana.com/grafana/dashboards/13032

Grafana 대시보드 가져오기에 대한 지침은 https://grafana.com/docs/grafana/latest/reference/export_import/를 참조하세요.

성공하면 다음 대시보드가 표시됩니다:

Longhorn 지표를 Rancher 모니터링 시스템에 통합

Rancher 모니터링 시스템 정보

Rancher를 사용하면 주요 오픈소스 모니터링 솔루션인 Prometheus와 통합하여 클러스터 노드, Kubernetes 구성 요소 및 소프트웨어 배포의 상태와 프로세스를 모니터링할 수 있습니다.

Rancher 모니터링 시스템 배포/활성화 방법은 https://rancher.com/docs/rancher/v2.x/en/monitoring-alerting/를 참조하세요.

Rancher 모니터링 시스템에 Longhorn 지표 추가

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 이 볼륨의 구성 크기(바이트 단위) 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
longhorn_node_count_total Longhorn 시스템의 총 노드 수 longhorn_node_count_total 4
longhorn_node_cpu_capacity_millicpu 이 노드의 최대 할당 가능 CPU longhorn_node_cpu_capacity_millicpu{node="worker-2"} 2000
longhorn_node_cpu_usage_millicpu 이 노드의 CPU 사용량 longhorn_node_cpu_usage_millicpu{node="worker-2"} 186
longhorn_node_memory_capacity_bytes 이 노드의 최대 할당 가능 메모리 longhorn_node_memory_capacity_bytes{node="worker-2"} 4.031229952e+09
longhorn_node_memory_usage_bytes 이 노드의 메모리 사용량 longhorn_node_memory_usage_bytes{node="worker-2"} 1.833582592e+09
longhorn_node_storage_capacity_bytes 이 노드의 스토리지 용량 longhorn_node_storage_capacity_bytes{node="worker-3"} 8.3987283968e+10
longhorn_node_storage_usage_bytes 이 노드의 사용된 스토리지 longhorn_node_storage_usage_bytes{node="worker-3"} 9.060941824e+09
longhorn_node_storage_reservation_bytes 이 노드의 다른 애플리케이션과 시스템을 위해 예약된 스토리지 공간 longhorn_node_storage_reservation_bytes{node="worker-3"} 2.519618519e+10

디스크(Disk)

지표명 설명 예시
longhorn_disk_capacity_bytes 이 디스크의 스토리지 용량 longhorn_disk_capacity_bytes{disk="default-disk-8b28ee3134628183",node="worker-3"} 8.3987283968e+10
longhorn_disk_usage_bytes 이 디스크의 사용된 스토리지 공간 longhorn_disk_usage_bytes{disk="default-disk-8b28ee3134628183",node="worker-3"} 9.060941824e+09
longhorn_disk_reservation_bytes 이 디스크의 다른 애플리케이션과 시스템을 위해 예약된 스토리지 공간 longhorn_disk_reservation_bytes{disk="default-disk-8b28ee3134628183",node="worker-3"} 2.519618519e+10

인스턴스 관리자(Instance Manager)

지표명 설명 예시
longhorn_instance_manager_cpu_usage_millicpu 이 Longhorn 인스턴스 관리자의 CPU 사용량 longhorn_instance_manager_cpu_usage_millicpu{instance_manager="instance-manager-e-2189ed13",instance_manager_type="engine",node="worker-2"} 80
longhorn_instance_manager_cpu_requests_millicpu 이 Longhorn 인스턴스 관리자의 Kubernetes에서 요청한 CPU 리소스 longhorn_instance_manager_cpu_requests_millicpu{instance_manager="instance-manager-e-2189ed13",instance_manager_type="engine",node="worker-2"} 250
longhorn_instance_manager_memory_usage_bytes 이 Longhorn 인스턴스 관리자의 메모리 사용량 longhorn_instance_manager_memory_usage_bytes{instance_manager="instance-manager-e-2189ed13",instance_manager_type="engine",node="worker-2"} 2.4072192e+07
longhorn_instance_manager_memory_requests_bytes 이 Longhorn 인스턴스 관리자의 Kubernetes에서 요청한 메모리 longhorn_instance_manager_memory_requests_bytes{instance_manager="instance-manager-e-2189ed13",instance_manager_type="engine",node="worker-2"} 0

관리자(Manager)

지표명 설명 예시
longhorn_manager_cpu_usage_millicpu 이 Longhorn Manager의 CPU 사용량 longhorn_manager_cpu_usage_millicpu{manager="longhorn-manager-5rx2n",node="worker-2"} 27
longhorn_manager_memory_usage_bytes 이 Longhorn Manager의 메모리 사용량 longhorn_manager_memory_usage_bytes{manager="longhorn-manager-5rx2n",node="worker-2"} 2.6144768e+07

Kubelet 볼륨 지표 지원

Kubelet 볼륨 지표 정보

Kubelet은 다음 지표를 노출합니다:

  1. kubelet_volume_stats_capacity_bytes
  2. kubelet_volume_stats_available_bytes
  3. kubelet_volume_stats_used_bytes
  4. kubelet_volume_stats_inodes
  5. kubelet_volume_stats_inodes_free
  6. kubelet_volume_stats_inodes_used

이러한 지표는 Longhorn 블록 디바이스 내의 PVC 파일시스템 관련 정보를 측정합니다.

이는 Longhorn 블록 디바이스 관련 정보를 측정하는 longhorn_volume_* 지표와 다릅니다.

PVC의 상태를 가져오고 스토리지 공간 부족과 같은 비정상 이벤트에 대한 알림을 설정하기 위해 Kubelet 지표 엔드포인트를 스크레이프하는 모니터링 시스템을 설정할 수 있습니다.

인기 있는 모니터링 설정인 prometheus-operator/kube-prometheus-stack은 kubelet_volume_stats_* 지표를 스크레이프하여 대시보드와 알림 규칙을 제공합니다.

Longhorn CSI 플러그인 지원

v1.1.0에서, Longhorn CSI 플러그인은 CSI 사양에 따라 NodeGetVolumeStats RPC를 지원합니다.

이것은 kubelet이 PVC 상태를 가져오기 위해 Longhorn CSI 플러그인을 쿼리할 수 있게 합니다.

그 후 kubelet은 kubelet_volume_stats_* 지표에서 해당 정보를 노출합니다.

Longhorn 알림 규칙 예시

아래에서 몇 가지 예시 Longhorn 알림 규칙을 제공합니다. 사용 가능한 모든 Longhorn 지표 목록을 참조하고 직접 알림 규칙을 구축하세요.

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: LonghornVolumeActualSpaceUsedWarning
      annotations:
        description: The actual space used by Longhorn volume {{$labels.volume}} on {{$labels.node}} is at {{$value}}% capacity for more than 5 minutes.
        summary: The actual used space of Longhorn volume is over 90% of the capacity.
      expr: (longhorn_volume_actual_size_bytes / longhorn_volume_capacity_bytes) * 100 > 90
      for: 5m
      labels:
        issue: The actual used space of Longhorn volume {{$labels.volume}} on {{$labels.node}} is high.
        severity: warning
    - alert: LonghornVolumeStatusCritical
      annotations:
        description: Longhorn volume {{$labels.volume}} on {{$labels.node}} is Fault for more than 2 minutes.
        summary: Longhorn volume {{$labels.volume}} is Fault
      expr: longhorn_volume_robustness == 3
      for: 5m
      labels:
        issue: Longhorn volume {{$labels.volume}} is Fault.
        severity: critical
    - alert: LonghornVolumeStatusWarning
      annotations:
        description: Longhorn volume {{$labels.volume}} on {{$labels.node}} is Degraded for more than 5 minutes.
        summary: Longhorn volume {{$labels.volume}} is Degraded
      expr: longhorn_volume_robustness == 2
      for: 5m
      labels:
        issue: Longhorn volume {{$labels.volume}} is Degraded.
        severity: warning
    - alert: LonghornNodeStorageWarning
      annotations:
        description: The used storage of node {{$labels.node}} is at {{$value}}% capacity for more than 5 minutes.
        summary: The used storage of node is over 70% of the capacity.
      expr: (longhorn_node_storage_usage_bytes / longhorn_node_storage_capacity_bytes) * 100 > 70
      for: 5m
      labels:
        issue: The used storage of node {{$labels.node}} is high.
        severity: warning
    - alert: LonghornDiskStorageWarning
      annotations:
        description: The used storage of disk {{$labels.disk}} on node {{$labels.node}} is at {{$value}}% capacity for more than 5 minutes.
        summary: The used storage of disk is over 70% of the capacity.
      expr: (longhorn_disk_usage_bytes / longhorn_disk_capacity_bytes) * 100 > 70
      for: 5m
      labels:
        issue: The used storage of disk {{$labels.disk}} on node {{$labels.node}} is high.
        severity: warning
    - alert: LonghornNodeDown
      annotations:
        description: There are {{$value}} Longhorn nodes which have been offline for more than 5 minutes.
        summary: Longhorn nodes is offline
      expr: longhorn_node_total - (count(longhorn_node_status{condition="ready"}==1) OR on() vector(0))
      for: 5m
      labels:
        issue: There are {{$value}} Longhorn nodes are offline
        severity: critical
    - alert: LonghornIntanceManagerCPUUsageWarning
      annotations:
        description: Longhorn instance manager {{$labels.instance_manager}} on {{$labels.node}} has CPU Usage / CPU request is {{$value}}% for more than 5 minutes.
        summary: Longhorn instance manager {{$labels.instance_manager}} on {{$labels.node}} has CPU Usage / CPU request is over 300%.
      expr: (longhorn_instance_manager_cpu_usage_millicpu/longhorn_instance_manager_cpu_requests_millicpu) * 100 > 300
      for: 5m
      labels:
        issue: Longhorn instance manager {{$labels.instance_manager}} on {{$labels.node}} consumes 3 times the CPU request.
        severity: warning
    - alert: LonghornNodeCPUUsageWarning
      annotations:
        description: Longhorn node {{$labels.node}} has CPU Usage / CPU capacity is {{$value}}% for more than 5 minutes.
        summary: Longhorn node {{$labels.node}} experiences high CPU pressure for more than 5m.
      expr: (longhorn_node_cpu_usage_millicpu / longhorn_node_cpu_capacity_millicpu) * 100 > 90
      for: 5m
      labels:
        issue: Longhorn node {{$labels.node}} experiences high CPU pressure.
        severity: warning

알림 규칙 정의에 대한 자세한 내용은 https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/#alerting-rules을 참조하세요.

태그: Longhorn prometheus AlertManager Grafana kubernetes

6월 24일 20:16에 게시됨