멀티 테넌트 로깅 설정


이 페이지에서는 Google Kubernetes Engine(GKE) 클러스터에 멀티 테넌트 로깅을 구성하는 방법을 설명합니다.

여러 팀이 단일 GKE 클러스터를 공유하는 것은 일반적입니다. 클러스터를 공유하면 더 간편한 서비스 검색, 간소화된 보안 등 다양한 이점이 있으며 클러스터 관리자가 유지할 클러스터 수는 줄어듭니다. 그러나 개별 애플리케이션 팀에는 별도의 자체 프로젝트가 있는 경우가 많습니다. 기본 GKE 클러스터가 있지만 각 애플리케이션팀에 별도의 네임스페이스를 보유하는 이 구조를 멀티테넌시라고 합니다. 애플리케이션팀의 프로젝트를 테넌트라고 합니다.

Google Cloud를 사용하면 GKE 클러스터 관리자가 클러스터의 로그가 기본 GKE 프로젝트에 보관되고 테넌트 로그가 테넌트 프로젝트에 배포되는 시스템을 만들 수 있습니다. 이러한 방식으로 로그를 구성하려면 로그 라우터를 사용하세요. 로그 라우터는 Google Cloud 프로젝트 내의 로그 흐름 및 로그가 지원되는 대상으로 라우팅되는 방식을 제어할 수 있습니다.

테넌트별 로그를 만들려면 클러스터 관리자는 싱크를 만들어 로그 항목을 각 테넌트의 프로젝트로 라우팅합니다. 각 테넌트 프로젝트에서 개별 팀은 로그 저장 및 사용 방법(예: 로그 기반 측정항목 및 로그 기반 알림을 구성하여 로그 모니터링)을 제어할 수 있습니다.

기본 GKE 프로젝트의 _Default 싱크에는 제외 필터를 포함하는 것이 좋습니다. 제외 필터는 기본 GKE 프로젝트 및 테넌트 프로젝트 모두에서 테넌트 로그가 수집되지 않도록 방지합니다.

기본 요건

멀티 테넌트 로깅 구성

Google Cloud CLI 또는 Google Cloud 콘솔을 사용하여 멀티 테넌트 로깅을 구성할 수 있습니다.

gcloud

GKE 클러스터용 멀티 테넌트 로깅을 구성하려면 다음 단계를 완료하세요.

  1. 다음 환경 변수를 설정합니다.

    export TENANT_NAMESPACE="TENANT_NAMESPACE"
    export MAIN_PROJECT="MAIN_PROJECT_ID"
    export TENANT_PROJECT="TENANT_PROJECT_ID"
    

    다음을 바꿉니다.

    • TENANT_NAMESPACE: 테넌트 프로젝트 네임스페이스의 이름
    • MAIN_PROJECT_ID: 기본 프로젝트의 프로젝트 ID
    • TENANT_PROJECT_ID: 테넌트 프로젝트의 프로젝트 ID
  2. 멀티 테넌트 클러스터에 네임스페이스를 만듭니다.

    kubectl create namespace $TENANT_NAMESPACE
    
  3. 기본 GKE 프로젝트에서 로그 싱크를 만듭니다.

    gcloud logging sinks create gke-$TENANT_NAMESPACE-sink \
    logging.googleapis.com/projects/$TENANT_PROJECT \
        --project=$MAIN_PROJECT \
        --log-filter=resource.labels.namespace_name="$TENANT_NAMESPACE" \
        --description="Log sink to $TENANT_PROJECT for $TENANT_NAMESPACE namespace"
    

    이 명령어는 $TENANT_NAMESPACE 네임스페이스와 관련된 모든 로그를 테넌트 프로젝트로 전송하는 로그 싱크를 만듭니다.

    더 제한적인 --log-filter를 사용해야 할 수 있습니다. 예를 들어 클러스터와 테넌트의 네임스페이스가 동일한 경우 클러스터 필터를 추가하세요.

    이러한 필드에 대한 자세한 내용은 gcloud logging sinks create API 문서를 참조하세요.

  4. 기본 프로젝트의 싱크에서 작성자 ID를 가져와 환경 변수에 할당합니다.

    export SERVICE_ACCOUNT=$(gcloud logging sinks describe gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT \
        --format='value(writerIdentity)')
    
  5. 싱크에서 사용하는 서비스 계정에 로그 작성자(logging.bucketWriter) 역할을 부여합니다. 다음 명령어는 테넌트 프로젝트에 로그를 작성할 수 있는 기본 프로젝트 권한을 부여합니다.

     gcloud projects add-iam-policy-binding $TENANT_PROJECT \
         --member=$SERVICE_ACCOUNT --role='roles/logging.logWriter' \
         --condition="expression=resource.name.endsWith(\"projects/$TENANT_PROJECT\"),title=Log writer for $TENANT_NAMESPACE,description=Grants Logs Writer role to service account $SERVICE_ACCOUNT used by gke-$TENANT_NAMESPACE-sink"
    

    이러한 필드에 대한 자세한 내용은 gcloud projects add-iam-policy-binding API 문서를 참조하세요.

  6. 선택사항으로는, 기본 프로젝트의 _Default 버킷으로 로그를 라우팅하는 싱크의 제외 필터를 만듭니다. _Default 버킷에 제외 필터를 만들지 않으면 라우팅된 로그가 기본 프로젝트의 _Default 버킷 및 테넌트 로그 버킷에 모두 표시됩니다. 제외 필터를 만들려면 다음 안내를 따르세요.

    gcloud logging sinks update _Default --project=$MAIN_PROJECT \
        --add-exclusion="name=gke-$TENANT_NAMESPACE-default-exclusion,description=\"Exclusion filter on the _Default bucket for $TENANT_NAMESPACE\",filter=resource.labels.namespace_name=\"$TENANT_NAMESPACE\""
    

    이러한 필드에 대한 자세한 내용은 gcloud logging sinks update API 문서를 참조하세요.

콘솔

GKE용 멀티 테넌트 로깅을 구현하려면 다음 단계를 완료하세요.

  1. 기본 프로젝트에서 로그 싱크를 만듭니다.

    1. Google Cloud 콘솔 프로젝트 선택도구를 사용하여 기본 GKE 프로젝트를 선택합니다.
    2. Google Cloud 콘솔의 탐색 패널에서 Logging을 선택한 후 로그 라우터를 선택합니다.

      로그 라우터로 이동

    3. 로그 라우터 페이지에서 싱크 만들기를 클릭합니다.
    4. 싱크의 이름설명을 입력한 후 다음을 클릭합니다.
    5. 싱크 서비스 선택 메뉴에서 기타 프로젝트를 선택합니다.
    6. 싱크 대상 위치 필드에 다음 대상을 추가합니다.

      logging.googleapis.com/projects/TENANT_PROJECT_ID
      

      TENANT_PROJECT_ID를 테넌트 프로젝트의 프로젝트 ID로 바꿉니다.

    7. 다음을 클릭합니다.

    8. 포함 필터 만들기에서 다음 필터를 추가합니다.

      resource.labels.namespace_name="TENANT_NAMESPACE"
      

      TENANT_NAMESPACE를 테넌트 프로젝트의 네임스페이스 이름으로 바꿉니다.

      더 제한적인 포함 필터를 사용하는 것이 좋을 수 있습니다. 예를 들어 클러스터와 테넌트의 네임스페이스가 동일한 경우 특정 클러스터의 로그 항목만 포함하도록 절을 추가하는 것이 좋습니다.

    9. 싱크 만들기를 클릭합니다. 새 싱크가 로그 라우터 싱크 목록에 표시됩니다.

  2. 싱크의 작성자 ID를 클립보드에 복사합니다.

    1. 로그 라우터 페이지에서 로그 싱크를 찾습니다.
    2. 해당 싱크에 대해 더보기를 클릭한 후 싱크 세부정보 보기를 선택합니다.
    3. 싱크 세부정보 창에서 작성자 ID 필드를 찾은 후 값을 클립보드에 복사합니다. 복사된 값에서 serviceAccount:를 생략합니다.
  3. 테넌트 프로젝트에서 기본 프로젝트의 싱크에 사용되는 서비스 계정에 로그 작성자(roles/logging.logWriter) 역할을 부여합니다. 기본 프로젝트에는 테넌트 프로젝트에 로그를 쓸 수 있는 권한이 필요합니다.

    1. Google Cloud 콘솔의 탐색 패널에서 IAM을 선택합니다.

      IAM으로 이동

    2. 액세스 권한 부여를 클릭합니다.
    3. 새 주 구성원 필드에 싱크의 서비스 계정을 추가합니다.
    4. 역할 선택 드롭다운에서 Logging을 선택하고 로그 작성자를 선택합니다.
    5. 저장을 클릭합니다.
  4. 원하는 경우 기본 프로젝트의 _Default 버킷에 제외 필터를 만들어 테넌트 프로젝트로 라우팅된 로그가 기본 프로젝트의 _Default 로그 버킷에 기록되지 않도록 합니다.

    1. Google Cloud 콘솔의 탐색 패널에서 Logging을 선택한 후 로그 라우터를 선택합니다.

      로그 라우터로 이동

    2. _Default 버킷 옆의 더보기를 클릭하고 싱크 수정을 선택합니다.
    3. 싱크를 필터링할 로그 선택 섹션에서 제외 추가를 클릭합니다.
    4. 필터 이름을 추가합니다.
    5. 제외 필터 만들기 상자에서 다음을 추가합니다.

      resource.labels.namespace_name="TENANT_NAMESPACE"
      
    6. 싱크 업데이트를 클릭합니다.

테넌트 로그 확인

TENANT_NAMESPACE를 사용하는 워크로드를 사용하기 시작하면 테넌트 프로젝트가 테넌트별 로그를 수신하고 있는지 확인할 수 있습니다.

  1. Google Cloud 콘솔 프로젝트 선택 도구를 사용하여 테넌트 프로젝트를 선택합니다.
  2. Google Cloud 콘솔의 탐색 패널에서 Logging을 선택한 후 로그 탐색기를 선택합니다.

    로그 탐색기로 이동

  3. 쿼리 편집기 필드에서 다음 쿼리를 실행합니다.

    resource.labels.namespace_name="TENANT_NAMESPACE"
    

    쿼리 결과 창에 기본 프로젝트에서 라우팅된 테넌트별 로그가 표시됩니다.

테넌트 로그 사용

테넌트 프로젝트에서 각 팀은 로그 라우팅, 저장, 분석 방법을 제어할 수 있습니다. 로그가 테넌트 프로젝트로 라우팅되면 개별 애플리케이션 팀이 Pub/Sub를 사용하여 로그를 Logging 버킷과 같이 지원되는 대상 또는 타사 대상으로 라우팅하도록 선택할 수 있습니다. 로그 항목 라우팅에 대한 자세한 내용은 지원되는 대상으로 로그 라우팅을 참조하세요.

개별 애플리케이션팀은 로그의 콘텐츠 또는 로그에서 파생된 측정항목을 기반으로 알림을 설정할 수도 있습니다. 자세한 내용은 로그 모니터링을 참조하세요.

삭제

gcloud 또는 Google Cloud 콘솔을 사용하여 멀티 테넌트 로깅을 위해 만든 객체를 삭제할 수 있습니다.

gcloud

멀티 테넌트 로깅을 위해 만든 객체를 삭제하려면 다음 단계를 완료합니다.

  1. 다음 명령어를 단순화하는 변수를 설정합니다.

    export TENANT_NAMESPACE="TENANT_NAMESPACE"
    export MAIN_PROJECT="MAIN_PROJECT_ID"
    export TENANT_PROJECT="TENANT_PROJECT_ID"
    

    다음을 바꿉니다.

    • TENANT_NAMESPACE: 테넌트 프로젝트 네임스페이스의 이름
    • MAIN-PROJECT-ID: 기본 프로젝트의 프로젝트 ID
    • TENANT-PROJECT-ID: 테넌트 프로젝트의 프로젝트 ID
  2. 테넌트 프로젝트의 서비스 계정에서 로그 작성자(roles/logging.logWriter) 역할을 삭제하세요.

    export SERVICE_ACCOUNT=$(gcloud logging sinks describe gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT | \
        --format='value(writerIdentity)'
    
    gcloud projects remove-iam-policy-binding $TENANT_PROJECT \
        --member=$SERVICE_ACCOUNT \
        --role='roles/logging.logWriter' \
        --all
    
  3. 로그 싱크를 삭제합니다.

    gcloud logging sinks delete gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT
    
  4. 네임스페이스를 삭제합니다.

    kubectl delete namespace $TENANT_NAMESPACE
    

콘솔

  1. 테넌트 프로젝트의 서비스 계정에서 로그 작성자(roles/logging.logWriter) 역할을 삭제합니다.

    1. Google Cloud 콘솔의 탐색 패널에서 IAM을 선택합니다.

      IAM으로 이동

    2. 삭제할 서비스 계정에서 주 구성원 수정을 클릭합니다.
    3. 액세스 수정 패널에서 로그 작성자 역할 옆에 있는 역할 삭제를 클릭하고 저장을 클릭합니다.
  2. 기본 프로젝트에서 로그 싱크를 삭제합니다.

    1. Google Cloud 콘솔 프로젝트 선택도구를 사용하여 테넌트 GKE 프로젝트를 선택합니다.
    2. Google Cloud 콘솔의 탐색 패널에서 Logging을 선택한 후 로그 라우터를 선택합니다.

      로그 라우터로 이동

    3. 삭제할 싱크에서 더보기를 클릭합니다.
    4. 싱크 삭제를 선택합니다.
    5. 확인 패널에서 삭제를 클릭합니다.

제한사항

멀티 테넌트 로깅에는 다음과 같은 제한사항이 있습니다.

  • 프로젝트당 로그 싱크 수의 할당량은 200개입니다. 테넌트가 200개 넘게 필요하면 지원 케이스를 열어 할당량 증가를 요청하세요.
  • 로그 버킷당 제외 필터는 50개로 제한됩니다. 테넌트가 50개를 초과하면 _Default 버킷의 제외 필터 방식을 수정해야 합니다. 대신 다음을 수행할 수 있습니다.

    • 다음 명령어를 사용하여 시스템 이외의 또는 기본이 아닌 모든 네임스페이스를 제외하는 단일 제외 필터를 만듭니다.

      gcloud logging sinks update _Default \
      --project=$MAIN_PROJECT \
      --add-exclusion="name=gke-all-tenant-default-exclusion,description=\"Exclusion filter on the _Default bucket for all tenants\",filter=resource.labels.namespace_name !~ \"kube\" AND resource.labels.namespace_name !~ \"system\ AND resource.labels.namespace_name != \"Default\""
      
    • 제외 필터를 만들지 않고 테넌트 프로젝트와 기본 프로젝트 간 로그를 복제합니다.

다음 단계