Menyiapkan logging multi-tenant

Halaman ini menjelaskan cara mengonfigurasi logging multi-tenant untuk cluster Google Kubernetes Engine (GKE).

Beberapa tim biasanya berbagi satu cluster GKE. Berbagi cluster memberikan beberapa keuntungan, termasuk penemuan layanan yang lebih mudah, keamanan yang disederhanakan, dan berarti administrator cluster memiliki lebih sedikit cluster untuk dipertahankan. Namun, setiap tim aplikasi sering kali memiliki project terpisah. Struktur ini, yang memiliki cluster GKE utama, tetapi namespace terpisah untuk setiap tim aplikasi, disebut multi-tenancy. Project tim aplikasi disebut tenant.

Dengan Google Cloud, admin cluster GKE dapat membuat sistem tempat log untuk cluster tetap berada di project GKE utama, dan log tenant didistribusikan ke project tenant. Untuk mengonfigurasi log dengan cara ini, gunakan Log Router. Log Router memberi Anda kontrol atas cara log mengalir dalam project Google Cloud Anda dan cara log dirutekan ke tujuan yang didukung.

Untuk membuat log khusus tenant, admin cluster membuat sink untuk merutekan entri log ke project setiap tenant. Di setiap project tenant, setiap tim dapat mengontrol cara log disimpan dan digunakan, seperti memantau log dengan mengonfigurasi metrik berbasis log dan pemberitahuan berbasis log.

Sebaiknya sink _Default di project GKE utama menyertakan filter pengecualian. Filter pengecualian mencegah log tenant di-ingest di project GKE utama dan project tenant.

Prasyarat

Mengonfigurasi logging multi-tenant

Anda dapat mengonfigurasi logging multi-tenant menggunakan Google Cloud CLI atau Google Cloud konsol.

gcloud

Untuk mengonfigurasi logging multi-tenant untuk cluster GKE, selesaikan langkah-langkah berikut:

  1. Tetapkan variabel lingkungan berikut:

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

    Ganti kode berikut:

    • TENANT_NAMESPACE: nama untuk namespace project tenant
    • MAIN_PROJECT_ID: project ID untuk project utama Anda
    • TENANT_PROJECT_ID: project ID untuk project tenant Anda
  2. Buat namespace di cluster multi-tenant Anda:

    kubectl create namespace $TENANT_NAMESPACE
    
  3. Buat sink log di project GKE utama:

    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"
    

    Perintah ini membuat sink log yang mengirim semua log yang terkait dengan namespace $TENANT_NAMESPACE ke project tenant.

    Anda mungkin perlu menggunakan --log-filter yang lebih ketat. Misalnya, jika cluster dan tenant Anda memiliki namespace yang sama, tambahkan filter cluster.

    Untuk mengetahui informasi selengkapnya tentang kolom ini, lihat gcloud logging sinks create dokumentasi API.

  4. Dapatkan identitas penulis dari sink di project utama dan tetapkan ke variabel lingkungan.

    export SERVICE_ACCOUNT=$(gcloud logging sinks describe gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT \
        --format='value(writerIdentity)')
    
  5. Berikan peran Penulis Log (logging.bucketWriter) ke akun layanan yang digunakan oleh sink. Perintah berikut memberikan izin project utama untuk menulis log ke project tenant:

     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"
    

    Untuk mengetahui informasi selengkapnya tentang kolom ini, lihat gcloud projects add-iam-policy-binding dokumentasi API.

  6. Secara opsional, buat filter pengecualian untuk sink yang merutekan log ke bucket _Default project utama. Jika Anda tidak membuat filter pengecualian di bucket _Default, log yang dirutekan akan muncul di bucket _Default project utama dan bucket log tenant. Untuk membuat filter pengecualian, lakukan hal berikut:

    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\""
    

    Untuk mengetahui informasi selengkapnya tentang kolom ini, lihat gcloud logging sinks update dokumentasi API.

Konsol

Untuk menerapkan logging multi-tenant untuk GKE, selesaikan langkah-langkah berikut:

  1. Buat sink log di project utama:

    1. Gunakan Google Cloud pemilih project konsol untuk memilih project GKE utama GKE.
    2. Di Google Cloud konsol, buka halaman Log Router:

      Buka Log Router

      Jika Anda menggunakan kotak penelusuran untuk menemukan halaman ini, pilih hasil yang subjudulnya adalah Logging.

    3. Di halaman Log Router, klik Create sink.
    4. Masukkan Name dan Description untuk sink Anda, lalu klik Next.
    5. Di menu Select sink service, pilih Other project.
    6. Di kolom Sink destination, tambahkan tujuan berikut:

      logging.googleapis.com/projects/TENANT_PROJECT_ID
      

      Ganti TENANT_PROJECT_ID dengan project ID project tenant Anda.

    7. Klik Next.

    8. Di Build inclusion filter , tambahkan filter berikut:

      resource.labels.namespace_name="TENANT_NAMESPACE"
      

      Ganti TENANT_NAMESPACE dengan nama namespace project tenant Anda.

      Anda mungkin menginginkan filter penyertaan yang lebih ketat. Misalnya, jika cluster dan tenant Anda memiliki namespace yang sama, pertimbangkan untuk menambahkan klausa agar hanya menyertakan entri log untuk cluster tertentu.

    9. Klik Create sink. Sink baru Anda akan muncul dalam daftar Log Router Sinks.

  2. Salin identitas penulis sink ke papan klip Anda:

    1. Di halaman Log Router, temukan sink log.
    2. Untuk sink tersebut, klik More, lalu pilih View sink details.
    3. Di panel Sink details, temukan kolom Writer identity , lalu salin nilainya ke papan klip Anda. Hapus serviceAccount: dari nilai yang disalin.
  3. Di project tenant, berikan peran Penulis Log (roles/logging.logWriter) ke akun layanan yang digunakan oleh sink project utama. Project utama memerlukan izin ini untuk menulis log ke project tenant.

    1. Di Google Cloud konsol, buka halaman IAM:

      Buka IAM

      Jika Anda menggunakan kotak penelusuran untuk menemukan halaman ini, pilih hasil yang subjudulnya adalah IAM &Admin.

    2. Klik Grant access.
    3. Di kolom New principals, tambahkan akun layanan sink.
    4. Dari drop-down Select a role , pilih Logging , lalu pilih Logs Writer.
    5. Klik Save.
  4. Secara opsional, buat filter pengecualian di bucket _Default project utama untuk mencegah log yang dirutekan ke project tenant ditulis ke bucket log _Default di project utama:

    1. Di Google Cloud konsol, buka halaman Log Router:

      Buka Log Router

      Jika Anda menggunakan kotak penelusuran untuk menemukan halaman ini, pilih hasil yang subjudulnya adalah Logging.

    2. Di samping bucket _Default, klik More , lalu pilih Edit sink.
    3. Di bagian Choose logs to filter out of sink, klik Add exclusion.
    4. Tambahkan nama filter.
    5. Di kotak Build an exclusion filter, tambahkan hal berikut:

      resource.labels.namespace_name="TENANT_NAMESPACE"
      
    6. Klik Update sink.

Memverifikasi log tenant

Setelah mulai menggunakan workload yang menggunakan TENANT_NAMESPACE, Anda dapat memverifikasi bahwa project tenant menerima log khusus tenant:

  1. Pilih project tenant menggunakan Google Cloud pemilih project konsol.
  2. Di Google Cloud konsol, buka halaman Logs Explorer:

    Buka Logs Explorer

    Jika Anda menggunakan kotak penelusuran untuk menemukan halaman ini, pilih hasil yang subjudulnya adalah Logging.

  3. Di kolom query-editor, jalankan kueri berikut:

    resource.labels.namespace_name="TENANT_NAMESPACE"
    

    Di panel Query results, Anda akan melihat log khusus tenant yang dirutekan dari project utama.

Menggunakan log tenant

Di project tenant, setiap tim dapat mengontrol cara log dirutekan, disimpan, dan dianalisis. Setelah log dirutekan ke project tenant, setiap tim aplikasi dapat memilih untuk merutekan log mereka ke tujuan yang didukung seperti bucket Logging, atau ke tujuan pihak ketiga menggunakan Pub/Sub. Untuk mengetahui informasi tentang cara merutekan entri log, lihat Merutekan log ke tujuan yang didukung.

Setiap tim aplikasi juga dapat menyiapkan pemberitahuan berdasarkan konten log, atau metrik yang berasal dari log. Untuk mengetahui informasi selengkapnya, lihat Memantau log.

Pembersihan

Anda dapat menghapus objek yang dibuat untuk logging multi-tenant menggunakan gcloud atau Google Cloud konsol.

gcloud

Untuk menghapus objek yang dibuat untuk logging multi-tenant, selesaikan langkah-langkah berikut:

  1. Tetapkan variabel untuk menyederhanakan perintah berikut:

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

    Ganti kode berikut:

    • TENANT_NAMESPACE: nama untuk namespace project tenant
    • MAIN-PROJECT-ID: project ID untuk project utama Anda
    • TENANT-PROJECT-ID: project ID untuk project tenant Anda
  2. Hapus peran Penulis Log (roles/logging.logWriter) dari akun layanan di project tenant:

    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. Hapus sink log:

    gcloud logging sinks delete gke-$TENANT_NAMESPACE-sink \
        --project=$MAIN_PROJECT
    
  4. Hapus namespace:

    kubectl delete namespace $TENANT_NAMESPACE
    

Konsol

  1. Di project tenant, hapus peran Penulis Log (roles/logging.logWriter) dari akun layanan:

    1. Di Google Cloud konsol, buka halaman IAM:

      Buka IAM

      Jika Anda menggunakan kotak penelusuran untuk menemukan halaman ini, pilih hasil yang subjudulnya adalah IAM &Admin.

    2. Untuk akun layanan yang ingin dihapus, klik Edit principal.
    3. Di panel Edit access , klik Delete role di samping peran Penulis Log, lalu klik Save.
  2. Di project utama, hapus sink log:

    1. Gunakan Google Cloud pemilih project konsol untuk memilih project GKE tenant.
    2. Di Google Cloud konsol, buka halaman Log Router:

      Buka Log Router

      Jika Anda menggunakan kotak penelusuran untuk menemukan halaman ini, pilih hasil yang subjudulnya adalah Logging.

    3. Untuk sink yang ingin dihapus, klik More.
    4. Pilih Delete sink.
    5. Di panel konfirmasi, klik Delete.

Batasan

Logging multi-tenant memiliki batasan berikut:

  • Kuota untuk jumlah sink log per project adalah 200. Jika Anda memerlukan lebih dari 200 tenant, minta penambahan kuota dengan membuka kasus dukungan.
  • Ada batas 50 filter pengecualian per bucket log. Jika Anda ingin memiliki lebih dari 50 tenant, pendekatan filter pengecualian untuk bucket _Default harus direvisi. Sebagai alternatif, Anda dapat melakukan hal berikut:

    • Buat satu filter pengecualian yang mengecualikan semua namespace non-sistem atau non-default menggunakan perintah ini:

      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\""
      
    • Duplikat log antara project tenant dan project utama dengan tidak membuat filter pengecualian.

Langkah berikutnya