연결된 클러스터 로깅 및 모니터링

이 페이지에서는 로그와 측정항목을 연결 클러스터에서 Cloud Logging 및 Cloud Monitoring으로 내보내는 방법을 보여줍니다.

작동 방식

Google Cloud Observability는 Google Cloud에 기본 제공되는 관측 가능성 솔루션입니다. 연결된 클러스터에서 Google Cloud로 클러스터 수준 원격 분석을 내보내려면 다음 오픈소스 내보내기 에이전트를 클러스터에 배포해야 합니다.

  • Stackdriver 로그 애그리게이터(stackdriver-log-aggregator-*): Cloud Logging(이전 Stackdriver Logging) API에 로그를 전송하는 Fluentd StatefulSet.
  • Stackdriver 로그 전달자(stackdriver-log-forwarder-*): 각 Kubernetes 노드의 로그를 Stackdriver 로그 애그리게이터로 전달하는 Fluentbit daemonset.
  • Stackdriver 측정항목 수집기(stackdriver-prometheus-k8s-*): Prometheus 측정항목을 Cloud Monitoring(이전 Stackdriver Monitoring) API에 전송하는, Stackdriver 내보내기 사이드카 컨테이너로 구성된 Prometheus StatefulSet. 사이드카는 동일한 pod 내의 또 다른 컨테이너로서, prometheus 서버가 디스크에 저장하는 측정항목을 읽고 Cloud Monitoring API로 전달합니다.

기본 요건

  1. 결제가 사용 설정된 Google Cloud 프로젝트. Cloud 운영 비용에 대한 상세 내용은 가격 책정 가이드를 참조하세요.

  2. 이 가이드를 사용하여 등록한 연결 클러스터 1개. 다음 명령어를 실행하여 클러스터가 등록되었는지 확인하세요.

    gcloud container fleet memberships list
    

    출력 예시는 다음과 같습니다.

    NAME  EXTERNAL_ID
    eks   ae7b76b8-7922-42e9-89cd-e46bb8c4ffe4
    

  3. 클러스터에 액세스하여 kubectl 명령어를 실행할 수 있는 로컬 환경. gcloud를 통해 kubectl을 설치하는 방법은 GKE 빠른 시작을 참조하세요. 다음 명령어를 실행하여 kubectl을 사용하여 연결된 클러스터에 연결할 수 있는지 확인합니다.

    kubectl cluster-info
    

    출력 예시는 다음과 같습니다.

    Kubernetes master is running at https://[redacted].gr7.us-east-2.eks.amazonaws.com
    

설정

  1. 이 가이드를 위한 샘플 저장소를 클론하고 해당 디렉터리로 이동합니다.

    git clone https://github.com/GoogleCloudPlatform/anthos-samples
    cd anthos-samples/attached-logging-monitoring
    
  2. 프로젝트 ID 변수를 클러스터를 등록한 프로젝트로 설정합니다.

    PROJECT_ID="your-project-id"
    
  3. Cloud Monitoring 및 Cloud Logging API에 측정항목 및 로그를 쓸 수 있는 권한이 있는 Google Cloud 서비스 계정을 만듭니다. 다음 섹션에서 배포된 워크로드에 이 서비스 계정의 키를 추가합니다.

    gcloud iam service-accounts create anthos-lm-forwarder
    
    gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:anthos-lm-forwarder@${PROJECT_ID}.iam.gserviceaccount.com" \
      --role=roles/logging.logWriter
    
    gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member="serviceAccount:anthos-lm-forwarder@${PROJECT_ID}.iam.gserviceaccount.com" \
      --role=roles/monitoring.metricWriter
    
  4. 바로 전에 만든 서비스 계정에 대해 JSON 키를 만들고 다운로드한 후 이 키를 사용하여 클러스터에 Kubernetes 보안 비밀을 만듭니다.

    gcloud iam service-accounts keys create credentials.json \
    --iam-account anthos-lm-forwarder@${PROJECT_ID}.iam.gserviceaccount.com
    
    kubectl create secret generic google-cloud-credentials -n kube-system --from-file credentials.json
    

로깅 에이전트 설치

  1. logging/ 디렉터리로 변경합니다.

    cd logging/
    
  2. aggregator.yaml을 엽니다. 파일 하단에서 다음 변수를 프로젝트 및 클러스터에 해당하는 값으로 설정합니다.

    project_id [PROJECT_ID]
    k8s_cluster_name [CLUSTER_NAME]
    k8s_cluster_location [CLUSTER_LOCATION]
    

    연결된 클러스터의 멤버십 이름으로 다음 명령어를 실행하고 /locations/<location>에 표시되는 위치를 가져오면 클러스터 위치를 찾을 수 있습니다.

    gcloud container fleet memberships describe eks | grep name
    

    출력:

    name: projects/my-project/locations/global/memberships/eks
    

  3. aggregator.yamlvolumeClaimTemplates/spec에서 클러스터에 대해 PersistentVolumeClaim storageClassName을 지정합니다. 사용자가 필요에 따라 주석 처리를 삭제할 수 있도록 EKS 및 AKS에 대한 기본값이 제공되어 있습니다. EKS를 사용하는 경우에는 gp2입니다. AKS의 경우에는 default입니다.

    AWS 또는 Azure에서 커스텀 Kubernetes 스토리지 클래스를 구성했거나, 기본값이 아닌 스토리지 클래스를 사용하고 싶거나, 다른 규정 준수 클러스터 유형을 사용 중이면 고유 storageClassName을 추가할 수 있습니다. 적절한 storageClassNameStorageClass를 사용하여 클러스터에 대해 관리자가 제공한 PersistentVolume(PV) 유형을 기준으로 합니다. 스토리지 클래스 및 다른 주요 Kubernetes 공급업체의 기본 스토리지 클래스에 대한 자세한 내용은 Kubernetes 문서를 참조하세요.

    # storageClassName: standard #Google Cloud
    # storageClassName: gp2 #AWS EKS
    # storageClassName: default #Azure AKS
    
  4. 로그 애그리게이터와 전달자를 클러스터에 배포합니다.

    kubectl apply -f aggregator.yaml
    kubectl apply -f forwarder.yaml
    
  5. Pod가 시작되었는지 확인합니다. 2개의 애그리게이터 Pod와 Kubernetes 워커 노드당 하나의 전달자 Pod가 표시됩니다. 예를 들어 4노드 클러스터에는 전달자 노드가 4개 표시됩니다.

    kubectl get pods -n kube-system | grep stackdriver-log
    

    출력:

    stackdriver-log-aggregator-0                 1/1     Running   0          139m
    stackdriver-log-aggregator-1                 1/1     Running   0          139m
    stackdriver-log-forwarder-2vlxb              1/1     Running   0          139m
    stackdriver-log-forwarder-dwgb7              1/1     Running   0          139m
    stackdriver-log-forwarder-rfrdk              1/1     Running   0          139m
    stackdriver-log-forwarder-sqz7b              1/1     Running   0          139m
    

  6. 애그리게이터 로그를 가져오고 로그가 Google Cloud로 전송되는지 확인합니다.

    kubectl logs stackdriver-log-aggregator-0 -n kube-system
    

    출력:

    2020-10-12 14:35:40 +0000 [info]: #3 [google_cloud] Successfully sent gRPC to Stackdriver Logging API.
    

  7. 클러스터에 테스트 애플리케이션을 배포합니다. loadgenerator가 포함된 기본 HTTP 웹 서버입니다.

    kubectl apply -f  https://raw.githubusercontent.com/GoogleCloudPlatform/istio-samples/master/sample-apps/helloserver/server/server.yaml
    
    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/istio-samples/master/sample-apps/helloserver/loadgen/loadgen.yaml
    
  8. Cloud Logging 대시보드의 연결된 클러스터에서 로그를 볼 수 있는지 확인합니다. Google Cloud Console의 로그 탐색기로 이동합니다.

    로그 탐색기로 이동

  9. 로그 탐색기에서 아래의 샘플 쿼리를 쿼리 빌더 필드에 복사하고 ${your-cluster-name}을 클러스터 이름으로 바꿉니다. 쿼리 실행을 클릭합니다. 쿼리 결과 아래에 최근 클러스터 로그가 표시됩니다.

    resource.type="k8s_container" resource.labels.cluster_name="${your-cluster-name}"
    

연결된 클러스터의 로그

모니터링 에이전트 설치

  1. logging/ 디렉터리에서 monitoring/ 디렉터리로 이동합니다.

    cd ../monitoring
    
  2. prometheus.yaml을 엽니다. stackdriver-prometheus-sidecar/args 아래에서 다음 변수를 해당 환경에 맞게 설정합니다.

    "--stackdriver.project-id=[PROJECT_ID]"
    "--stackdriver.kubernetes.location=[CLUSTER_LOCATION]"
    "--stackdriver.generic.location=[CLUSTER_LOCATION]"
    "--stackdriver.kubernetes.cluster-name=[CLUSTER_NAME]"
    
  3. prometheus.yaml의 volumeClaimTemplates/spec 아래에서 로깅 에이전트 설치에 설명된 대로 해당 클라우드 제공업체와 일치하는 storageClassName을 주석 처리 삭제합니다.

    # storageClassName: standard #Google Cloud
    # storageClassName: gp2 #AWS EKS
    # storageClassName: default #Azure AKS
    
  4. 내보내기 사이드카로 구성된 stackdriver-prometheus StatefulSet를 클러스터에 배포합니다.

    kubectl apply -f server-configmap.yaml
    kubectl apply -f sidecar-configmap.yaml
    kubectl apply -f prometheus.yaml
    
  5. stackdriver-prometheus pod가 실행 중인지 확인합니다.

    watch kubectl get pods -n kube-system | grep stackdriver-prometheus
    
    출력은 다음과 같습니다.
    stackdriver-prometheus-k8s-0         2/2     Running   0          5h24m
    
  6. Stackdriver Prometheus 사이드카 컨테이너 로그를 가져와 pod가 시작되었는지 확인합니다.

    kubectl logs stackdriver-prometheus-k8s-0 -n kube-system stackdriver-prometheus-sidecar
    
    출력은 다음과 같습니다.
    level=info ts=2020-11-18T21:37:24.819Z caller=main.go:598 msg="Web server started"
    level=info ts=2020-11-18T21:37:24.819Z caller=main.go:579 msg="Stackdriver client started"
    
  7. Cloud Monitoring에 대해 클러스터 측정항목 내보내기가 성공적으로 수행되는지 확인합니다. Google Cloud Console의 측정항목 탐색기로 이동합니다.

    측정항목 탐색기로 이동

  8. 쿼리 편집기를 클릭하고 다음 명령어를 복사하여 ${your-project-id}${your-cluster-name}을 자체 프로젝트 및 클러스터 정보로 바꿉니다. 그런 다음 쿼리 실행을 클릭합니다. 1.0.이 표시되어야 합니다.

    fetch k8s_container
    | metric 'kubernetes.io/anthos/up'
    | filter
        resource.project_id == '${your-project-id}'
        && (resource.cluster_name =='${your-cluster-name}')
    | group_by 1m, [value_up_mean: mean(value.up)]
    | every 1m
    

연결된 클러스터 모니터링

삭제

  1. 이 가이드에서 만든 리소스를 모두 삭제하려면 다음 안내를 따르세요.

    kubectl delete -f logging
    kubectl delete -f monitoring
    kubectl delete secret google-cloud-credentials -n kube-system
    kubectl delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/istio-samples/master/sample-apps/helloserver/loadgen/loadgen.yaml
    kubectl delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/istio-samples/master/sample-apps/helloserver/server/server.yaml
    rm -r credentials.json
    gcloud compute service-accounts delete anthos-lm-forwarder
    

다음 단계

Cloud Logging 자세히 알아보기

Cloud Monitoring 자세히 알아보기