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 dikelola. Namun, setiap tim aplikasi sering kali memiliki project terpisahnya sendiri. 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 dan cara log dirutekan ke tujuan yang didukung.

Untuk membuat log khusus tenant, admin cluster membuat sink untuk merutekan entri log ke setiap project 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 diserap di project GKE utama dan project tenant.

Prasyarat

Mengonfigurasi logging multi-tenant

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

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 informasi selengkapnya tentang kolom ini, lihat dokumentasi gcloud logging sinks create 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 Logs Writer (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 informasi selengkapnya tentang kolom ini, lihat dokumentasi gcloud projects add-iam-policy-binding API.

  6. Atau, 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 tindakan 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 informasi selengkapnya tentang kolom ini, lihat dokumentasi gcloud logging sinks update API.

Konsol

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

  1. Buat sink log di project utama:

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

      Buka Router Log

      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 Berikutnya.

    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, saat cluster dan tenant Anda memiliki namespace yang sama, pertimbangkan untuk menambahkan klausa untuk hanya menyertakan entri log untuk cluster tertentu.

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

  2. Salin identitas penulis sink ke papan klip:

    1. Di halaman Log Router, temukan sink log.
    2. Untuk sink tersebut, klik Lainnya, lalu pilih Lihat detail sink.
    3. Di panel Sink details, temukan kolom Writer identity, lalu salin nilainya ke papan klip. Hapus serviceAccount: dari nilai yang disalin.
  3. Dalam project tenant, berikan peran Logs Writer (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 konsol Google Cloud , 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 dan pilih Logs Writer.
    5. Klik Simpan.
  4. Secara opsional, buat filter pengecualian di bucket _Default project utama untuk mencegah log yang dirutekan ke project tenant agar tidak ditulis ke bucket log _Default di project utama:

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

      Buka Router Log

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

    2. Di samping bucket _Default, klik Lainnya, 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 pemilih project konsol Google Cloud .
  2. Di konsol Google Cloud , 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 editor kueri, 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

Dalam 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 dengan menggunakan Pub/Sub. Untuk informasi tentang 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 konsol gcloud atau Google Cloud .

gcloud

Untuk menghapus objek yang Anda buat 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 Logs Writer (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 Logs Writer (roles/logging.logWriter) dari akun layanan:

    1. Di konsol Google Cloud , 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 Anda hapus, klik Edit akun utama.
    3. Di panel Edit akses, klik Hapus peran di samping peran Penulis Log, lalu klik Simpan.
  2. Di project utama, hapus sink log:

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

      Buka Router Log

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

    3. Untuk sink yang ingin dihapus, klik Lainnya.
    4. Pilih Hapus sink.
    5. Di panel konfirmasi, klik Hapus.

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 perlu direvisi. Atau, 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\""
      
    • Duplikasi log antara project tenant dan project utama dengan tidak membuat filter pengecualian.

Langkah selanjutnya