GKE의 멀티 테넌트 로깅

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

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

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

테넌트별 로그를 만들려면 클러스터 관리자는 싱크를 만들어 로그 항목을 테넌트의 프로젝트에서 생성된 로그 버킷으로 내보냅니다. 원하는 경우 제외 규칙을 만들어서 테넌트 로그가 기본 GKE 프로젝트에 저장되지 않도록 할 수도 있습니다.

다음 다이어그램은 로그 버킷을 사용하는 멀티 테넌트 로깅 아키텍처 개요를 제공합니다.

GKE 멀티 테넌트 아키텍처

이 아키텍처에는 다음이 포함됩니다.

  1. 각 테넌트 프로젝트에서 생성된 로그 버킷
  2. 각 테넌트 네임스페이스에 대해 생성된 로그 싱크
  3. 각 로그 싱크에 대해 자동으로 생성된 서비스 계정
  4. 선택적으로 기본 GKE 프로젝트의 로그 중복을 방지하는 제외 규칙

다음 섹션에서는 이러한 아키텍처를 만드는 방법을 안내합니다.

기본 요건

멀티 테넌트 로깅 구성

gcloud 명령줄 도구 또는 Google Cloud Console을 사용하여 멀티 테넌트 로깅을 구성할 수 있습니다.

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. 테넌트 프로젝트에서 로그 버킷을 만듭니다.

    gcloud logging buckets create gke-$TENANT_NAMESPACE-log-bucket \
        --project=$TENANT_PROJECT \
        --location=global \
        --description="Log bucket for $TENANT_NAMESPACE namespace from $MAIN_PROJECT"
    

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

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

    gcloud logging sinks create gke-$TENANT_NAMESPACE-sink \
    logging.googleapis.com/projects/$TENANT_PROJECT/locations/global/buckets/gke-$TENANT_NAMESPACE-log-bucket \
        --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 문서를 참조하세요.

  5. 기본 프로젝트의 싱크에서 서비스 계정을 가져와서 변수에 할당합니다. 다음 단계에서 권한을 부여하려면 이 서비스 계정이 필요합니다.

    export SERVICE_ACCOUNT=$(gcloud logging sinks describe gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT \
        --format='value(writerIdentity)')
    
  6. 싱크에서 사용하는 서비스 계정에 logging.bucketWriter 역할을 부여합니다. 기본 프로젝트에는 테넌트 프로젝트의 버킷에 쓸 수 있는 권한이 필요합니다.

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

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

  7. 원하는 경우 _Default 버킷에 제외 규칙을 만듭니다. 이렇게 하면 테넌트 로그가 기본 버킷에도 기록되지 않습니다. 이 명령어를 생략하면 기본 프로젝트의 _Default 버킷과 테넌트 버킷에 중복 로그가 생성됩니다.

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

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

Console

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

  1. 테넌트 프로젝트에서 로그 버킷을 만듭니다.

    1. 로그 스토리지 메뉴로 이동합니다.

      로그 스토리지로 이동

    2. 페이지 상단의 프로젝트 드롭다운을 클릭하고 테넌트 프로젝트를 선택합니다.

    3. 로그 버킷 만들기를 클릭합니다.

    4. 버킷의 이름설명을 입력하세요.

    5. 로그 버킷 리전 선택 드롭다운에서 리전을 선택합니다.

    6. 버킷 만들기를 클릭합니다. 새 버킷이 로그 버킷 목록에 나타납니다.

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

    1. 페이지 상단의 프로젝트 드롭다운을 클릭하고 기본 GKE 프로젝트를 선택합니다.
    2. 왼쪽 메뉴에서 로그 라우터를 선택합니다. 로그 라우터 페이지로 이동합니다.
    3. 싱크 만들기를 클릭합니다. 싱크 선택 창이 나타납니다.
    4. 싱크 선택 창에서 Cloud Logging 버킷을 선택합니다.
    5. 싱크의 이름설명을 입력하고 다음을 클릭합니다.
    6. 싱크 서비스 선택 드롭다운에서 기타 프로젝트를 선택합니다.
    7. 싱크 대상 위치 필드에 다음 대상을 추가합니다. logging.googleapis.com/projects/MAIN_PROJECT_ID/locations/LOG_BUCKET_REGION/buckets/BUCKET_NAME

      다음을 바꿉니다.

      • MAIN_PROJECT_ID: 기본 프로젝트의 프로젝트 ID
      • LOG_BUCKET_REGION: 로그 버킷을 만든 리전
      • BUCKET_NAME: 이전 섹션에서 만든 로그 버킷의 이름
    8. 다음을 클릭합니다.

    9. 포함 필터 만들기에서 resource.labels.namespace_name="TENANT_NAMESPACE" 필터를 추가합니다. TENANT_NAMESPACE를 테넌트 프로젝트의 네임스페이스 이름으로 바꿉니다.

      경우에 따라 더 제한적인 포함 필터를 사용해야 할 수 있습니다. 예를 들어 클러스터와 테넌트의 네임스페이스가 동일한 경우 클러스터 필터를 추가할 수 있습니다.

    10. 싱크 만들기를 클릭합니다. 새 싱크가 로그 라우팅 싱크 목록에 나타납니다.

  3. 기본 프로젝트의 싱크에서 서비스 계정을 가져옵니다. 다음 단계에서 권한을 부여하려면 이 서비스 계정이 필요합니다.

    1. 로그 라우터 페이지에서 기본 프로젝트의 로그 싱크를 찾습니다.
    2. 싱크 옆에 있는 더보기 를 클릭하고 싱크 세부정보 보기를 선택합니다.
    3. Writer Identity: serviceAccount: 옆의 값을 복사합니다.
  4. 테넌트의 싱크가 사용하는 서비스 계정에 로그 버킷 작성자 역할을 부여합니다. 기본 프로젝트에는 테넌트 프로젝트의 버킷에 쓸 수 있는 권한이 필요합니다.

    1. Cloud Console에서 IAM 페이지로 이동합니다.

      IAM으로 이동

    2. 추가를 클릭합니다.

    3. 새 구성원 필드에 싱크의 서비스 계정을 추가합니다.

    4. 역할 선택 드롭다운에서 로깅을 선택하고 로그 버킷 작성자를 선택합니다.

    5. 저장을 클릭합니다.

  5. 원하는 경우 _Default 버킷에 제외 규칙을 만듭니다. 이렇게 하면 테넌트 로그가 기본 버킷에도 기록되지 않습니다. 이 명령어를 생략하면 기본 프로젝트의 _Default 버킷과 테넌트 버킷에 중복 로그가 생성됩니다.

    1. Cloud Console에서 로그 라우터 페이지로 이동합니다.

      로그 라우터로 이동

    2. _Default 버킷 옆의 더보기를 클릭하고 싱크 수정을 선택합니다.

    3. 싱크를 필터링할 로그 선택 섹션에서 제외 추가를 클릭합니다.

    4. 필터 이름을 추가합니다.

    5. 제외 필터 만들기 상자에서 resource.labels.namespace_name=\"TENANT_NAMESPACE"\를 추가합니다.

    6. 싱크 업데이트를 클릭합니다.

테넌트 로그 확인

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

  1. 테넌트 프로젝트에서 Cloud Console의 로그 뷰어 페이지로 이동합니다.

    로그 뷰어로 이동

  2. 범위 상세검색을 클릭합니다.

  3. 스토리지별 범위를 선택하고 테넌트의 버킷을 선택합니다.

    gke-TENANT_NAMESPACE-log-bucket
    

삭제

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

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. 기본 프로젝트에서 제외 규칙을 만든 경우, 이를 삭제합니다.

    gcloud logging sinks update _Default \
       --project=$MAIN_PROJECT \
       --remove-exclusions=gke-$TENANT_NAMESPACE-default-exclusion
    
  3. 서비스 계정에서 bucketWriter 역할을 삭제합니다.

    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.bucketWriter' \
        --all
    
  4. 로그 싱크를 삭제합니다.

    gcloud logging sinks delete gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT
    
  5. 로그 버킷을 삭제합니다.

    gcloud logging buckets delete gke-$TENANT_NAMESPACE-log-bucket \
        --project=$TENANT_PROJECT \
        --location=global
    
  6. 네임스페이스를 삭제합니다.

    kubectl delete namespace $TENANT_NAMESPACE
    

Console

  1. 기본 프로젝트에서 제외 규칙을 만든 경우, 이를 삭제합니다.

    1. Cloud Console에서 로그 라우터 페이지로 이동합니다.

      로그 라우터로 이동

    2. _Default 버킷 옆의 더보기 를 클릭합니다.

    3. 싱크 수정을 선택합니다.

    4. 만든 제외 규칙 옆의 삭제를 클릭합니다.

    5. 싱크 업데이트를 클릭합니다.

  2. 기본 프로젝트에서 서비스 계정을 삭제합니다.

    1. Cloud Console에서 IAM 페이지로 이동합니다.

      IAM으로 이동

    2. 싱크의 서비스 계정을 선택합니다.

    3. 삭제를 클릭합니다.

    4. 확인 창에서 확인을 클릭합니다.

  3. 테넌트 프로젝트에서 로그 싱크를 삭제합니다.

    1. 페이지 상단의 프로젝트 드롭다운을 클릭하고 테넌트 GKE 프로젝트를 선택합니다.
    2. Logging 메뉴에서 로그 라우터를 선택합니다.

      로그 라우터로 이동

    3. 삭제할 싱크에서 더보기를 클릭합니다.

    4. 싱크 삭제를 선택합니다.

    5. 확인 패널에서 삭제를 클릭합니다.

  4. 기본 프로젝트에서 로그 버킷을 삭제합니다.

    1. 페이지 상단의 프로젝트 드롭다운을 클릭하고 기본 GKE 프로젝트를 선택합니다.
    2. 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 rule 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\""
      
    • 제외 규칙을 만들지 않고 테넌트 프로젝트와 기본 프로젝트 간 로그를 복제합니다.

다음 단계