TheKoguryo's 기술 블로그

Version 2023.08.09

5.2.3 Logging Analytics를 사용한 모니터링

OKE 모니터링을 OCI Logging Analytics를 사용하여 모니터링할 수 있습니다. 쉬운 구성 설정을 위해 마켓플레이스를 통해 Kubernetes Monitoring and Management 이름의 솔루션으로 제공하고 있습니다. 사전 구성된 셋을 Resource Manager를 통해 설정을 통해 쉽게 설치하여 사용할 수 있습니다.

Kubernetes Monitoring and Management

Monitor Kubernetes and OKE clusters with OCI Logging Analytics 문서를 통해 아키텍처를 살펴보면, Log & Object Collection Pods가 설치되며, 주요 컴포넌트로 FluentD Collector와 Logging Analytics FluentD Plugin이 설치되어 쿠버네티스 상의 로그를 수집합니다.

Description of k8s-oke-monitoring.png follows

마켓플레이스를 통해 설치 시작
  1. OCI 콘솔에 로그인합니다.

  2. 왼쪽 위 내비게이션 메뉴에서 Marketplace > All Applications으로 이동합니다.

  3. Kubernetes Monitoring and Management으로 검색합니다.

  4. Kubernetes Monitoring and Management을 선택합니다.

    image-20230208105308282

  5. Oracle에서 제공하는 앱으로 무료로 제공하고 있습니다. OKE Cluster상의 서비스, 리눅스 시스템, 애플리케이션 컨테이너 로그 등을 OCI Logging Anaytics로 수집하여 제공하는 기능을 제공한다고 설명하고 있습니다.

    image-20230208105749113

  6. 설치할 Compartment를 선택하고, 약관에 동의합니다.

GitHub 에서 설치 시작

오픈소스로 GitHub - oci-kubernetes-monitoring 저장소에서 소스 파일을 제공하고 있으면, README 파일에서 설명하는 것처럼 아래 버튼을 클릭하여 최신 소스로 설치를 시작할 수 있습니다.

image-20230208144304363

Stack 설치

  1. 마켓플레이스 또는 GitHub에서 설치를 시작하면 Resource Manager의 Stack 설치화면으로 이동됩니다.

  2. 설치 기본 정보를 입력합니다.

    • Create in compartment: Resource Manager Stack이 설치될 위치입니다.

    image-20230208155044011

  3. 변수값을 입력합니다.

    • Pre-requisites: 모니터링할 OKE 클러스터에 대한 접근을 위해 자동으로 Dynamic Group과 Policy가 만들어집니다. 자동설치가 싫거나, 권한이 없는 경우, 사전에 별도로 권한에 설정합니다.
    • OKE Cluster Information
      • OKE Cluster가 위치한 Compartment와 대상 클러스터를 선택합니다.
    • OCI Logging Anaytics Information
      • Logging Anaytics 대쉬보드와 LogGroup의 위치하는 Compartment를 선택합니다.
      • 만들 Logging Anaytics LogGroup을 입력합니다.

    image-20230208155202740

  4. 리뷰하고, Create를 클릭하여, 설치 및 적용합니다.

  5. 설치가 완료(SUCCEEDED)를 확인합니다. 실패한 경우, Logs를 확인하여 문제를 해결하고 재시도합니다.

  6. 설치된 Dynamic Group 및 Policy 확인하면 아래와 같습니다.

    • Log & Object Collection Pods가 있는 Worker Nodes들에 LogGroup에 로그를 업로드할 권한을 부여하고 있습니다

    • Dynamic Group: oci-kubernetes-monitoring-xxx…

      Match any rules defined below
      
      # Rule 1
      ALL {instance.compartment.id = 'ocid1.compartment.oc1..aaaaa_____32sa'}
      
      # Rule 2
      ALL {resource.type = 'cluster', resource.compartment.id = 'ocid1.compartment.oc1..aaaaa_____32sa'}
      
    • Policy: oci-kubernetes-monitoring-yyy…

      • OCI Logging Anaytics Comparment로 선택한 Compartment에 생성됨
      Allow dynamic-group oci-kubernetes-monitoring-xxx... to {LOG_ANALYTICS_LOG_GROUP_UPLOAD_LOGS} in compartment oci-hol
      
  7. 왼쪽 위 내비게이션 메뉴에서 Observability & Management > Logging Analytics > Administration으로 이동합니다.

  8. Resources > Log Groups에 보면 설치시 생성된 LogGroup를 확인할 수 있습니다.

    image-20230208162517997

  9. Dashboard 메뉴를 클릭하면, Kubernetes 대쉬보드가 추가된 것을 확인할 수 있습니다.

    image-20230208162820825

  10. 대상으로 지정된 OKE 클러스터 설치된 자원을 확인합니다.

    • helm chart로 설치된 것을 확인할 수 있습니다.

      $ helm list -n kube-system
      NAME                            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
      oci-kubernetes-monitoring       kube-system     1               2023-02-08 14:45:58.041753114 +0000 UTC deployed        oci-la-fluentd-2.0.1    2.0.3
      
    • logging analytics욘 fluentd가 deployment와 daemonset으로 설치되었습니다.

      $ kubectl get pod -n kube-system
      NAME                                         READY   STATUS    RESTARTS      AGE
      ...
      oci-la-fluentd-daemonset-8q55z               1/1     Running   0             9m39s
      oci-la-fluentd-daemonset-kqvp2               1/1     Running   0             9m39s
      oci-la-fluentd-daemonset-x7xk6               1/1     Running   0             9m39s
      oci-la-fluentd-deployment-56b955dc64-wmxt2   1/1     Running   0             9m39s
      ...
      
    • 설치된 fluentd가 사용하는 설정값이 있는 configmap입니다.

      $ kubectl get configmap -n kube-system
      NAME                                 DATA   AGE
      ...
      oci-la-fluentd-logs-configmap        2      10m
      oci-la-fluentd-objects-configmap     2      10m
      ...
      
      • Fluentd 설정을 보면, flush_interval을 30초로 설정되어 있습니다. 최소값은 10초 입니다. Oracle Logging Analytics FluentD에서 플러그인 설명, Fluentd Flushing Parameters을 관련 파라미터를 참고바랍니다.

        $ kubectl get configmap oci-la-fluentd-logs-configmap -n kube-system -o yaml
        ...
                  <buffer>
                        @type                           file
                        path                            /var/log/oci_la_fluentd_outplugin/logs/buffer/
                        flush_thread_count              "1"
                        chunk_limit_size                "2m"
                        total_limit_size                "5368709120"
                        flush_interval                  "30"
                        flush_thread_interval           "0.5"
                        flush_thread_burst_interval     "0.05"
                        retry_wait                      "2"
                        retry_max_times                 "17"
                        retry_exponential_backoff_base  "2"
                        retry_forever                   "true"
                        disable_chunk_backup "true"
                  </buffer>
        ..          
        

Log Explorer에서 로그 확인

  1. OCI 콘솔로 이동합니다.

  2. 왼쪽 위 내비게이션 메뉴에서 Observability & Management > Logging Analytics > Log Explorer으로 이동합니다.

  3. 필터에서 Log Group Compartment를 원하는 대상으로 선택합니다.

    image-20230208181008640

  4. 기본값으로 파이 차트 형식으로 보여 줍니다. 대상 클러스터에서 수집된 여러가지 소스에서 수집된 로그를 보여줍니다.

    image-20230208181312757

  5. Worker Node 로그 및 사전 정의한 Kubernetes 로그이외에 애플리케이션 로그를 확인하기 위해 Kubernetes Container Generic Logs를 드릴 다운합니다.

    image-20230208181717363

  6. 클라스터상의 수집된 컨테이너 로그들을 볼수 있습니다.

    image-20230209001134785

  7. 테스트를 위해 default 네임스페이스에 배포된 nginx 앱을 사용하겠습니다.

  8. 필터링을 위해 Search Fields에 namespace로 검색합니다. 검색 결과 중에서 Namespace를 클릭하면 현재 검색된 로그들을 Namespace 단위로 카운트가 보입니다. 여기서 default namespace를 선택하고 적용합니다.

    image-20230209002024629

  9. 검색 쿼리가 아래와 같이 변경되었습니다. 아래와 같이 직접 and Namespace = default를 입력하여도 됩니다.

    'Log Source' = 'Kubernetes Container Generic Logs' and Namespace = default | timestats count as logrecords by 'Log Source' | sort -logrecords
    
  10. 애플리케이션 로그 확인을 위해 이전 가이드에 샘플로 배포된 nginx 앱을 접속해 봅니다.

    image-20230209003231205

  11. 발생한 POD 로그는 다음과 같습니다.

    $ kubectl logs -f nginx-docker-hub-646c998db6-tl2wg
    ...
    10.244.0.128 - - [08/Feb/2023:15:30:44 +0000] "GET /?logging-analytics-logtest HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-"
    2023/02/08 15:30:44 [error] 30#30: *7 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 10.244.0.128, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "146.56.115.103", referrer: "http://146.56.115.103/?logging-analytics-logtest"
    10.244.0.128 - - [08/Feb/2023:15:30:44 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://146.56.115.103/?logging-analytics-logtest" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36" "-"
    
  12. Logging Analytics의 Log Explorer에서 동일한 로그들을 모두 확인할 수 있습니다. Fluentd Buffer 설정에 따라 30초 내외로 볼 수 있습니다.

    image-20230209004111876

  13. 쿼리에 검색조건을 추가합니다.

    image-20230209004501278

Dashboard 확인

  1. Logging Analytics > Dashboard로 이동합니다.

  2. Kubernetes 대쉬보드가 추가된 것을 확인할 수 있습니다.

    image-20230208162820825

  3. Kubernetes Cluster Summary를 클릭합니다.

    image-20230209011238240

  4. 배치된 위젯을 클릭하면, 해당 조건에 따라 로그를 쿼리하는 화면으로 이동합니다.

    image-20230209012237776 image-20230209012552194

  5. Nodes, Workloads, Pods의 대쉬보드도 동일한 패턴으로 제공합니다.



이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.

Last updated on 7 Feb 2023