Tool

Kubernetes Prometheus Monitoring

YunSeYeong 2023. 8. 1. 11:45
728x90
반응형

Prometheus

프로메테우스는 오픈소스 기반의 모니터링, 알람 도구이다. 다른 모니터링 도구와 다른점은 각 서버에 설치된 agent가 메트릭 데이터를 전송하는 것이 아니라 수집 서버에서 각 서버들의 메티릭 데이터를 수집하는 구조이다.

Prometheus는 크게 3가지 구성요소가 있다. 첫번째는 Prometheus server 이다. Prometheus server는 각 서버들의 메트릭 정보를 수집한다. 두번째는 Expoter이다. Expoter는 각 서버에 설치되며 해당 서버의 메트릭 데이터를 HTTP Server를 통해 제공한다. Prometheus server는 HTTP Server의 Endpoint에서 데이터를 가져가게 된다. 마지막은 Alertmanager이다. Alertmanager는 규칙에 따라 알림을 만들고 전송할 수 있게 만들어 준다.

Service Discovery

  • Service Discovery는 Prometheus가 수집해야하는 대상(Target)의 정보를 수집하는 과정을 말한다. Prometheus에서는 다양한 종류의 Target을 찾을 수 있도록 지원한다.
  • Prometheus는 Kubernetes의 다양한 리소스를 Target으로 찾을 수 있도록 지원한다.
  • <kubernetes_sd_config> 를 통해 설정할 수 있고, node service pod endpints endpointslice ingress 를 지원한다.

Kubernetes Setting

Kubernetes의 리소스들의 정보를 수집하기 위해서는 권한 설정과 prometheus 설정 등을 만들어 줘야한다.

1. RBAC 설정

Kubernetes에 연결된 노드의 정보를 조회하기 위해서는 권한이 필요하다. 아래는 Namespace ServiceAccount ClusteRrole ClusterRoleBinding 을 생성한다.

apiVersion: v1
kind: Namespace
metadata:
  name: monitoring
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: monitoring
  namespace: monitoring
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: monitoring
  namespace: monitoring
rules:
- apiGroups: [""]
  resources:
    - nodes/metrics
  verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: monitoring
subjects:
- kind: ServiceAccount
  name: monitoring
  namespace: monitoring
roleRef:
  kind: ClusterRole
  name: monitoring
  apiGroup: rbac.authorization.k8s.io

2. Configmap 설정

Prometheus는 prometheus.yaml파일을 통해 설정을 하게 된다. 아래는 Prometheus 서버에서 다른 node에 직접 접근해서 metrics를 수집하도록 하였다. 하지만 tls 인증은 skip 하도록 되어있다. 각 서버에는 Kubernetes API 서버의 CA인증서는 있으나 각 노드의 kubelet에 인증은 되지 않기 때문에 skip하였다.

apiVersion: v1
kind: ConfigMap
metadata:
  creationTimestamp: null
  name: prometheus-server-conf
  namespace: monitoring
data:
  prometheus.yaml: |-
    global:
      scrape_interval: 15s
      evaluation_interval: 15s
    scrape_configs:
    - job_name: node
      scheme: https
      tls_config:
        insecure_skip_verify: true
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      kubernetes_sd_configs:
      - role: node

만약 보안에 문제가 우려된다면 API서버로 metrics를 받아올 수 도 있다.

apiVersion: v1
kind: ConfigMap
metadata:
  creationTimestamp: null
  name: prometheus-server-conf
  namespace: monitoring
data:
  prometheus.yaml: |-
    global:
      scrape_interval: 15s
      evaluation_interval: 15s
    scrape_configs:
    - job_name: node
      scheme: https
      # -- ca 인증서 설정 -- #
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
      bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      kubernetes_sd_configs:
      - role: node
      # -- API 서버로 Endpoint 변경 -- #
      relabel_configs:
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
      - target_label: __address__
        replacement: kubernetes.default.svc:443
      - source_labels: [__meta_kubernetes_node_name]
        regex: (.+)
        target_label: __metrics_path__
        replacement: /api/v1/nodes/${1}/proxy/metrics

3. Prometheus Server

apiVersion: v1
kind: PersistentVolume
metadata:
  name: prometheus-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 20Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

---
apiVersion: v1
kind: Service
metadata:
  name: prometheus-server-http
  namespace: monitoring
  labels:
    app: prometheus
  annotations:
    prometheus.io/scrape: "true"
spec:
  selector:
    app: prometheus
  type: NodePort
  ports:
    - port: 9090
      nodePort: 32100
      protocol: TCP
      name: prometheus

---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: prometheus-server
  namespace: monitoring
  labels:
    app: prometheus
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus
  serviceName: prometheus-server-http
  volumeClaimTemplates:
    - metadata:
        name: prometheus-storage
        namespace: monitoring
      spec:
        accessModes:
          - ReadWriteOnce
        storageClassName: manual
        resources:
          requests:
            storage: 5Gi
  template:
    metadata:
      labels:
        app: prometheus
    spec:
      serviceAccountName: monitoring
      securityContext:
        runAsUser: 0
      volumes:
        - name: prometheus-server-conf
          configMap:
            defaultMode: 420
            name: prometheus-server-conf
      containers:
      - name: prometheus
        image: prom/prometheus:v2.20.1
        ports:
          - name: prometheus
            containerPort: 9090
        volumeMounts:
          - name: prometheus-storage
            mountPath: /prometheus
          - name: prometheus-server-conf
            mountPath: /etc/prometheus
        args:
          - "--storage.tsdb.path=/prometheus"
          - "--storage.tsdb.retention.time=1d"
          - "--config.file=/etc/prometheus/prometheus.yaml"
          - "--web.enable-admin-api"

Reference

728x90
반응형