Fluentd를 사용한 Google Kubernetes Engine의 Cloud Logging 로그 맞춤설정

Last reviewed 2022-10-03 UTC

이 가이드에서는 Google Kubernetes Engine 클러스터에 Fluentd 로깅을 맞춤설정하는 방법을 설명합니다. 또한 Google Kubernetes Engine(GKE) 클러스터를 만들 때 Fluentd 데몬 구성을 허용하지 않는 클라우드 로깅 옵션을 선택하는 대신 구성 가능한 자체 Fluentd 데몬셋을 호스팅하여 Cloud Logging에 로그를 보내는 방법을 설명합니다.

목표

  • Google Kubernetes Engine 클러스터에 데이터를 Cloud Logging에 로깅하도록 구성된 자체 Fluentd 데몬셋을 배포합니다. 여기서는 사용자가 이미 Kubernetes에 대해 잘 알고 있다고 가정합니다.
  • GKE 로깅을 맞춤설정하여 Cloud Logging 로그에서 민감한 정보를 삭제합니다.
  • GKE 로깅을 맞춤설정하여 Cloud Logging 로그에 노드 수준 이벤트를 추가합니다.

비용

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

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

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud Console의 프로젝트 선택기 페이지에서 Google Cloud 프로젝트를 선택하거나 만듭니다.

    프로젝트 선택기로 이동

  3. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  4. API Google Kubernetes Engine, Compute Engine 사용 설정

    API 사용 설정

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

    프로젝트 선택기로 이동

  6. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  7. API Google Kubernetes Engine, Compute Engine 사용 설정

    API 사용 설정

공통 변수 초기화

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

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

    export region=us-east1
    export zone=${region}-b
    export 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 클러스터 만들기

  1. Cloud Shell에서 샘플 저장소를 클론합니다.

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-customize-fluentd
    

    샘플 저장소에는 나중에 이 튜토리얼에서 배포하는 테스트 로깅 프로그램 및 Fluentd 데몬셋에 대한 Kubernetes 매니페스트가 포함되어 있습니다.

  2. 작업 디렉터리를 다음의 클론된 저장소로 변경합니다.

    cd kubernetes-engine-customize-fluentd
    
  3. 시스템 로깅 및 모니터링만으로 GKE 클러스터를 만듭니다.

    gcloud container clusters create gke-with-custom-fluentd \
       --zone us-east1-b \
       --logging=SYSTEM \
       --tags=gke-cluster-with-customized-fluentd \
       --scopes=logging-write,storage-rw
    

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

기본적으로 배포하는 샘플 애플리케이션은 랜덤 로깅 진술을 지속적으로 생성합니다. Docker 컨테이너는 test-logger 하위 디렉터리의 소스 코드에서 빌드됩니다.

  1. Cloud Shell에서 test-logger 컨테이너 이미지를 빌드합니다.

    docker build -t test-logger test-logger
    
  2. 레지스트리로 내보내기 전에 컨테이너에 태그를 지정합니다.

    docker tag test-logger gcr.io/${project_id}/test-logger
    
  3. 컨테이너 이미지를 내보냅니다.

    docker push gcr.io/${project_id}/test-logger
    
  4. 배포 파일을 업데이트합니다.

    envsubst < kubernetes/test-logger.yaml > kubernetes/test-logger-deploy.yaml
    
  5. GKE 클러스터에 test-logger 애플리케이션을 배포합니다.

    kubectl apply -f kubernetes/test-logger-deploy.yaml
    
  6. test-logger pod 상태를 봅니다.

    kubectl get pods
    
  7. test-logger pod 세 개가 실행 중인 상태에서 다음과 같이 출력될 때까지 이 명령어를 반복합니다.

    실행 중인 pod 세 개를 보여주는 명령어 결과

클러스터에 Fluentd 데몬셋 배포

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

  1. Cloud Shell에서 Fluentd 구성을 배포합니다.

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

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

    kubectl get pods --namespace=kube-system
    

    실행 중이면 다음과 같은 결과가 표시됩니다.

    실행 중인 Pod 세 개를 보여주는 명령어 결과

  4. Logging에 로그가 있는지 확인합니다. Console의 왼쪽에서 Logging > 로그 탐색기를 선택한 다음 리소스 목록에서 리소스 유형으로 Kubernetes 컨테이너를 선택합니다.

  5. 쿼리 실행을 클릭합니다.

  6. 로그 필드 탐색기에서 CONTAINER_NAME에 대해 test-logger를 선택합니다.

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

로그 파일에서 정보 필터링

다음 단계는 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 데몬셋 업데이트

이제 fluentd-gcp-config 대신 ConfigMap fluentd-gcp-config-filtered를 마운트하도록 kubernetes/fluentd-daemonset.yaml을 변경합니다.

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

  2. configMap.name 필드를 편집하여 ConfigMap 이름을 fluentd-gcp-config에서 fluentd-gcp-config-filtered로 변경합니다.

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

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

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

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

    Pod 3개에 '대기 중' 메시지를 표시한 후 성공을 표시하는 명령어 결과

  6. 출시가 완료되면 Logging 로그를 새로 고치고 주민등록번호, 신용 카드 번호, 이메일 주소 데이터가 필터링되었는지 확인합니다.

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

노드 수준 이벤트 로깅

GKE 노드에서 발생하는 이벤트를 Logging에도 표시하려면 ConfigMap에 다음 줄을 추가하고 마지막 섹션에서 설명하는 안내를 따르세요.

<source>
  @type systemd
  filters [{ "SYSLOG_IDENTIFIER": "sshd" }]
  pos_file /var/log/journal/gcp-journald-ssh.pos
  read_from_head true
  tag sshd
</source>

<source>
  @type systemd
  filters [{ "SYSLOG_IDENTIFIER": "sudo" }]
  pos_file /var/log/journal/gcp-journald-sudo.pos
  read_from_head true
  tag sudo
</source>

정리

가이드를 완료한 후에는 이후에 요금이 청구되지 않도록 Google Cloud에서 만든 리소스를 삭제할 수 있습니다.

프로젝트 삭제

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

프로젝트를 삭제하려면 다음을 실행합니다.

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

    리소스 관리로 이동

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

GKE 클러스터 삭제

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

gcloud container clusters delete gke-with-custom-fluentd --zone us-east1-b

다음 단계