ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쿠버네티스 모니터링 : 프로메테우스(kubernetes monitoring : phrometheus)
    Kubernetes 2018. 9. 10. 09:00
    모니터링 솔루션으로 최근 가장 많이 주목받고 있는건 프로메테우스(phrometheus)입니다. 프로메테우스는 사우드클라우드(SoundCloud)에서 최초 개발했고 현재는 CNCF에 속한 프로젝트입니다. CNCF에 속한 여러가지 프로젝트들 중에서 쿠버네티스가 첫번째 졸업생이고 프로메테우스가 두번째 졸업생일 정도로 많은 주목을 받고 있는 프로젝트 입니다.

    프로메테우스 주요 기능
    프로메테우스의 주요 기능으로는 시계열(time series) 데이터를 저장할 수 있는 다차원(multi-dimensional) 데이터 모델과 이 데이터 모델을 효과적으로 활용할 수 있는 PromQL이라는 쿼리 언어가 있습니다. 기본적인 데이터 수집은 pull 구조로 되어 있어서 프로메테우스 서버가 수집하려는 대상에게서 데이터를 가져오도록 되어 있습니다. 수집대상을 정적으로 설정해둘 수도 있고 서비스디스커버리(service discovery)를 통해서 동적으로 설정하는 것도 가능합니다. 기본적인 데이터 수집은 pull이지만 외부에서 직접 push한 데이터를 pushgatewat를 통해서 받아서 저장할 수도 있습니다. 데이터 저장은 단순하게 디스크에 저장하는 것도 되지만 외부 스토리지에 저장하는 것 역시 가능합니다. 수집한 데이터의 시각화는 내장된 웹 UI를 이용할 수도 있고 그라파나와 연계해서 보는 것도 가능합니다.

    프로메테우스 구성요소
    프로메테우스는 여러가지 컴포넌트들로 이뤄져 있습니다. 먼저 시계열데이터를 수집해와서 저장하는 메인 컴포넌트인 프로메테우스 서버가 있습니다. 애플리케이션을 개발할때 프로메테우스에서 데이터를 수집할 수 있게 해주도록 하기 위한 클라이언트 라이브러리, 클라이언트에서 직접 프로메테우스쪽으로 데이터를 보낼때 받아줄 수 있는 pushgateway가 있습니다. 그리고 프로메테우스 클라이언트 라이브러리를 내장해서 만들어지지 않은 애플리케이션들에서 데이터를 수집할 수 있게 해주는 익스포터(exporter)가 있습니다. 100개가 넘는 다양한 익스포터들이 있어서 거의 대부분의 애플리케이션에서 데이터를 수집할 수 있는게 프로메테우스의 장점입니다. 마지막으로 알람을 보낼때 알람의 중복처리, 그룹핑등과 알람을 어디로 보낼지를 관리하는 알럿매니저(AlertManager)가 있습니다.

    프로메테우스의 전체적인 아키텍처는 다음 그림과 같습니다. 



    프로메테우스 사용해 보기
    프로메테우스를 실행하기 위해서는 먼저 쿠버네티스용 설정 파일이 있어야 합니다. 프로메테우스 GitHub 저장소의 documentation/examples 를 보면 prometheus-kubernetes.yml  파일이 있는걸 확인할 수 있습니다. 
    이 파일을 다운로드한 다음에 다음 명령을 이용해서 configmap을 만들어 줍니다.
    kubectl create configmap prometheus-kubernetes --from-file=./prometheus-kubernetes-config.yaml

    그런 다음 프로메테우스용 디플로이먼트와 서비스를 다음 파일을 이용해서 생성합니다. 
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: prometheus-app
      labels:
        app: prometheus-app
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: prometheus-app
      template:
        metadata:
          labels:
            app: prometheus-app
        spec:
          containers:
          - name: prometheus-app
            image: prom/prometheus:v2.3.2
            args:
              - "--config.file=/etc/prometheus/prometheus-kubernetes-config.yaml"
            ports:
              - containerPort: 9090
            volumeMounts:
              - name: config-volume
                mountPath: /etc/prometheus
              - name: storage-volume
                mountPath: /prometheus/
          volumes:
            - name: config-volume
              configMap:
                name: prometheus-kubernetes
            - name: storage-volume
              emptyDir: {}
    ---          
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: prometheus-app
      name: prometheus-app-svc
      namespace: default
    spec:
      ports:
      - nodePort: 30990
        port: 9090
        protocol: TCP
        targetPort: 9090
      selector:
        app: prometheus-app
      type: NodePort

    그런 다음 브라우저의 localhost:30990으로 접속합니다. 그러면 아래처럼 프로메테우스 UI를 확인할 수 있습니다. 여기서 상단의 graph메뉴를 선택한 다음 실행하려는 메트릭에 kubelet_running_pod_count를 선택하고 “Execute” 버튼을 눌러서 현재 실행중인 포드 개수를 확인해 보겠습니다. 이 상태에서 포드 개수를 조정해보면 다음 그림처럼 그래프가 그에 따라 변화하는걸 볼 수 있습니다. 수집가능한 항목을 보면 포드 개수뿐만이 아니라 다양한 항목이 많이 있는걸 확인할 수 있습니다.




    프로메테우스와 그라파나 연동
    프로메테우스 기본 UI외에 대시보드용으로 많이 사용하는 그라파나를 연동하는 것도 가능합니다. 다음 내용으로 grafana.yaml을 만들어서 그라파나를 실행합니다.
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: grafana-app
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            k8s-app: grafana
        spec:
          containers:
          - name: grafana
            image: grafana/grafana:5.2.3
            ports:
            - containerPort: 3000
              protocol: TCP
            env:
            - name: GF_SERVER_HTTP_PORT
              value: "3000"
            - name: GF_AUTH_BASIC_ENABLED
              value: "false"
            - name: GF_AUTH_ANONYMOUS_ENABLED
              value: "true"
            - name: GF_AUTH_ANONYMOUS_ORG_ROLE
              value: Admin
            - name: GF_SERVER_ROOT_URL
              value: /
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        kubernetes.io/name: grafana-app
      name: grafana-app
    spec:
      ports:
      - port: 3000
        targetPort: 3000
        nodePort: 30300
      selector:
        k8s-app: grafana
      type: NodePort


    그런 다음 브라우저에서 http://localhost:30300/ 으로 접속하면 그라파나 화면을 확인할 수 있습니다. 여기에서 다음 그림처럼 "Add data source" 를 클릭해서 데이터 소스에 프로메테우스를 추가해 줍니다.



    프로메테우스 접속 URL은 앞에서 실행했떤 프로메테우스의 주소인 http://prometheus-app-svc.default.svc.cluster.local:9090 를 입력해 주면 됩니다.


    그런 다음 이 추가한 데이터 소스를 이용해서 다음처럼 다양한 대시보드를 만들 수 있습니다.



    그라파나의 장점중 하나는 다른 사람들이 기존에 만들어놓은 대시보드를 가져다가 사용할 수 있다는 것입니다. 프로메테우스가 워낙 많은 메트릭 데이터들을 수집해서 보여주는데 이 중에서 어떤 것들을 모니터링용으로 사용할지 선별하는 것도 어려운 일입니다. 그런데, 대시보드를 모아놓은 사이트인 https://grafana.com/dashboards 에 들어가서 kubernetes로 검색해 보면 쿠버네티스용으로 사용자들이 미리 만들어 놓은 대시보드를 여러개 볼 수 있습니다. 이중에서 마음에 드는 것으로 가져와서 import해서 사용하면 일일히 대시보드를 꾸미는 노력 없이도 쉽게 대시보드를 구성해서 사용할 수 있습니다.


    참고



    댓글 2

    • 프로필사진

      비밀댓글입니다

      2019.09.26 16:30
      • 프로필사진

        그 앞에서 설정파일을 configmap으로 업로드 한거구요.
        실행이 되었는데 프로메테우스 pod의 로그가 안보이신다는건가요?
        아니면 메트릭 정보가 안보이신다는 건가요?

        2019.09.27 16:29 신고
Designed by Tistory.