ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kubernetes Prometheus Monitoring
    Tool 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
    반응형

    'Tool' 카테고리의 다른 글

    Gitlab CI  (0) 2023.07.20

    댓글

Designed by Tistory.