Prometheus 및 Cloud Monitoring을 사용하여 여러 GKE 클러스터에서 실행되는 앱 모니터링

이 가이드에서는 하이브리드 환경에서 실행되는 여러 Google Kubernetes Engine(GKE) 클러스터에 Prometheus 서버를 배포하는 방법을 설명합니다. 그런 다음 이러한 클러스터에서 실행되는 앱에서 측정항목을 수집하여 중앙에서 관측할 수 있도록 Cloud Monitoring에 전송하는 방법을 설명합니다.

Prometheus는 Google 내부 모니터링 시스템인 Borgmon을 토대로 하는 오픈소스 모니터링 및 알림 도구입니다. Borg는 Kubernetes 오픈소스 프로젝트에 영향을 주었고 Borgmon은 Prometheus에 영향을 주었습니다. 이 도구들은 서로 잘 연동됩니다.

Prometheus를 사용하면 구성 가능한 간격으로 쿼리(또는 스크레이핑)되는 스크레이핑 대상을 구성하여 여러 머신에서 측정항목을 검색하고 가져올 수 있습니다. 스크레이핑 대상은 일반적으로 앱에서 노출된 HTTP 엔드포인트이며 측정항목이 줄마다 하나씩 있는 잘 정의된 노출 형식을 사용합니다. HTTP를 스크레이핑 대상의 기본 전송 메커니즘으로 사용하면 다양한 언어 및 엔드포인트의 측정항목을 노출할 수 있습니다. 스크레이핑 대상에서 수집된 측정항목은 Prometheus 시계열 데이터베이스에 저장됩니다.

프로덕션 환경에서는 로컬 Prometheus 데이터베이스에서 Cloud Monitoring과 같은 보다 강력한 모니터링 솔루션으로 측정항목을 내보냅니다. Cloud Monitoring은 서비스, 컨테이너, 앱, 인프라를 위한 Google 관리 모니터링 및 관리 솔루션입니다. Cloud Monitoring은 측정항목, 로그, trace, 이벤트에 대한 강력한 스토리지 솔루션을 제공합니다. 또한 대시보드, 보고, 알림, 기타 기능이 포함된 관측 가능성 도구 모음을 제공합니다.

이 가이드에서는 여러 Kubernetes 클러스터에 설치된 Prometheus 서버를 사용하여 앱(PostgreSQL)에서 측정항목을 스크레이핑합니다. prometheus 컨테이너와 함께 실행되는 prometheus-stackdriver-sidecar 컨테이너를 사용하여 측정항목을 인증하고 Monitoring으로 전송합니다. 이 측정항목은 Monitoring에 저장되고 분석 및 알림 용도로 사용됩니다. 사이드카 방식은 모니터링할 워크로드에서 측정항목 스크레이핑을 분리하므로 권장사항으로 간주됩니다. 이 방식으로 스크레이핑 프로세스와 모니터링 프로세스가 서로 방해하지 않으면서 각각 필요에 따라 리소스를 할당할 수 있습니다.

이 솔루션에서는 Google Cloud 프로젝트에 다음 아키텍처를 빌드합니다.

아키텍처 다이어그램

목표

  • 두 개의 GKE 클러스터를 만들되 클러스터 하나는 Google Cloud 외부 Kubernetes 클러스터(예: 온프레미스에서 실행되는 Kubernetes 클러스터)를 시뮬레이션합니다. 이 가이드에서는 두 클러스터 모두 GKE 클러스터입니다.
  • 두 클러스터에 Prometheus 서버를 설치합니다.
  • 두 클러스터에서 prometheus-stackdriver 내보내기 사이드카를 구성합니다. 이 사이드카는 측정항목을 인증하고 Monitoring에 전송합니다.
  • 두 클러스터에 앱을 설치합니다. 이 가이드에서는 PostgreSQL을 예시 앱으로 사용합니다. 하지만 이 방법은 Prometheus 측정항목을 내보내도록 구성된 앱을 모두 사용할 수 있습니다.
  • Monitoring에서 두 클러스터로부터 내보낸 측정항목을 모니터링합니다.

비용

이 가이드에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

시작하기 전에

  1. Google 계정으로 로그인합니다.

    아직 계정이 없으면 새 계정을 등록하세요.

  2. Cloud Console의 프로젝트 선택기 페이지에서 Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기 페이지로 이동

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다. 프로젝트에 결제가 사용 설정되어 있는지 확인하는 방법을 알아보세요.

  4. GKE and Monitoring API를 사용 설정합니다.

    API 사용 설정

이 가이드를 마치면 만든 리소스를 삭제하여 비용이 계속 청구되지 않게 할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

환경 설정

Cloud Shell에서 이 가이드의 모든 터미널 명령어를 실행합니다.

저장소 클론

  1. Cloud Shell을 엽니다.

    Cloud Shell 열기

  2. 다음 저장소를 클론하여 이 가이드에 필요한 파일을 다운로드합니다. 저장소 폴더를 이 가이드와 관련된 모든 태스크를 수행하는 작업 폴더($WORKDIR))로 만듭니다.

    cd $HOME
    git clone https://github.com/GoogleCloudPlatform/prometheus-stackdriver-gke
    cd $HOME/prometheus-stackdriver-gke
    WORKDIR=$(pwd)
    

Helm, kubectx, kubens 설치

  1. Cloud Shell에서 $WORKDIR 폴더에 Helm을 설치합니다.

    HELM_VERSION=v2.13.0
    HELM_PATH="$WORKDIR"/helm-"$HELM_VERSION"
    wget https://storage.googleapis.com/kubernetes-helm/helm-"$HELM_VERSION"-linux-amd64.tar.gz
    tar -xvzf helm-"$HELM_VERSION"-linux-amd64.tar.gz
    mv linux-amd64 "$HELM_PATH"
    rm $WORKDIR/helm-"$HELM_VERSION"-linux-amd64.tar.gz
    

    Helm은 Kubernetes 앱을 구성 및 배포하는 데 사용할 수 있는 패키지 관리자입니다. 이 설치는 개발자가 설치한 다른 Helm 설치를 방해하지 않습니다.

  2. kubectxkubens를 설치합니다.

    git clone https://github.com/ahmetb/kubectx $WORKDIR/kubectx
    export PATH=$PATH:$WORKDIR/kubectx
    

    이러한 도구는 컨텍스트와 네임스페이스를 보다 간편하게 전환할 수 있도록 하여 여러 GKE 클러스터 작업을 용이하게 합니다.

pgbench 설치

이 가이드에서는 PostgreSQL을 Prometheus 모니터링용 샘플 앱으로 사용합니다. Prometheus 서버가 측정항목을 수집할 수 있도록 PostgreSQL로의 트래픽을 생성하려면 PostgreSQL에서 벤치마크 테스트를 실행하는 간단한 프로그램인 pgbench라는 도구를 사용합니다.

  • Cloud Shell에서 pgbench를 설치합니다.

    sudo apt-get install postgresql-contrib
    

IAM 구성

ID 및 액세스 관리(IAM)서비스 계정을 만들어Prometheus 사이드카 컨테이너에 권한을 위임하면 측정항목 데이터를 Mornitoring에 쓸 수 있습니다.

  1. Cloud Shell에서 Prometheus Monitoring 사이드카가 사용할 Google Cloud 서비스 계정을 만듭니다.

    gcloud iam service-accounts create prometheus --display-name prometheus-service-account
    
  2. 이후에 명령어에서 사용할 수 있도록 서비스 계정 이메일 주소 및 현재 프로젝트 ID를 환경 변수에 저장합니다.

    export PROJECT_ID=$(gcloud info --format='value(config.project)')
    PROMETHEUS_SA_EMAIL=$(gcloud iam service-accounts list \
        --filter="displayName:prometheus-service-account" \
        --format='value(email)')
    
  3. monitoring.metricWriter 역할을 Prometheus 서비스 계정에 결합합니다.

    gcloud projects add-iam-policy-binding ${PROJECT_ID} --role roles/monitoring.metricWriter --member serviceAccount:${PROMETHEUS_SA_EMAIL}
    

    monitoring.metricWriter 역할을 통해 Prometheus 사이드카 컨테이너가 측정항목 데이터를 Monitoring에 쓸 수 있습니다. Monitoring은 이러한 측정항목을 저장하고 대시보드, 알림 등에 사용합니다.

  4. 서비스 계정 키를 작업 디렉터리에 다운로드합니다.

    gcloud iam service-accounts keys create $WORKDIR/prometheus-service-account.json --iam-account ${PROMETHEUS_SA_EMAIL}
    

Prometheus 사이드카 컨테이너는 서비스 계정 키를 보안 비밀로 사용하여 Cloud Monitoring API에 인증합니다.

GKE 클러스터에서는 수동으로 이러한 키를 구성할 필요가 없습니다. GKE에서 실행되는 pod(및 컨테이너)는 Compute Engine 인스턴스 메타데이터에 액세스하고 Prometheus 서버가 실행되는 GKE 노드(또는 Compute Engine 인스턴스)에 연결된 서비스 계정 정보를 검색할 수 있습니다. GKE 클러스터의 경우 Prometheus 사이드카 컨테이너는 인스턴스 메타데이터 서비스의 서비스 계정 정보를 사용하여 Cloud Monitoring API에 인증할 수 있습니다.

온프레미스 데이터 센터에서 실행되는 클러스터와 같은 GKE 클러스터가 아닌 클러스터는 Google Cloud 서비스 계정에 액세스할 수 없습니다. 이러한 클러스터는 수동으로 구성된 서비스 계정 키를 사용하여 Cloud Monitoring API에 자신을 인증합니다.

이 가이드에서는 gke라고 하는 GKE 클러스터가 Compute Engine 인스턴스 메타데이터를 사용하여 측정항목을 쓸 수 있도록 Cloud Monitoring API에 인증합니다. onprem이라고 하는 두 번째 GKE 클러스터는 Monitoring API에 액세스할 수 없는 GKE 클러스터가 아닌 클러스터를 시뮬레이션하여 측정항목을 쓰므로 서비스 계정 키를 사용해야 합니다.

GKE 클러스터 만들기 및 구성

GKE 노드는 Compute Engine 관리형 인스턴스 그룹입니다. 이러한 모든 인스턴스에는 ID가 있습니다. Compute Engine 인스턴스 ID는 생성 시 연결된 Google Cloud 서비스 계정입니다.

이 서비스 계정에 연결된 IAM 역할과 권한도 인스턴스에 연결된 권한을 결정합니다. GKE 클러스터를 만들 때 서비스 계정을 명시적으로 정의하지 않으면 프로젝트 기본 서비스 계정을 통해 클러스터가 생성됩니다. 클러스터에서 실행되는 pod는 노드의 (Compute Engine 인스턴스) 메타데이터 서비스에 액세스할 수 있고 연결된 서비스 계정을 사용하여 다양한 Google Cloud 서비스(예: Cloud Monitoring API)에 액세스할 수 있습니다. 기본 서비스 계정과 기본 GKE 범위에는 Cloud Monitoring API에 측정항목을 쓸 수 있는 권한이 있습니다.

이 가이드에서는 기본 서비스 계정을 사용하여 클러스터 두 개(gkeonprem)를 만듭니다. gke 클러스터만 Compute Engine 인스턴스 메타데이터 서비스를 사용하고 기본 서비스 계정을 사용하여 Monitoring에 측정항목을 씁니다. onprem 클러스터는 기본 서비스 계정을 사용하지 않습니다. 대신 Prometheus Google Cloud 서비스 계정 키를 사용하여 Monitoring에 액세스합니다.

GKE 클러스터 만들기

  1. us-west2-a 영역에서 첫 번째 클러스터 gke를 만들고 이 클러스터에서 GKE용 Cloud Monitoring을 사용 설정합니다.

    gcloud beta container clusters create gke \
        --zone us-west2-a \
        --num-nodes 3 \
        --machine-type n1-standard-2 \
        --enable-stackdriver-kubernetes \
        --verbosity=none --async
    
  2. us-east4-a 영역에서 두 번째 클러스터인 onprem을 만듭니다.

    gcloud container clusters create onprem \
        --zone us-east4-a \
        --num-nodes 3 \
        --machine-type n1-standard-2 \
        --verbosity=none
    
  3. 두 클러스터가 모두 생성될 때까지 몇 분 정도 기다립니다. 클러스터가 실행 중인지 확인합니다.

    gcloud container clusters list
    

    출력은 다음과 비슷합니다.

    NAME    LOCATION    MASTER_VERSION  MASTER_IP       MACHINE_TYPE   NODE_VERSION  NUM_NODES  STATUS
    onprem  us-east4-a  1.11.8-gke.6    <external IP>   n1-standard-2  1.11.8-gke.6  3          RUNNING
    gke     us-west2-a  1.11.8-gke.6    <external IP>   n1-standard-2  1.11.8-gke.6  3          RUNNING
    

클러스터 연결 및 액세스 구성

  1. 두 클러스터 모두에 연결하여 kubeconfig 파일에 항목을 생성합니다.

    gcloud container clusters get-credentials gke --zone us-west2-a --project ${PROJECT_ID}
    gcloud container clusters get-credentials onprem --zone us-east4-a --project ${PROJECT_ID}
    

    kubeconfig 파일은 각 클러스터의 사용자와 컨텍스트를 만들어 클러스터에 대한 인증을 만드는 데 사용됩니다. kubeconfig 파일을 만들면 클러스터 간에 컨텍스트를 빠르게 전환할 수 있습니다.

  2. 편의상 kubectx를 사용하여 컨텍스트 이름을 바꿉니다.

    kubectx gke=gke_${PROJECT_ID}_us-west2-a_gke
    kubectx onprem=gke_${PROJECT_ID}_us-east4-a_onprem
    
  3. 클러스터에서 관리자 수준의 작업을 수행할 수 있도록 Google ID에 클러스터 모두에 대한 cluster-admin 권한을 부여합니다.

    kubectl create clusterrolebinding user-admin-binding \
        --clusterrole=cluster-admin \
        --user=$(gcloud config get-value account) \
              --context gke
    kubectl create clusterrolebinding user-admin-binding \
        --clusterrole=cluster-admin \
        --user=$(gcloud config get-value account) \
        --context onprem
    

Prometheus 서버 설치 및 구성

Prometheus 서버 구성 워크플로는 GKE 클러스터와 비GKE 클러스터에서 서로 다릅니다. 혼동을 피하기 위해 이 가이드에서는 두 가지 설정을 모두 안내합니다.

gke 클러스터에 Prometheus 설치(GKE 워크플로)

이 섹션에서는 Prometheus로 gke 클러스터를 구성합니다. GKE 클러스터가 실행 중인 경우 모든 클러스터에 이 워크플로를 따르세요.

  1. Cloud Shell에서 gke 클러스터에 Prometheus 전용 네임스페이스를 만듭니다.

    kubectl create namespace prometheus --context gke
    
  2. Prometheus Kubernetes 서비스 계정, ClusterRole 역할, 클러스터 역할 결합을 만듭니다.

    cd $WORKDIR
    kubectl apply -f prometheus-service-account.yaml --context gke
    

    클러스터 역할은 모든 네임스페이스에서 실행되는 배포에서 측정항목을 검색할 수 있는 권한을 부여합니다. 클러스터 역할 결합은 이 역할을 Prometheus 서비스 계정에 할당합니다.

  3. Prometheus configmap을 만들어 gke 클러스터에서 실행되는 앱에서 측정항목을 스크레이핑합니다.

    kubectl apply -f prometheus-configmap.yaml --context gke
    

    Prometheus 구성 파일에 대한 자세한 내용은 Prometheus 문서를 참조하세요.

    다음 작업은 Prometheus 서버 배포를 만드는 것입니다. 다음 단계의 매니페스트는 pod가 하나인 Prometheus 배포를 만듭니다. 이 pod는 컨테이너 두 개(Prometheus 서버 컨테이너 및 Monitoring 사이드카)로 구성됩니다. Prometheus 서버 컨테이너는 Prometheus 측정항목을 내보내는 GKE 클러스터 내 pod에서 측정항목을 수집합니다. 이 서버는 Monitoring 사이드카 컨테이너를 사용하여 측정항목을 Monitoring에 푸시합니다.

  4. Prometheus 배포 매니페스트에서 사용되는 환경 변수를 정의합니다.

    export KUBE_NAMESPACE=prometheus
    export KUBE_CLUSTER=gke
    export GCP_REGION=us-west2-a
    export GCP_PROJECT=$(gcloud info --format='value(config.project)')
    export DATA_DIR=/prometheus
    export DATA_VOLUME=prometheus-storage-volume
    export SIDECAR_IMAGE_TAG=release-0.3.2
    
  5. 방금 정의한 환경 변수를 사용하여 Prometheus 배포 매니페스트를 적용합니다.

    envsubst < gke-prometheus-deployment.yaml | kubectl --context gke apply -f -
    
  6. 잠시 기다린 후 Prometheus pod가 실행 중인지 확인합니다.

    kubectl get pods -n prometheus --context gke
    

    출력은 다음과 비슷합니다.

    NAME                                     READY     STATUS    RESTARTS   AGE
    prometheus-deployment-6b5df7b5ff-ghqb2   2/2       Running   0          20s
    

    두 컨테이너가 Prometheus pod에서 실행되고 있습니다.

  7. 컨테이너 이미지를 확인합니다.

    kubectl --context gke get pods -n prometheus -o json | jq '.items[].spec.containers[].image'
    

    출력은 다음과 비슷합니다.

    "prom/prometheus:v2.6.1"
    "gcr.io/stackdriver-prometheus/stackdriver-prometheus-sidecar:release-0.3.2"
    

    pod에서 실행되는 Prometheus 서버와 stackdriver-prometheus-sidecar 컨테이너가 표시됩니다.

  8. gke 클러스터에서 실행되는 Prometheus 서버 UI에 대한 포트 전달을 설정합니다.

    export PROMETHEUS_POD_GKE=$(kubectl get pods --namespace prometheus -l "app=prometheus-server" \
        -o jsonpath="{.items[0].metadata.name}" \
        --context gke)
    kubectl --context gke port-forward --namespace prometheus $PROMETHEUS_POD_GKE 9090:9090 >> /dev/null &
    

    다음 단계는 Prometheus UI를 여는 것입니다.

  9. Cloud Shell에서 웹 미리보기를 클릭한 다음 포트 변경을 클릭합니다.

    1. 포트 번호9090을 입력합니다.
    2. 변경 및 미리보기를 클릭합니다. Prometheus 서버 UI가 표시됩니다.

    Prometheus 서버 UI.포트 9090으로 변경.

gke 클러스터에서 Prometheus 검사

Prometheus는 Prometheus Kubernetes 서비스 계정을 사용하여 GKE 클러스터에서 실행 중인 리소스를 검색합니다. 이러한 리소스 중 일부는 이미 Prometheus 측정항목을 내보내도록 구성되어 있습니다.

  1. Prometheus UI에서 상태 > 서비스 검색을 클릭합니다. 표시되는 목록은 Prometheus에서 검색한 Kubernetes 리소스를 보여줍니다.

    Prometheus에서 검색한 Kubernetes 리소스

    Service Discovery
    kubernetes-apiservers (1/16 active targets)
    kubernetes-cadvisor (3/3 active targets)
    kubernetes-nodes (3/3 active targets)
    kubernetes-pods (0/42 active targets)
    kubernetes-service-endpoints (0/16 active targets)
    
  2. Status(상태) > Targets(대상)를 클릭합니다.

    Targets(대상)는 일정한 간격으로 Prometheus 측정항목을 내보내는 리소스에서 정의된 HTTP(S) 엔드포인트입니다. 다양한 Kubernetes 리소스에서 측정항목을 내보냅니다. 예를 들어 Kubernetes API 서버는 /metrics HTTPS 엔드포인트에서 측정항목을 내보냅니다.

gke 클러스터에 PostgreSQL 설치

이 섹션에서는 gke 클러스터에 앱을 설치합니다. 앱은 Prometheus 측정항목을 내보내도록 계측되어 있습니다. 이 가이드에서는 안정적인 Helm 차트를 사용하여 PostgreSQL을 설치합니다. 하지만 Prometheus 측정항목을 내보내는 모든 앱은 같은 워크플로를 따릅니다.

  1. gke 클러스터 컨텍스트로 전환합니다.

    kubectx gke
    
  2. Helm의 서버 측인 Tiller에 gke 클러스터의 cluster-admin 역할을 부여합니다.

    kubectl create serviceaccount tiller --namespace kube-system
    kubectl create clusterrolebinding tiller-admin-binding \
        --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
    
  3. Helm을 초기화하고 gke 클러스터에 Tiller를 설치합니다.

    ${HELM_PATH}/helm init --service-account=tiller
    ${HELM_PATH}/helm repo update
    
  4. 다음 명령어를 실행하여 Helm이 정상적으로 설치되었는지 확인합니다.

    ${HELM_PATH}/helm version
    

    출력은 다음과 비슷합니다.

    Client: &version.Version{SemVer:"v2.13.0", GitCommit:"79d07943b03aea2b76c12644b4b54733bc5958d6", GitTreeState:"clean"}
    Server: &version.Version{SemVer:"v2.13.0", GitCommit:"79d07943b03aea2b76c12644b4b54733bc5958d6", GitTreeState:"clean"}
    

    Helm이 올바르게 설치되었으면 클라이언트와 서버에 v2.13.0이 표시됩니다. 클라이언트와 서버가 모두 설치되었다고 표시될 때까지 버전 명령어를 여러 번 실행해야 할 수도 있습니다.

  5. 안정적인 Helm 릴리스를 사용하여 PostgreSQL을 설치합니다.

    ${HELM_PATH}/helm install --name gke --set postgresUser=user,postgresPassword=password,postgresDatabase=postgres \
        stable/postgresql --set metrics.enabled=true \
        --set postgresqlDatabase=prometheusdb
    

    PostgreSQL이 초기화되려면 몇 분 정도 걸립니다.

  6. 계속 진행하기 전에 PostgreSQL이 실행 중인지 확인합니다.

    kubectl get pods
    

    출력은 다음과 비슷합니다.

    NAME               READY     STATUS    RESTARTS   AGE
    gke-postgresql-0   2/2       Running   0          1m
    

    PostgreSQL pod 내에서 실행 중인 두 컨테이너를 검사합니다.

    kubectl --context gke get pods gke-postgresql-0 -ojson | jq '.spec.containers[].image'
    

    출력은 다음과 비슷합니다.

    "docker.io/bitnami/postgresql:10.7.0"
    "docker.io/wrouesnel/postgres_exporter:v0.4.7"
    

    첫 번째 컨테이너는 PostgreSQL 컨테이너입니다. 두 번째 컨테이너는 Postgre용 Prometheus 측정항목 내보내기입니다.

  7. gke에서 실행되는 서비스를 검사합니다.

    kubectl get services
    

    출력은 다음과 비슷합니다.

    NAME                      TYPE        CLUSTER-IP      EXTERNAL-IP
    gke-postgresql-metrics    ClusterIP   10.23.255.97    <none>        9187/TCP   1m
    

    PostgreSQL은 gke-postgresql-metrics 서비스를 사용하여 Prometheus 측정항목을 노출합니다.

  8. gke-postgresql-metrics 서비스의 주석을 검사합니다.

    kubectl --context gke get service gke-postgresql-metrics -ojson | jq '.metadata.annotations'
    

    출력은 다음과 비슷합니다.

    {
      "prometheus.io/port": "9187",
      "prometheus.io/scrape": "true"
    }
    

    Prometheus는 Kubernetes 서비스 레지스트리를 사용하여 Kubernetes 서비스를 검색합니다. Prometheus는 서비스에서 Kubernetes 주석을 사용하여 Prometheus 대상 구성을 확인합니다. 이러한 주석은 포트, 대상 엔드포인트, 스크레이핑할 서비스, 기타 설정 같은 Prometheus 구성을 설명합니다.

    출력에는 Prometheus 측정항목용 9187 포트와 true로 설정된 scrape 설정을 설명하는 주석 두 개가 표시됩니다. 주석으로 달리 정의되지 않는 한 기본 대상 엔드포인트는 /metrics입니다. Prometheus Kubernetes 주석 및 구성의 자세한 목록은 Prometheus 문서를 참조하세요.

  9. Prometheus UI 창에서 Status(상태) > Targets(대상) 페이지를 클릭하거나 새로 고치고 kubernetes-service-endpoints 섹션으로 스크롤한 후 kubernetes-service-endpoints 링크 옆에 있는 show more(더 보기)를 클릭합니다.

    Prometheus UI 창

    Prometheus가 포트 9187과 스크레이핑 대상 /metrics에서 PostgreSQL pod로부터 측정항목을 스크레이핑하는 방법에 유의하세요. IP 주소는 PostgreSQL pod의 IP 주소입니다.

Monitoring 사이드카와 함께 Prometheus 서버를 GKE 클러스터에 성공적으로 설치했습니다. 또한 Prometheus 측정항목을 내보내도록 올바르게 구성된 앱(PostgreSQL)도 설치했습니다. 이제 Prometheus는 Kubernetes 서비스 주석을 사용하여 이 앱의 측정항목을 스크레이핑합니다. 다음 섹션에서는 onprem 클러스터에 Prometheus와 PostgreSQL을 설치합니다.

온프렘 클러스터에 Prometheus 설치(비GKE 워크플로)

이 섹션에서는 Prometheus로 onprem 클러스터를 구성합니다. GKE 클러스터가 아닌 클러스터의 경우 이 워크플로를 따르세요.

  1. onprem 클러스터에 Prometheus 전용 네임스페이스를 만듭니다.

    kubectl create namespace prometheus --context onprem
    
  2. Prometheus Kubernetes 서비스 계정과 ClusterRole 역할을 만듭니다.

    kubectl apply -f prometheus-service-account.yaml --context onprem
    

    ClusterRole 역할은 모든 네임스페이스에서 실행되는 배포에서 측정항목을 검색할 수 있는 권한을 부여합니다.

  3. Prometheus configmap을 만들어 onprem 클러스터에서 실행되는 앱에서 측정항목을 스크레이핑합니다.

    kubectl apply -f prometheus-configmap.yaml --context onprem
    

다음으로 Prometheus 배포를 만듭니다. Prometheus 서버는 2단계에서 만든 prometheus라고 하는 Kubernetes 서비스 계정을 사용하여 Kubernetes 클러스터에서 실행되는 앱에서 측정항목을 스크레이핑합니다. Prometheus 서버는 Monitoring 사이드카 컨테이너를 사용하여 이러한 측정항목을 Monitoring에 전송합니다. 사이드카를 사용하려면 Google Cloud 서비스 계정이 Cloud Monitoring API에 인증하고 측정항목을 내보내야 합니다. onprem 클러스터는 GKE 클러스터가 아닌 클러스터를 시뮬레이션합니다. 따라서 Compute Engine 인스턴스 메타데이터 서비스를 사용하여 Google Cloud 서비스 계정에 액세스할 수 없습니다. 사이드카를 구성하려면 앞에서 다운로드한 Google Cloud 서비스 계정의 JSON 키를 사용합니다.

다음 단계는 gke 클러스터에서 구성한 GKE 워크플로와 다릅니다.

  1. Google Cloud 서비스 계정의 JSON 키를 사용하여 보안 비밀을 만듭니다.

    kubectl create secret -n prometheus generic prometheus-key --from-file=$WORKDIR/prometheus-service-account.json --context onprem
    
  2. Prometheus 배포를 만드는 데 필요한 환경 변수를 정의합니다.

    export KUBE_NAMESPACE=prometheus
    export KUBE_CLUSTER=onprem
    export GCP_REGION=us-east4-a
    export GCP_PROJECT=$(gcloud info --format='value(config.project)')
    export DATA_DIR=/prometheus
    export DATA_VOLUME=prometheus-storage-volume
    export SIDECAR_IMAGE_TAG=release-0.3.2
    
  3. Prometheus 배포를 만듭니다.

    envsubst < onprem-prometheus-deployment.yaml | kubectl --context onprem apply -f -
    
  4. 잠시 기다린 후 Prometheus Pod가 실행 중인지 확인합니다.

    kubectl get pods -n prometheus --context onprem
    

    출력은 다음과 비슷합니다.

    NAME                                     READY     STATUS    RESTARTS   AGE
    prometheus-deployment-75857dc9fc-vp5cr   2/2       Running   0          55s
    

    Prometheus pod에서 실행 중인 두 개의 컨테이너를 확인합니다.

  5. 다음 명령어를 실행하여 컨테이너 이미지를 확인합니다.

    kubectl --context onprem get pods -n prometheus -ojson | jq '.items[].spec.containers[].image'
    

    출력은 다음과 비슷합니다.

    "prom/prometheus:v2.6.1"
    "gcr.io/stackdriver-prometheus/stackdriver-prometheus-sidecar:release-0.3.2"
    

    pod에서 실행되는 Prometheus 서버와 stackdriver-prometheus-sidecar 컨테이너가 표시됩니다. 사이드카 pod는 prometheus-key 보안 비밀을 사용하여 Cloud Monitoring API에 인증합니다. Prometheus 배포에 사용되는 volumes, volumeMounts, env를 검사합니다.

  6. Prometheus 배포에서 volumes를 검사합니다.

    kubectl --context onprem -n prometheus get deploy prometheus-deployment -ojson | jq '.spec.template.spec.volumes'
    

    이 명령어는 앞에서 만든 secretName prometheus-key를 사용하여 prometheus-key라고 하는 볼륨을 만듭니다. 출력은 다음 발췌와 비슷하게 표시됩니다.

      {
        "name": "prometheus-key",
        "secret": {
          "defaultMode": 420,
          "secretName": "prometheus-key"
        }
    
    
  7. 사이드카 컨테이너에서 volumeMounts를 검사합니다.

    kubectl --context onprem -n prometheus get deploy prometheus-deployment -ojson | jq '.spec.template.spec.containers[1].volumeMounts'
    

    출력은 다음 발췌와 비슷하게 표시됩니다.

    {
      "mountPath": "/var/secrets/google",
      "name": "prometheus-key"
    }
    

    prometheus-key 볼륨은 stackdriver-sidecar 컨테이너의 마운트 경로 /var/secrets/google에 마운트됩니다. 이 경로에 서비스 계정 키가 있습니다.

  8. Monitoring 사이드카 컨테이너에 정의된 환경 변수를 검사합니다. 환경 변수 [GOOGLE_APPLICATION_CREDENTIALS](/docs/authentication/getting-started#setting_the_environment_variable)는 Google 클라이언트 라이브러리에서 인증에 사용하는 특수한 환경 변수입니다. 이 변수에는 prometheus-service-account.json 키의 경로를 가리키는 값이 할당됩니다. Monitoring 사이드카는 Google 클라이언트 라이브러리를 사용하므로 이 변수를 사용하여 Cloud Monitoring API에 인증합니다.

    kubectl --context onprem -n prometheus get deploy prometheus-deployment -ojson | jq '.spec.template.spec.containers[1].env'
    

    출력은 다음과 비슷합니다.

    [
      {
        "name": "GOOGLE_APPLICATION_CREDENTIALS",
        "value": "/var/secrets/google/prometheus-service-account.json"
      }
    ]
    
  9. onprem 클러스터에서 실행되는 Prometheus 서버 UI에 대한 포트 전달을 설정합니다.

    export PROMETHEUS_POD_ONPREM=$(kubectl get pods --namespace prometheus -l "app=prometheus-server" \
        -o jsonpath="{.items[0].metadata.name}" --context onprem)
    kubectl --context onprem port-forward \
        --namespace prometheus $PROMETHEUS_POD_ONPREM 9091:9090 >> /dev/null &
    

    다음 단계는 Prometheus UI를 여는 것입니다.

  10. Cloud Shell에서 웹 미리보기를 클릭한 다음 포트 변경을 클릭합니다.

    1. 포트 번호9091을 입력합니다.
    2. 변경 및 미리보기를 클릭합니다. Prometheus 서버 UI가 표시됩니다. 이로써 Prometheus 서버가 실행 중임이 확인됩니다.

    Prometheus UI.포트 번호를 9091로 변경.

온프렘 클러스터에 PostgreSQL 설치

이 섹션에서는 Helm을 사용하여 onprem 클러스터에 PostgreSQL을 설치합니다. 이 단계는 gke 클러스터의 PostgreSQL 설치 절차와 동일합니다.

  1. onprem 컨텍스트로 전환합니다.

    kubectx onprem
    
  2. Helm의 서버 측인 Tiller에 onprem 클러스터의 cluster-admin 역할을 부여합니다.

    kubectl create serviceaccount tiller --namespace kube-system
    kubectl create clusterrolebinding tiller-admin-binding --clusterrole=cluster-admin --serviceaccount=kube-system:tiller
    
  3. Helm을 초기화하고 onprem 클러스터에 Tiller를 설치합니다.

    ${HELM_PATH}/helm init --service-account=tiller
    ${HELM_PATH}/helm update
    

    다음 명령어를 실행하여 Helm이 정상적으로 설치되었는지 확인합니다.

    ${HELM_PATH}/helm version
    

    Helm이 올바르게 설치되었으면 클라이언트와 서버에 v2.13.0이 표시됩니다. 클라이언트와 서버가 모두 설치되었다고 표시될 때까지 명령어를 여러 번 실행해야 할 수도 있습니다.

    Client: &version.Version{SemVer:"v2.13.0", GitCommit:"79d07943b03aea2b76c12644b4b54733bc5958d6", GitTreeState:"clean"}
    Server: &version.Version{SemVer:"v2.13.0", GitCommit:"79d07943b03aea2b76c12644b4b54733bc5958d6", GitTreeState:"clean"}
    
  4. 안정적인 Helm 릴리스를 사용하여 PostgreSQL을 설치합니다.

    ${HELM_PATH}/helm install --name onprem \
    --set postgresUser=user,postgresPassword=password,postgresDatabase=postgres \
    stable/postgresql --set metrics.enabled=true --set postgresqlDatabase=prometheusdb
    
  5. PostgreSQL이 실행 중인지 확인합니다.

    kubectl get pods
    

    출력은 다음과 비슷합니다.

    onprem-postgresql-0   2/2       Running   0          39s
    

    PostgreSQL pod에서 실행 중인 두 컨테이너를 검사합니다.

    kubectl --context onprem get pods onprem-postgresql-0 -ojson | jq '.spec.containers[].image'
    

    첫 번째 컨테이너는 PostgreSQL 컨테이너입니다. 두 번째 컨테이너는 Postgre용 Prometheus 측정항목 내보내기입니다. 출력은 다음과 비슷합니다.

    "docker.io/bitnami/postgresql:10.7.0"
    "docker.io/wrouesnel/postgres_exporter:v0.4.7"
    
  6. onprem 클러스터에서 실행 중인 서비스를 검사합니다. PostgreSQL은 onprem-postgresql-metrics 서비스를 사용하여 Prometheus 측정항목을 노출합니다.

    kubectl get services --context onprem
    

    출력은 다음과 비슷합니다.

    onprem-postgresql-metrics    ClusterIP   10.47.240.77    <none>        9187/TCP   1m
    
  7. onprem-postgresql-metrics 서비스의 주석을 검사합니다.

    kubectl --context onprem get service onprem-postgresql-metrics -ojson | jq '.metadata.annotations'
    

    출력은 다음과 비슷합니다.

    {
      "prometheus.io/port": "9187",
      "prometheus.io/scrape": "true"
    }
    
  8. Prometheus UI 창에서 Status(상태) > Targets(대상) 페이지를 클릭하고 kubernetes-service-endpoints 섹션으로 스크롤한 후 kubernetes-service-endpoints 링크 옆에 있는 show more(더 보기) 버튼을 클릭합니다.

    측정항목을 스크레이핑하는 Prometheus

    Prometheus가 포트 9187과 스크레이핑 대상 /metrics에서 PostgreSQL pod로부터 측정항목을 스크레이핑합니다.

사이드카와 함께 Prometheus 서버를 GKE 클러스터가 아닌 클러스터(예: 온프레미스 데이터 센터에서 실행되는 Kubernetes 클러스터)에 설치했습니다. 또한 Prometheus 측정항목을 내보내도록 올바르게 구성된 클러스터에 PostgreSQL을 설치했습니다. 이제 Prometheus는 Kubernetes 서비스 주석을 사용하여 PostgreSQL 데이터베이스에서 측정항목을 스크레이핑합니다.

다음 섹션에서는 모니터링을 위해 Monitoring을 설정하고 gke 클러스터와 onprem 클러스터 모두에서 실행되는 PostgreSQL 데이터베이스에 대한 트래픽을 생성하고 Monitoring에서 측정항목을 모니터링합니다.

Monitoring 설정

이 섹션에서는 Monitoring에서 측정항목 모니터링에 사용할 새 작업공간을 설정합니다. 작업공간은 Monitoring의 모니터링 정보를 구성합니다. Monitoring 작업공간을 사용하면 위치와 관계없이 중요한 리소스를 모니터링할 수 있습니다. Google Cloud의 작업공간을 만들려면 해당 프로젝트에 다음 IAM 역할 중 하나가 있어야 합니다.

  • 프로젝트 소유자
  • 모니터링 편집자
  • 모니터링 관리자
  • 모니터링 계정 편집자

Monitoring에서 측정항목을 설정하려면 다음 안내를 따르세요.

  1. Google Cloud Console에서 Monitoring으로 이동하거나 다음 버튼을 사용합니다.

    Monitoring으로 이동

  2. Monitoring 링크를 처음 클릭하면 자동으로 새 작업공간이 생성되고 초기화됩니다. 작업공간 이름은 프로젝트 ID와 동일합니다.

  3. 대시보드를 클릭합니다.
  4. 대시보드 만들기를 클릭합니다.
  5. 대시보드 이름 필드에 PostgreSQL을 입력합니다.
  6. 차트 추가를 클릭합니다.
  7. 측정항목 탭을 선택했는지 확인합니다.
  8. 리소스 유형 및 측정항목 찾기로 표시된 상자를 클릭하고 pg_stat_database_blks_read를 입력합니다.
  9. 그룹화 기준 드롭다운 목록에서 cluster_name을 선택합니다.
  10. 애그리게이터sum을 입력합니다.

    리소스 유형 찾기

    측정항목 이름의 프리픽스는 external/prometheus/입니다. 이는 측정항목이 Prometheus 서버에서 온 것임을 나타냅니다. 차트에서 측정항목이 두 클러스터에서 오는 것을 확인할 수 있습니다. 이는 gke 클러스터와 onprem 클러스터 모두에서 측정항목을 내보내고 있음을 의미합니다.

  11. 차트 저장을 클릭합니다. 차트 이름을 지정합니다.
  12. 차트 추가를 클릭합니다.
  13. 이 차트의 경우 pg_stat_database_blks_hit 측정항목을 입력합니다.
  14. 그룹화 기준 드롭다운 목록에서 cluster_name을 선택합니다.
  15. 애그리게이터sum을 입력합니다.
  16. 차트 저장을 클릭합니다. 차트 이름을 지정합니다.
  17. 대시보드를 클릭하고 PostgreSQL을 선택합니다. 이 대시보드에는 차트 두 개가 있습니다.
  18. list를 클릭하여 범례를 표시하고 두 클러스터 모두에서 측정항목을 수신하고 있는지 확인합니다.

    두 클러스터 모두에서 측정항목을 수신하고 있는지 확인

    대시보드에서 차트 추가를 클릭하여 측정 항목을 추가할 수도 있습니다.

PostgreSQL로의 트래픽 생성

이 섹션에서는 두 클러스터에서 실행되는 PostgreSQL 데이터베이스로의 트래픽을 생성하여 Monitoring 대시보드에서 측정항목을 모니터링합니다. PostgreSQL 벤치마킹 도구인 pgbench를 사용하여 트래픽을 생성합니다. 두 개의 Cloud Shell 창을 사용하여 동시에 두 PostgreSQL 데이터베이스로 가는 트래픽을 생성합니다.

gke PostgreSQL 인스턴스로의 트래픽 생성

  1. 상단 표시줄의 Cloud Shell 탭 옆에서 두 번째 Cloud Shell 탭을 엽니다.

    두 번째 Cloud Shell 세션 열기

    첫 번째 Cloud Shell 창에서 다음 명령어를 실행하여 gke 클러스터에서 실행되는 PostgreSQL 데이터베이스로의 트래픽을 생성합니다.

  2. gke 클러스터의 PostgreSQL 데이터베이스 비밀번호를 가져옵니다.

    export POSTGRES_PASSWORD_GKE=$(kubectl --context gke get secret --namespace default gke-postgresql -o jsonpath="{.data.postgresql-password}" | base64 --decode)
    
  3. 포트 전달을 사용하여 gke 클러스터의 5432 포트에서 PostgreSQL 데이터베이스를 노출합니다.

    kubectl --context gke port-forward --namespace default svc/gke-postgresql 5432:5432 >> /dev/null &
    
  4. PostgreSQL 데이터베이스에 로그인합니다.

    PGPASSWORD="$POSTGRES_PASSWORD_GKE" psql --host 127.0.0.1 -p 5432 -U postgres -d prometheusdb
    
  5. 벤치마킹을 위해 gketest라는 데이터베이스를 만듭니다.

    CREATE DATABASE gketest;
    
  6. PostgreSQL 데이터베이스를 종료합니다.

    \q
    
  7. 벤치마킹을 위해 gketest 데이터베이스를 초기화합니다.

    PGPASSWORD="$POSTGRES_PASSWORD_GKE" pgbench -i -h localhost -p 5432 -U postgres -d gketest
    
  8. gke 클러스터의 gketest 데이터베이스에서 벤치마크를 시작합니다. 다음 테스트는 -T 옵션(초)에서 구성된 대로 10분 동안 실행됩니다.

    PGPASSWORD="$POSTGRES_PASSWORD_GKE" pgbench -c 10 -T 600 -h localhost -p 5432 -U postgres -d gketest
    

onprem PostgreSQL 인스턴스로의 트래픽 생성

두 번째 Cloud Shell 창에서 다음 명령어를 실행하여 onprem 클러스터에서 실행되는 PostgreSQL 데이터베이스로의 트래픽을 생성합니다.

  1. onprem 클러스터의 PostgreSQL 데이터베이스 비밀번호를 가져옵니다.

    export POSTGRES_PASSWORD_ONPREM=$(kubectl --context onprem get secret --namespace default onprem-postgresql -o jsonpath="{.data.postgresql-password}" | base64 --decode)
    
  2. 포트 전달을 사용하여 onprem 클러스터의 5431 포트에서 PostgreSQL 데이터베이스를 노출합니다.

    kubectl --context onprem port-forward --namespace default svc/onprem-postgresql 5431:5432 >> /dev/null &
    
  3. PostgreSQL 데이터베이스에 로그인합니다.

    PGPASSWORD="$POSTGRES_PASSWORD_ONPREM" psql --host 127.0.0.1 -p 5431 -U postgres -d prometheusdb
    
  4. 벤치마킹을 위해 onpremtest라는 데이터베이스를 만듭니다.

    CREATE DATABASE onpremtest;
    
  5. PostgreSQL 데이터베이스를 종료합니다.

    \q
    
  6. 벤치마킹을 위해 onpremtest 데이터베이스를 초기화합니다.

    PGPASSWORD="$POSTGRES_PASSWORD_ONPREM" pgbench -i -h localhost -p 5431 -U postgres -d onpremtest
    
  7. onprem 클러스터의 onpremtest 데이터베이스에서 벤치마크를 시작합니다. 다음 테스트는 10분 동안 실행됩니다.

    PGPASSWORD="$POSTGRES_PASSWORD_ONPREM" pgbench -c 10 -T 600 -h localhost -p 5431 -U postgres -d onpremtest
    

모니터링 데이터 검토

테스트가 실행되는 동안 Monitoring 페이지로 돌아와 차트를 검사합니다.

  1. Cloud Console에서 Monitoring으로 이동합니다.

    Monitoring으로 이동

    여러 클러스터에서 실행되는 앱에서 Prometheus 측정항목 수신

  2. 대시보드 > PostgreSQL로 이동합니다.

  3. 자동 새로고침을 사용 설정하려면 자동 새로고침 를 클릭합니다. 몇 분 후 차트에 데이터베이스 블록 읽기 및 히트 데이터가 채워집니다.

이제 여러 Kubernetes 클러스터에서 실행되는 앱에서 Monitoring으로 Prometheus 측정항목이 수신됩니다.

삭제

이 가이드에서 사용한 리소스 비용이 Google Cloud Platform 계정에 청구되지 않도록 하려면 다음 안내를 따르세요.

프로젝트 삭제

  1. Cloud Console에서 리소스 관리 페이지로 이동합니다.

    리소스 관리 페이지로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제 를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 다음 종료를 클릭하여 프로젝트를 삭제합니다.

다음 단계