Menyiapkan logging multi-tenant


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

Bukan hal yang aneh bagi beberapa tim untuk berbagi satu cluster GKE. Berbagi cluster memberikan banyak keuntungan, termasuk penemuan layanan yang lebih mudah, keamanan yang disederhanakan, dan artinya administrator cluster memiliki lebih sedikit cluster yang harus dikelola. Namun, tim aplikasi individual sering kali memiliki project-nya 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 Router Log. Router Log memberi Anda kontrol atas alur log dalam project Google Cloud dan cara log dirutekan ke tujuan yang didukung.

Untuk membuat log khusus tenant, admin cluster akan membuat sink untuk merutekan entri log ke project setiap tenant. Di setiap project tenant, masing-masing 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 dengan menggunakan Google Cloud CLI atau Google Cloud Console.

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: ID project 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 mengirimkan 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 dokumentasi API gcloud logging sinks create.

  4. Mendapatkan identitas penulis dari sink dalam project utama dan menetapkannya 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 mengetahui informasi selengkapnya tentang kolom ini, lihat dokumentasi API gcloud projects add-iam-policy-binding.

  6. Jika ingin, 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 dari project utama dan bucket log tenant. Untuk membuat filter pengecualian, lakukan langkah 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 dokumentasi API gcloud logging sinks update.

Konsol

Untuk mengimplementasikan 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. Pada panel navigasi Google Cloud Console, pilih Logging, lalu pilih Log Router:

      Buka Router Log

    3. Di halaman Router Log, 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 filter penyertaan, 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, sebaiknya tambahkan klausa untuk hanya menyertakan entri log untuk cluster tertentu.

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

  2. Salin identitas penulis sink ke papan klip Anda:

    1. Di halaman Router Log, 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. 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. Pada panel navigasi Konsol Google Cloud, pilih IAM:

      Buka IAM

    2. Klik Berikan akses.
    3. Di kolom New principals, tambahkan akun layanan sink.
    4. Dari drop-down Select a role, pilih Logging, lalu 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 ditulis ke bucket log _Default di project utama:

    1. Pada panel navigasi Google Cloud Console, pilih Logging, lalu pilih Log Router:

      Buka Router Log

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

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

Memverifikasi log tenant

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

  1. Pilih project tenant dengan menggunakan pemilih project Google Cloud Console.
  2. Pada panel navigasi Google Cloud Console, pilih Logging, lalu pilih Logs Explorer:

    Buka Logs Explorer

  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

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 menggunakan Pub/Sub. Untuk mengetahui informasi tentang cara mengarahkan 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 informasi lebih lanjut, lihat Memantau log Anda.

Pembersihan

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

gcloud

Guna 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: ID project 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. Dalam project tenant, hapus peran Logs Writer (roles/logging.logWriter) dari akun layanan:

    1. Pada panel navigasi Konsol Google Cloud, pilih IAM:

      Buka IAM

    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. Dalam project utama, hapus sink log:

    1. Gunakan pemilih project Konsol Google Cloud untuk memilih project GKE tenant.
    2. Pada panel navigasi Google Cloud Console, pilih Logging, lalu pilih Log Router:

      Buka Router Log

    3. Untuk sink yang ingin Anda hapus, 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. 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\""
      
    • Log duplikat antara project tenant dan project utama dengan tidak membuat filter pengecualian.

Langkah selanjutnya