Fluentd를 사용한 Kubernetes Engine의 Stackdriver 로그 맞춤설정

이 가이드에서는 Google Kubernetes Engine 클러스터에 대해 Fluentd 로깅을 맞춤설정하는 방법을 설명합니다. Fluentd 데몬 구성을 할 수 없는 Kubernetes Engine 클러스터 생성 시 클라우드 로깅 옵션을 선택하는 대신 구성 가능한 Fluentd 데몬셋을 호스팅하여 Stackdriver로 로그를 보내는 방법을 알아봅니다.

목표

  • Google Stackdriver에 데이터를 로깅하도록 구성된 Google Kubernetes Engine 클러스터에 자신의 Fluentd 데몬셋을 배포합니다. 사용자가 이미 Kubernetes에 대해 잘 알고 있다고 가정합니다.
  • GKE 로깅을 사용자 지정하여 Stackdriver 로그에서 민감한 데이터를 제거합니다.

비용

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

가격 계산기에서는 이 환경의 비용을 8시간 동안 약 1.14달러로 예측합니다.

시작하기 전에

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

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

  2. Select or create a Google Cloud Platform project.

    Go to the Manage resources page

  3. 프로젝트에 결제가 사용 설정되어 있는지 확인하세요.

    결제 사용 설정 방법 알아보기

  4. Google Kubernetes Engine, Compute Engine APIs를 사용 설정합니다.

    APIs 사용 설정

공통 변수 초기화

인프라 요소가 배치되는 위치를 제어하는 여러 변수를 정의해야 합니다.

  1. 텍스트 편집기를 사용하여 [YOUR_PROJECT_ID]로 프로젝트 ID를 대체하여 다음 스크립트를 편집합니다. 이 스크립트는 지역을 us-east-1로 설정합니다. 스크립트를 변경하는 경우 영역 값이 지정된 영역을 참조하는지 확인합니다.

    region=us-east1
    zone=${region}-b
    project_id=[YOUR_PROJECT_ID]
    
  2. Cloud Shell로 이동합니다.

    Cloud Shell 열기

  3. 스크립트를 Cloud Shell 창에 복사하고 실행합니다.

  4. 다음 명령을 실행하여 이후의 모든 명령에 이러한 값을 지정할 필요가 없도록 기본 영역 및 프로젝트 ID를 설정합니다.

    gcloud config set compute/zone ${zone}
    gcloud config set project ${project_id}
    

클러스터 서비스 계정 생성

다음 단계에서는 로깅에 대한 서비스 계정을 생성하고 GKE 클러스터를 생성하는 데 사용할 해당 서비스 계정의 키를 생성합니다. 서비스 계정은 아래 배포된 데몬셋에서 실행되는 Fluentd 에이전트의 애플리케이션 기본 사용자 인증 정보가 됩니다.

  1. 서비스 계정을 만듭니다.

    gcloud iam service-accounts create cluster-service-account \
        --display-name "cluster-service-account"
    
  2. 서비스 계정에 logging.logWriter 역할을 추가합니다.

    gcloud projects add-iam-policy-binding ${project_id} \
        --member serviceAccount:cluster-service-account@${project_id}.iam.gserviceaccount.com \
        --role roles/logging.logWriter
    
  3. 서비스 계정에 monitoring.metricWriter 역할을 추가합니다.

    gcloud projects add-iam-policy-binding ${project_id} \
       --member serviceAccount:cluster-service-account@${project_id}.iam.gserviceaccount.com \
       --role roles/monitoring.metricWriter
    
  4. 서비스 계정에 container.admin 역할을 추가합니다.

    gcloud projects add-iam-policy-binding ${project_id} \
       --member serviceAccount:cluster-service-account@${project_id}.iam.gserviceaccount.com \
       --role roles/container.admin
    

GKE 클러스터 만들기

별도로 언급하지 않는 한, 컴퓨터의 명령 줄이나 Cloud Shell에 이 자습서에 대한 모든 명령을 입력합니다.

  1. 샘플 저장소를 복제합니다. 샘플 저장소에는 Fluentd 데몬셋에 대한 Kubernetes 매니페스트와 배포할 테스트 로깅 프로그램이 포함됨

    git clone https://github.com/GoogleCloudPlatform/container-engine-customize-fluentd
    
  2. 작업 디렉토리를 다음의 복제된 저장소로 변경합니다.

    cd container-engine-customize-fluentd
    
  3. 클라우드 로깅을 설정하지 않고 GKE 클러스터를 생성합니다.

    gcloud beta container clusters create gke-with-custom-fluentd \
        --service-account=cluster-service-account@${project_id}.iam.gserviceaccount.com \
        --zone us-east1-b \
        --no-enable-cloud-logging \
        --tags=gke-cluster-with-customized-fluentd
    

테스트 로거 애플리케이션 배포

기본적으로 배포하는 샘플 애플리케이션은 랜덤 로깅 진술을 지속적으로 생성합니다. 사용하는 Docker 컨테이너는 gcr.io/cloud-solutions-images/test-logger에서 사용할 수 있으며, 소스 코드는 test-logger 하위 디렉토리에 포함되어 있습니다.

  1. test-logger 애플리케이션을 GKE 클러스터에 배포합니다.

    kubectl apply -f kubernetes/test-logger.yaml
    
  2. test-logger 포드의 상태를 확인합니다.

    kubectl get pods
    
  3. 3개의 test-logger 포드가 모두 실행 중인 상태에서 출력이 다음과 같을 때까지 이 명령을 반복합니다.

    3개의 창을 보여 주는 명령 출력

클러스터에 Fluentd 데몬셋 배포

다음으로 Fluentd 데몬셋을 구성 및 배포합니다.

  1. Fluentd 구성을 배포합니다.

    kubectl apply -f kubernetes/fluentd-configmap.yaml
    
  2. Fluentd 데몬셋을 배포합니다.

    kubectl apply -f kubernetes/fluentd-daemonset.yaml
    
  3. Fluentd 포드가 시작되었는지 확인합니다.

    kubectl get pods --namespace=kube-system
    

    실행 중이면 다음과 같이 출력이 표시됩니다.

    3개의 창을 보여 주는 명령 출력

  4. Stackdriver에 로그가 있는지 확인함 콘솔의 왼쪽 메뉴에서 Stackdriver > 로깅을 클릭하고 목록에서 GKE cluster를 선택합니다.

    필터링되지 않은 데이터를 보여 주는 Stackdriver 목록

로그 파일에서 정보 필터링

다음 단계는 Fluentd가 특정 데이터를 필터링해서 로깅되지 않도록 지정하는 것입니다. 이 가이드에서는 사회 보장 번호, 신용 카드 번호 및 전자 메일 주소를 필터링합니다. 이 업데이트를 하려면 이러한 필터가 포함된 다른 ConfigMap을 사용하도록 데몬셋을 변경합니다. Kubernetes 롤링 업데이트 기능을 사용하고 이전 버전의 ConfigMap을 보존합니다.

  1. 편집기에서 kubernetes/fluentd-configmap.yaml 파일을 엽니다.

  2. ### sample log scrubbing filters### end sample log scrubbing filters 라인을 제외한 그 사이의 모든 라인의 주석 처리를 제거합니다.

    ############################################################################################################
    #  ### sample log scrubbing filters
    #  #replace social security numbers
    # <filter reform.**>
    #   @type record_transformer
    #   enable_ruby true
    #   <record>
    #     log ${record["log"].gsub(/[0-9]{3}-*[0-9]{2}-*[0-9]{4}/,"xxx-xx-xxxx")}
    #   </record>
    # </filter>
    # # replace credit card numbers that appear in the logs
    # <filter reform.**>
    #   @type record_transformer
    #   enable_ruby true
    #   <record>
    #      log ${record["log"].gsub(/[0-9]{4} *[0-9]{4} *[0-9]{4} *[0-9]{4}/,"xxxx xxxx xxxx xxxx")}
    #   </record>
    # </filter>
    # # replace email addresses that appear in the logs
    # <filter reform.**>
    #   @type record_transformer
    #   enable_ruby true
    #   <record>
    #     log ${record["log"].gsub(/[\w+\-]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+/i,"user@email.tld")}
    #   </record>
    # </filter>
    # ### end sample log scrubbing filters
    #############################################################################################################
  3. metadata.name 필드를 수정하여 ConfigMap의 이름을 fluentd-gcp-config에서 fluentd-gcp-config-filtered로 변경합니다.

    name: fluentd-gcp-config
    namespace: kube-system
    labels:
      k8s-app: fluentd-gcp-custom
  4. 저장하고 파일을 닫습니다.

새 구성을 사용하도록 Fluentd 데몬셋 업데이트

kubernetes/fluentd-daemonset-filtered.yaml 파일이 fluentd-gcp-config 대신 fluentd-gcp-config-filtered를 마운트합니다.

- configMap:
    defaultMode: 420
    name: fluentd-gcp-config-filtered
  1. 클러스터에 새 버전의 ConfigMap을 배포합니다.

    kubectl apply -f kubernetes/fluentd-configmap.yaml
    
  2. 새 버전의 데몬셋을 롤아웃합니다:

    kubectl apply -f kubernetes/fluentd-daemonset-filtered.yaml
  3. 업데이트를 롤아웃하고 완료될 때까지 기다립니다.

    kubectl rollout status ds/fluentd-gcp-v2.0 --namespace=kube-system
    

    3개의 포드에 대한 '대기 중' 메시지를 표시한 다음 성공

  4. 원격 설치가 완료되면 Stackdriver 로그를 새로 고치고 사회 보장 번호, 신용 카드 번호 및 이메일 주소 데이터가 필터링되었는지 확인합니다.

    동일한 데이터이지만 필터링된 Stackdriver 목록

삭제

가이드를 마친 후에는 GCP에서 생성한 리소스를 정리하여 나중에 다시 청구되지 않도록 할 수 있습니다.

프로젝트 삭제

비용이 청구되지 않도록 하는 가장 쉬운 방법은 가이드에서 만든 프로젝트를 삭제하는 것입니다.

프로젝트를 삭제하는 방법은 다음과 같습니다.

  1. GCP Console에서 프로젝트 페이지로 이동합니다.

    프로젝트 페이지로 이동

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

GKE 클러스터 삭제

전체 프로젝트를 삭제하지 않으려면 다음 명령어를 실행하여 GKE 클러스터를 삭제하세요.

gcloud container clusters delete gke-with-custom-fluentd

서비스 계정 삭제

서비스 계정만 삭제하려면 다음 명령을 실행하세요.

gcloud projects remove-iam-policy-binding ${project_id} \
    --member serviceAccount:cluster-service-account@${project_id}.iam.gserviceaccount.com \
    --role roles/logging.logWriter

gcloud projects remove-iam-policy-binding ${project_id} \
    --member serviceAccount:cluster-service-account@${project_id}.iam.gserviceaccount.com \
    --role roles/monitoring.metricWriter

gcloud projects remove-iam-policy-binding ${project_id} \
    --member serviceAccount:cluster-service-account@${project_id}.iam.gserviceaccount.com \
    --role roles/container.admin

gcloud iam service-accounts delete \
    "cluster-service-account@${project_id}.iam.gserviceaccount.com"

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...