로깅 및 모니터링 사용

이 페이지에서는 Cloud Logging, Cloud Monitoring, Prometheus, Grafana를 사용하여 로깅 및 모니터링하는 방법을 설명합니다. 사용 가능한 구성 옵션에 대한 요약은 Logging 및 Monitoring 개요를 참조하세요.

Cloud Logging 및 Cloud Monitoring 사용

다음 섹션에서는 GKE On-Prem 클러스터에서 Logging 및 Monitoring을 사용하는 방법을 설명합니다.

모니터링 리소스

모니터링 리소스는 Google이 클러스터, 노드, Pod, 컨테이너와 같은 리소스를 나타내는 방식입니다. 자세한 내용은 Cloud Monitoring의 모니터링 리소스 유형 문서를 참조하세요.

로그와 측정항목을 쿼리하려면 최소한 다음 리소스 라벨을 알아야 합니다.

  • project_id: GKE On-Prem 클러스터와 연결된 프로젝트의 프로젝트 ID입니다.

  • location: Logging 로그와 Monitoring 측정항목을 저장할 Google Cloud 리전입니다. 온프레미스 데이터센터 근처에 있는 리전을 선택하는 것이 좋습니다. 설치 중에 GKE On-Prem 구성 파일의 stackdriver.clusterlocation 필드에 이 값을 제공했습니다.

  • cluster_name: 클러스터를 만들 때 선택한 클러스터 이름입니다.

    Stackdriver 커스텀 리소스를 검사하여 관리자 클러스터나 사용자 클러스터의 cluster_name 값을 검색할 수 있습니다.

      kubectl -n kube-system get stackdrivers stackdriver -o yaml | grep 'clusterName:'

로그 데이터에 액세스

Cloud Console의 로그 뷰어를 통해 로그에 액세스할 수 있습니다. 예를 들어 컨테이너의 로그에 액세스하려면 다음 안내를 따르세요.

  1. Cloud Console에서 프로젝트의 로그 뷰어를 엽니다.
  2. 컨테이너 로그를 찾는 방법은 다음과 같습니다.
    1. 왼쪽 상단의 로그 카탈로그 드롭다운 상자를 클릭하고 Kubernetes 컨테이너를 선택합니다.
    2. 계층 구조에서 클러스터 이름, 네임스페이스, 컨테이너를 차례대로 선택합니다.

클러스터 상태 모니터링을 위한 대시보드 만들기

GKE On-Prem 클러스터는 기본적으로 시스템과 컨테이너 측정항목을 모니터링하도록 구성됩니다. 클러스터(관리자 또는 사용자)를 만든 후 GKE On-Prem 운영팀이 클러스터 상태를 모니터링할 수 있도록 Monitoring으로 다음 대시보드를 만드는 것이 좋습니다.

이 섹션에서는 이러한 대시보드를 만드는 방법을 설명합니다. 다음 섹션에 설명된 대시보드 생성 프로세스에 대한 자세한 내용은 API로 대시보드 관리를 참조하세요.

기본 요건

대시보드를 만들려면 Google 계정에 다음 권한이 있어야 합니다.

  • monitoring.dashboards.create
  • monitoring.dashboards.delete
  • monitoring.dashboards.update

계정에 다음 역할 중 하나가 있으면 이러한 권한이 부여됩니다. Cloud Console에서 현재 보유한 권한을 확인할 수 있습니다.

  • monitoring.dashboardEditor
  • monitoring.editor
  • 프로젝트 editor
  • 프로젝트 owner

제어 영역 상태 대시보드 만들기

GKE On-Prem 제어 영역은 API 서버, 스케줄러, 컨트롤러 관리자 등으로 구성됩니다. 제어 영역 상태를 모니터링하려면 이러한 구성요소의 상태를 모니터링하는 대시보드를 만듭니다.

  1. 대시보드 구성(control-plane-status.json)을 다운로드합니다

  2. 다음 명령어를 실행하여 구성 파일로 커스텀 대시보드를 만듭니다.

    gcloud monitoring dashboards create --config-from-file=control-plane-status.json
  3. Google Cloud Console에서 Monitoring을 선택하거나 다음 버튼을 사용합니다.

    Monitoring으로 이동

  4. 리소스 > 대시보드를 선택하고 GKE On-Prem 제어 영역 상태라는 대시보드를 봅니다. 각 사용자 클러스터의 제어 영역 상태는 관리자 클러스터 내 개별 네임스페이스에서 수집됩니다. namespace_name 필드는 사용자 클러스터 이름입니다.

    서비스 수준 목표(SLO) 임곗값 0.999가 각 차트에 설정됩니다.

  5. 원하는 경우 알림 정책을 만듭니다.

pod 상태 대시보드 만들기

각 pod의 단계와 각 컨테이너의 다시 시작 횟수와 리소스 사용량이 포함된 대시보드를 만들려면 다음 단계를 수행합니다.

  1. 대시보드 구성(pod-status.json)을 다운로드합니다

  2. 다음 명령어를 실행하여 구성 파일로 커스텀 대시보드를 만듭니다.

    gcloud monitoring dashboards create --config-from-file=pod-status.json
  3. Google Cloud Console에서 Monitoring을 선택하거나 다음 버튼을 사용합니다.

    Monitoring으로 이동

  4. 리소스 > 대시보드를 선택하고 GKE On-Prem Pod 상태라는 대시보드를 봅니다.

  5. 원하는 경우 알림 정책을 만듭니다.

노드 상태 대시보드 만들기

GKE On-Prem 노드 상태 대시보드를 만들어 노드 조건, CPU, 메모리, 디스크 사용량을 모니터링하려면 다음 단계를 수행하세요.

  1. 대시보드 구성(node-status.json)을 다운로드합니다

  2. 다음 명령어를 실행하여 구성 파일로 커스텀 대시보드를 만듭니다.

    gcloud monitoring dashboards create --config-from-file=node-status.json
  3. Google Cloud Console에서 Monitoring을 선택하거나 다음 버튼을 사용합니다.

    Monitoring으로 이동

  4. 리소스 > 대시보드를 선택하고 GKE On-Prem 노드 상태라는 대시보드를 봅니다.

  5. 원하는 경우 알림 정책을 만듭니다.

측정항목 데이터에 액세스

측정항목 탐색기를 사용하여 1,500개가 넘는 측정항목 중에서 선택할 수 있습니다. 측정항목 탐색기에 액세스하려면 다음을 수행합니다.

  1. Google Cloud Console에서 Monitoring을 선택하거나 다음 버튼을 사용합니다.

    Monitoring으로 이동

  2. 리소스 > 측정항목 탐색기를 선택합니다.

Monitoring 메타데이터에 액세스

메타데이터는 측정항목을 통해 간접적으로 사용됩니다. Monitoring 측정항목 탐색기에서 측정항목을 필터링하면 metadata.systemLabelsmetadata.userLabels로 측정항목을 필터링할 수 있는 옵션이 표시됩니다. 시스템 라벨은 노드 이름 및 pod의 서비스 이름과 같은 라벨입니다. 사용자 라벨은 pod 사양의 '메타데이터' 섹션에 있는 Kubernetes YAML 파일의 pod에 할당되는 라벨입니다.

기본 Cloud Monitoring 할당량 한도

GKE On-Prem 모니터링의 기본 API 호출 한도는 프로젝트별로 분당 6,000개입니다. 이 한도를 초과하면 측정항목이 표시되지 않을 수 있습니다. 모니터링 한도를 늘려야 하면 Google Cloud Console을 통해 요청합니다.

알려진 문제: Cloud Monitoring 오류 조건

(문제 ID 159761921)

특정 조건에서는 각 새 클러스터에 기본적으로 배포된 기본 Cloud Monitoring pod가 응답하지 않을 수 있습니다. 예를 들어 클러스터를 업그레이드하면 statefulset/prometheus-stackdriver-k8s의 pod가 다시 시작될 때 스토리지 데이터가 손상될 수 있습니다.

구체적으로 손상된 데이터가 prometheus-stackdriver-sidecar가 클러스터 스토리지 PersistentVolume에 작성하는 것을 방지할 경우 모니터링 pod stackdriver-prometheus-k8s-0가 루프에 빠질 수 있습니다.

아래 단계에 따라 오류를 수동으로 진단하고 복구할 수 있습니다.

Cloud Monitoring 오류 진단

모니터링 pod가 실패하면 로그에 다음 항목이 보고됩니다.

{"log":"level=warn ts=2020-04-08T22:15:44.557Z caller=queue_manager.go:534 component=queue_manager msg=\"Unrecoverable error sending samples to remote storage\" err=\"rpc error: code = InvalidArgument desc = One or more TimeSeries could not be written: One or more points were written more frequently than the maximum sampling period configured for the metric.: timeSeries[0-114]; Unknown metric: kubernetes.io/anthos/scheduler_pending_pods: timeSeries[196-198]\"\n","stream":"stderr","time":"2020-04-08T22:15:44.558246866Z"}

{"log":"level=info ts=2020-04-08T22:15:44.656Z caller=queue_manager.go:229 component=queue_manager msg=\"Remote storage stopped.\"\n","stream":"stderr","time":"2020-04-08T22:15:44.656798666Z"}

{"log":"level=error ts=2020-04-08T22:15:44.663Z caller=main.go:603 err=\"corruption after 29032448 bytes: unexpected non-zero byte in padded page\"\n","stream":"stderr","time":"2020-04-08T22:15:44.663707748Z"}

{"log":"level=info ts=2020-04-08T22:15:44.663Z caller=main.go:605 msg=\"See you next time!\"\n","stream":"stderr","time":"2020-04-08T22:15:44.664000941Z"}

Cloud Monitoring 오류에서 복구

Cloud Monitoring을 수동으로 복구하려면 다음 안내를 따르세요.

  1. 클러스터 모니터링을 중지합니다. stackdriver 연산자를 축소하여 조정 조정을 방지합니다.

    kubectl --kubeconfig /ADMIN_CLUSTER_KUBCONFIG --namespace kube-system scale deployment stackdriver-operator --replicas 0

  2. 모니터링 파이프라인 워크로드를 삭제합니다.

    kubectl --kubeconfig /ADMIN_CLUSTER_KUBCONFIG --namespace kube-system delete statefulset stackdriver-prometheus-k8s

  3. 모니터링 파이프라인 PersistentVolumeClaims(PVC)를 삭제합니다.

    kubectl --kubeconfig /ADMIN_CLUSTER_KUBCONFIG --namespace kube-system delete pvc -l app=stackdriver-prometheus-k8s

  4. 클러스터 모니터링을 다시 시작합니다. Stackdriver 연산자를 확장하여 새 모니터링 파이프라인을 다시 설치하고 조정을 재개합니다.

    kubectl --kubeconfig /ADMIN_CLUSTER_KUBCONFIG --namespace kube-system scale deployment stackdriver-operator --replicas=1

Prometheus 및 Grafana

다음 섹션에서는 GKE On-Prem 클러스터에서 Prometheus와 Grafana를 사용하는 방법을 설명합니다.

Prometheus 및 Grafana 사용 설정

GKE On-Prem 버전 1.2부터 Prometheus와 Grafana의 사용 설정 여부를 선택할 수 있습니다. 새 사용자 클러스터에서는 기본적으로 Prometheus와 Grafana가 중지됩니다.

  1. 사용자 클러스터에 monitoring-sample이라는 Monitoring 객체가 있습니다. 수정할 객체를 엽니다.

    kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] edit \
       monitoring monitoring-sample --namespace kube-system

    여기서 [USER_CLUSTER_KUBECONFIG]는 사용자 클러스터의 kubeconfig 파일입니다.

  2. Prometheus와 Grafana를 사용하려면 enablePrometheustrue로 설정합니다. Prometheus와 Grafana를 중지하려면 enablePrometheusfalse로 설정합니다.

    apiVersion: addons.k8s.io/v1alpha1
    kind: Monitoring
    metadata:
     labels:
       k8s-app: monitoring-operator
     name: monitoring-sample
     namespace: kube-system
    spec:
     channel: stable
     ...
     enablePrometheus: true
  3. 수정 세션을 종료하여 변경사항을 저장합니다.

알려진 문제

사용자 클러스터에서는 업그레이드 중에 Prometheus와 Grafana가 자동으로 중지됩니다. 하지만 구성과 측정항목 데이터는 손실되지 않습니다.

이 문제를 해결하려면 업그레이드 후 수정할 monitoring-sample을 열고 enablePrometheustrue로 설정합니다.

Grafana 대시보드에서 모니터링 측정항목에 액세스

Grafana는 클러스터에서 수집한 측정항목을 표시합니다. 이러한 측정항목을 보려면 Grafana 대시보드에 액세스해야 합니다.

  1. 사용자 클러스터의 kube-system 네임스페이스에서 실행 중인 Grafana pod의 이름을 가져옵니다.

    kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] -n kube-system get pods

    여기서 [USER_CLUSTER_KUBECONFIG]는 사용자 클러스터의 kubeconfig 파일입니다.

  2. Grafana pod의 컨테이너는 TCP 포트 3000에서 리슨합니다. pod에서 로컬 포트를 포트 3000에 전달하면 웹브라우저에서 Grafana 대시보드를 볼 수 있습니다.

    예를 들어 pod 이름이 grafana-0이라고 가정합니다. pod에서 포트 50000을 포트 3000에 전달하려면 다음 명령어를 입력합니다.

    kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] -n kube-system port-forward grafana-0 50000:3000
  3. 웹브라우저에서 http://localhost:50000으로 이동합니다. 사용자 클러스터의 Grafana 홈 대시보드가 로드됩니다.

  4. 다른 대시보드에 액세스하려면 페이지 왼쪽 상단에 있는 드롭다운 메뉴를 클릭합니다.

Grafana 사용 예시는 Grafana 대시보드 만들기를 참조하세요.

알림에 액세스

Prometheus Alertmanager는 Prometheus 서버에서 알림을 수집합니다. Grafana 대시보드에서 이러한 알림을 볼 수 있습니다. 알림을 보려면 대시보드에 액세스해야 합니다.

  1. alertmanager-0 pod의 컨테이너는 TCP 포트 9093에서 리슨합니다. pod에서 로컬 포트를 포트 9093에 전달합니다.

    kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] port-forward \
       -n kube-system alertmanager-0 50001:9093
  2. 웹브라우저에서 http://localhost:50001으로 이동합니다.

Prometheus Alertmanager 구성 변경

사용자 클러스터의 monitoring.yaml 파일을 수정하여 Prometheus Alertmanager의 기본 구성을 변경할 수 있습니다. 대시보드에 알림을 유지하는 대신 특정 대상에 알림을 보내려면 이 작업을 수행해야 합니다. Alertmanager를 구성하는 방법은 Prometheus의 구성 문서를 참조하세요.

Alertmanager 구성을 변경하려면 다음 단계를 수행합니다.

  1. 사용자 클러스터의 monitoring.yaml 매니페스트 파일 복사본을 만듭니다.

    kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] -n kube-system \
       get monitoring monitoring-sample -o yaml > monitoring.yaml
  2. Alertmanager를 구성하려면 spec.alertmanager.yml 아래의 필드를 변경합니다. 완료되면 변경된 매니페스트를 저장합니다.

  3. 매니페스트를 클러스터에 적용합니다.

    kubectl apply --kubeconfig [USER_CLUSTER_KUBECONIFG] -f monitoring.yaml

Prometheus 리소스 확장

기본 모니터링 구성에서는 노드를 최대 5개까지 지원합니다. 큰 클러스터의 경우 Prometheus Server 리소스를 조정할 수 있습니다. 클러스터 노드당 50m 코어 CPU와 500Mi 메모리를 사용하는 것이 좋습니다. 클러스터에 Prometheus에 맞는 충분한 리소스가 있는 노드 두 개가 포함되어 있는지 확인합니다. 자세한 내용은 사용자 클러스터 크기 조절을 참조하세요.

Prometheus 서버 리소스를 변경하려면 다음 단계를 수행합니다.

  1. 사용자 클러스터의 monitoring.yaml 매니페스트 파일 복사본을 만듭니다.

    kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] -n kube-system get monitoring monitoring-sample -o yaml > monitoring.yaml
  2. 리소스를 재정의하려면 spec.resourceOverride 아래의 필드를 변경합니다. 완료되면 변경된 매니페스트를 저장합니다. 예를 들면 다음과 같습니다.

    spec:
      resourceOverride:
      - component: Prometheus
        resources:
          requests:
            cpu: 300m
            memory: 3000Mi
          limits:
            cpu: 300m
            memory: 3000Mi
    
  3. 매니페스트를 클러스터에 적용합니다.

    kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] apply -f monitoring.yaml

Grafana 대시보드 만들기

측정항목을 노출하는 애플리케이션을 배포했고, 측정항목이 노출되었음을 확인했으며, Prometheus가 측정항목을 스크랩했음을 확인했습니다. 이제 애플리케이션 수준 측정항목을 커스텀 Grafana 대시보드에 추가할 수 있습니다.

Grafana 대시보드를 만들려면 다음 단계를 수행합니다.

  1. 필요한 경우 Grafana에 액세스합니다.
  2. 홈 대시보드에서 페이지 왼쪽 상단에 있는 Home(홈) 드롭다운 메뉴를 클릭합니다.
  3. 오른쪽 메뉴에서 New dashboard(새 대시보드)를 클릭합니다.
  4. New panel(새 패널) 섹션에서 Graph(그래프)를 클릭합니다. 빈 그래프 대시보드가 표시됩니다.
  5. Panel title(패널 제목)을 클릭한 후 Edit(수정)를 클릭합니다. 하단의 Graph(그래프) 패널이 Metrics(측정항목) 탭으로 열립니다.
  6. Data Source(데이터 소스) 드롭다운 메뉴에서 user(사용자)를 선택합니다. Add query(쿼리 추가)를 클릭하고 search(검색) 필드에 foo를 입력합니다.
  7. 화면 오른쪽 상단에 있는 Back to dashboard(대시보드로 돌아가기) 버튼을 클릭합니다. 대시보드가 표시됩니다.
  8. 대시보드를 저장하려면 화면 오른쪽 상단에 있는 Save dashboard(대시보드 저장)를 클릭합니다. 대시보드의 이름을 선택한 후 Save(저장)를 클릭합니다.

클러스터 내 모니터링 중지

클러스터 내 모니터링을 중지하려면 monitoring-sample 객체의 변경사항을 되돌립니다.

  1. 수정할 monitoring-sample 객체를 엽니다.

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG edit \
       monitoring monitoring-sample --namespace kube-system

    USER_CLUSTER_KUBECONFIG를 사용자 클러스터의 kubeconfig 파일로 바꿉니다.

  2. Prometheus와 Grafana를 중지하려면 enablePrometheusfalse로 설정합니다.

       apiVersion: addons.k8s.io/v1alpha1
       kind: Monitoring
       metadata:
         labels:
           k8s-app: monitoring-operator
         name: monitoring-sample
         namespace: kube-system
       spec:
         channel: stable
         ...
         enablePrometheus: false
    
  3. 수정 세션을 종료하여 변경사항을 저장합니다.

  4. prometheus-0, prometheus-1, grafana-0 statefulset가 삭제되었는지 확인합니다.

    kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get pods --namespace kube-system

예시: Grafana 대시보드에 애플리케이션 수준 측정항목 추가

다음 섹션에서는 애플리케이션의 측정항목을 추가하는 과정을 설명합니다. 이 섹션에서는 다음 태스크를 완료합니다.

  • foo라는 측정항목을 노출하는 애플리케이션 예시를 배포합니다.
  • Prometheus가 측정항목을 노출하고 스크레이핑하는지 확인합니다.
  • 커스텀 Grafana 대시보드를 만듭니다.

예시 애플리케이션 배포

예시 애플리케이션은 단일 pod에서 실행됩니다. pod의 컨테이너는 측정항목인 foo를 노출하며 상수 값은 40입니다.

다음 pod 매니페스트 pro-pod.yaml을 만듭니다.

apiVersion: v1
kind: Pod
metadata:
  name: prometheus-example
  annotations:
    prometheus.io/scrape: 'true'
    prometheus.io/port: '8080'
    prometheus.io/path: '/metrics'
spec:
  containers:
  - image: k8s.gcr.io/prometheus-dummy-exporter:v0.1.0
    name: prometheus-example
    command:
    - /bin/sh
    - -c
    - ./prometheus_dummy_exporter --metric-name=foo --metric-value=40 --port=8080

그런 다음 pod 매니페스트를 사용자 클러스터에 적용합니다.

kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] apply -f pro-pod.yaml

측정항목이 노출되고 스크레이핑되었는지 확인

  1. prometheus-example pod의 컨테이너는 TCP 포트 8080에서 리슨합니다. pod에서 로컬 포트를 포트 8080에 전달합니다.

    kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] port-forward prometheus-example 50002:8080
  2. 애플리케이션이 측정항목을 노출하는지 확인하려면 다음 명령어를 실행합니다.

    curl localhost:50002/metrics | grep foo
    

    이 명령어는 다음 출력을 반환합니다.

    # HELP foo Custom metric
    # TYPE foo gauge
    foo 40
  3. prometheus-0 pod의 컨테이너는 TCP 포트 9090에서 리슨합니다. pod에서 로컬 포트를 포트 9090에 전달합니다.

    kubectl --kubeconfig [USER_CLUSTER_KUBECONFIG] port-forward prometheus-0 50003:9090
  4. Prometheus가 측정항목을 스크레이핑하고 있는지 확인하려면 http://localhost:50003/targets로 이동합니다. 그러면 prometheus-io-pods 대상 그룹의 prometheus-0 pod로 이동할 수 있습니다.

  5. Prometheus에서 측정항목을 보려면 http://localhost:50003/graph로 이동합니다. search(검색) 필드에서 foo를 입력한 후 Execute(실행)를 클릭합니다. 페이지에 측정항목이 표시됩니다.