Halaman ini menunjukkan cara menyelidiki dan menyelesaikan masalah terkait logging GKE.
Jika Anda memerlukan bantuan tambahan, hubungi Cloud Customer Care.Log cluster tidak ada di Cloud Logging
Memastikan logging diaktifkan dalam project
Cantumkan layanan yang diaktifkan:
gcloud services list --enabled --filter="NAME=logging.googleapis.com"
Output berikut menunjukkan bahwa logging diaktifkan untuk project ini:
NAME TITLE logging.googleapis.com Cloud Logging API
Opsional: Periksa log di Logs Viewer untuk mengetahui siapa yang menonaktifkan API dan kapan mereka menonaktifkan API:
protoPayload.methodName="google.api.serviceusage.v1.ServiceUsage.DisableService" protoPayload.response.services="logging.googleapis.com"
Jika logging dinonaktifkan, aktifkan logging:
gcloud services enable logging.googleapis.com
Memastikan logging diaktifkan di cluster
Cantumkan cluster:
gcloud container clusters list \ --project=PROJECT_ID \ '--format=value(name,loggingConfig.componentConfig.enableComponents)' \ --sort-by=name | column -t
Ganti kode berikut:
PROJECT_ID
: Google Cloud Project ID Anda.
Outputnya mirip dengan hal berikut ini:
cluster-1 SYSTEM_COMPONENTS cluster-2 SYSTEM_COMPONENTS;WORKLOADS cluster-3
Jika nilai cluster Anda kosong, logging akan dinonaktifkan. Misalnya,
cluster-3
dalam output ini menonaktifkan logging.Aktifkan logging cluster jika ditetapkan ke
NONE
:gcloud container clusters update CLUSTER_NAME \ --logging=SYSTEM,WORKLOAD \ --location=COMPUTE_LOCATION
Ganti kode berikut:
CLUSTER_NAME
: nama cluster Anda.COMPUTE_LOCATION
: Lokasi Compute Engine untuk cluster Anda.
Memastikan node di node pool memiliki cakupan akses Cloud Logging
Salah satu cakupan berikut diperlukan bagi node untuk menulis log ke Cloud Logging:
https://www.googleapis.com/auth/logging.write
https://www.googleapis.com/auth/cloud-platform
https://www.googleapis.com/auth/logging.admin
Periksa cakupan yang dikonfigurasi pada setiap node pool di cluster:
gcloud container node-pools list --cluster=CLUSTER_NAME \ --format="table(name,config.oauthScopes)" \ --location COMPUTE_LOCATION
Ganti kode berikut:
CLUSTER_NAME
: nama cluster Anda.COMPUTE_LOCATION
: Lokasi Compute Engine untuk cluster Anda.
Migrasikan workload Anda dari node pool lama ke node pool yang baru dibuat dan pantau progresnya.
Buat node pool baru dengan cakupan logging yang benar:
gcloud container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location=COMPUTE_LOCATION \ --scopes="gke-default"
Ganti kode berikut:
CLUSTER_NAME
: nama cluster Anda.COMPUTE_LOCATION
: Lokasi Compute Engine untuk cluster Anda.
Mengidentifikasi cluster dengan akun layanan node yang tidak memiliki izin penting
Untuk mengidentifikasi cluster dengan akun layanan node yang tidak memiliki izin penting, gunakan rekomendasi GKE dari subjenis perekomendasikan NODE_SA_MISSING_PERMISSIONS
:
- Menggunakan Konsol Google Cloud. Buka halaman Cluster Kubernetes dan periksa rekomendasi Berikan izin penting di kolom Notifikasi untuk cluster tertentu.
Gunakan gcloud CLI atau Recommender API, dengan menentukan subjenis recommender
NODE_SA_MISSING_PERMISSIONS
.Untuk membuat kueri rekomendasi, jalankan perintah berikut:
gcloud recommender recommendations list \ --recommender=google.container.DiagnosisRecommender \ --location LOCATION \ --project PROJECT_ID \ --format yaml \ --filter="recommenderSubtype:NODE_SA_MISSING_PERMISSIONS"
Perhatikan bahwa mungkin diperlukan waktu hingga 24 jam agar rekomendasi muncul. Untuk mendapatkan petunjuk mendetail, lihat cara melihat insight dan rekomendasi.
Untuk menerapkan rekomendasi ini, berikan peran roles/container.defaultNodeServiceAccount
ke akun layanan node.
Anda dapat mengikuti skrip ini untuk menemukan semua akun layanan node yang tidak memiliki izin penting untuk cluster mode Standar dalam project.
#!/bin/bash
# Set your project ID
project_id=PROJECT_ID
project_number=$(gcloud projects describe "$project_id" --format="value(projectNumber)")
declare -a all_service_accounts
declare -a sa_missing_permissions
# Function to check if a service account has a specific permission
# $1: project_id
# $2: service_account
# $3: permission
service_account_has_permission() {
local project_id="$1"
local service_account="$2"
local permission="$3"
local roles=$(gcloud projects get-iam-policy "$project_id" \
--flatten="bindings[].members" \
--format="table[no-heading](bindings.role)" \
--filter="bindings.members:\"$service_account\"")
for role in $roles; do
if role_has_permission "$role" "$permission"; then
echo "Yes" # Has permission
return
fi
done
echo "No" # Does not have permission
}
# Function to check if a role has the specific permission
# $1: role
# $2: permission
role_has_permission() {
local role="$1"
local permission="$2"
gcloud iam roles describe "$role" --format="json" | \
jq -r ".includedPermissions" | \
grep -q "$permission"
}
echo "--- 1. List all service accounts in all GKE node pools"
printf "%-60s| %-40s| %-40s| %-10s| %-20s\n" "service_account" "project_id" "cluster_name" "cluster_location" "nodepool_name"
while read cluster; do
cluster_name=$(echo "$cluster" | awk '{print $1}')
cluster_location=$(echo "$cluster" | awk '{print $2}')
while read nodepool; do
nodepool_name=$(echo "$nodepool" | awk '{print $1}')
while read nodepool_details; do
service_account=$(echo "$nodepool_details" | awk '{print $1}')
if [[ "$service_account" == "default" ]]; then
service_account="${project_number}-compute@developer.gserviceaccount.com"
fi
if [[ -n "$service_account" ]]; then
printf "%-60s| %-40s| %-40s| %-10s| %-20s\n" $service_account $project_id $cluster_name $cluster_location $nodepool_name
all_service_accounts+=( ${service_account} )
else
echo "cannot find service account" for node pool "$project_id\t$cluster_name\t$cluster_location\t$nodepool_details"
fi
done <<< "$(gcloud container node-pools describe "$nodepool_name" --cluster "$cluster_name" --zone "$cluster_location" --project "$project_id" --format="table[no-heading](config.serviceAccount)")"
done <<< "$(gcloud container node-pools list --cluster "$cluster_name" --zone "$cluster_location" --project "$project_id" --format="table[no-heading](name)")"
done <<< "$(gcloud container clusters list --project "$project_id" --format="value(name,location)")"
echo "--- 2. Check if service accounts have permissions"
unique_service_accounts=($(echo "${all_service_accounts[@]}" | tr ' ' '\n' | sort -u | tr '\n' ' '))
echo "Service accounts: ${unique_service_accounts[@]}"
printf "%-60s| %-40s| %-40s| %-20s\n" "service_account" "has_logging_permission" "has_monitoring_permission" "has_performance_hpa_metric_write_permission"
for sa in "${unique_service_accounts[@]}"; do
logging_permission=$(service_account_has_permission "$project_id" "$sa" "logging.logEntries.create")
monitoring_permission=$(service_account_has_permission "$project_id" "$sa" "monitoring.timeSeries.create")
performance_hpa_metric_write_permission=$(service_account_has_permission "$project_id" "$sa" "autoscaling.sites.writeMetrics")
printf "%-60s| %-40s| %-40s| %-20s\n" $sa $logging_permission $monitoring_permission $performance_hpa_metric_write_permission
if [[ "$logging_permission" == "No" || "$monitoring_permission" == "No" || "$performance_hpa_metric_write_permission" == "No" ]]; then
sa_missing_permissions+=( ${sa} )
fi
done
echo "--- 3. List all service accounts that don't have the above permissions"
if [[ "${#sa_missing_permissions[@]}" -gt 0 ]]; then
printf "Grant roles/container.defaultNodeServiceAccount to the following service accounts: %s\n" "${sa_missing_permissions[@]}"
else
echo "All service accounts have the above permissions"
fi
Mengidentifikasi akun layanan node yang tidak memiliki izin penting di cluster
GKE menggunakan akun layanan IAM yang dilampirkan ke node Anda untuk
menjalankan tugas sistem seperti logging dan pemantauan. Setidaknya, akun layanan node ini
harus memiliki
peran Akun Layanan Node Default Kubernetes Engine
(roles/container.defaultNodeServiceAccount
) di project Anda. Secara default, GKE menggunakan akun layanan default Compute Engine, yang dibuat secara otomatis di project Anda, sebagai akun layanan node.
Jika organisasi Anda menerapkan batasan kebijakan organisasi iam.automaticIamGrantsForDefaultServiceAccounts
, akun layanan Compute Engine default di project Anda mungkin tidak otomatis mendapatkan izin yang diperlukan untuk GKE.
Untuk mengidentifikasi masalah, periksa error
401
dalam beban kerja logging sistem di cluster Anda:[[ $(kubectl logs -l k8s-app=fluentbit-gke -n kube-system -c fluentbit-gke | grep -cw "Received 401") -gt 0 ]] && echo "true" || echo "false"
Jika outputnya adalah
true
, berarti beban kerja sistem mengalami error 401, yang menunjukkan kurangnya izin. Jika outputnya adalahfalse
, lewati langkah-langkah lainnya dan coba prosedur pemecahan masalah yang berbeda.
-
Temukan nama akun layanan yang digunakan node Anda:
console
- Buka halaman Cluster Kubernetes:
- Dalam daftar cluster, klik nama cluster yang ingin diperiksa.
- Bergantung pada mode operasi cluster, lakukan salah satu hal berikut:
- Untuk cluster mode Autopilot, di bagian Keamanan, temukan kolom Service account.
- Untuk cluster mode Standar, lakukan hal berikut:
- Klik tab Nodes.
- Di tabel Node pool, klik nama node pool. Halaman Detail node pool akan terbuka.
- Di bagian Keamanan, temukan kolom Service account.
Jika nilai di kolom Service account adalah
default
, node Anda akan menggunakan akun layanan default Compute Engine. Jika nilai di kolom ini bukandefault
, node Anda menggunakan akun layanan kustom. Untuk memberikan peran yang diperlukan ke akun layanan kustom, lihat Menggunakan akun layanan IAM dengan hak istimewa terendah.gcloud
Untuk cluster mode Autopilot, jalankan perintah berikut:
gcloud container clusters describe
CLUSTER_NAME
\ --location=LOCATION
\ --flatten=autoscaling.autoprovisioningNodePoolDefaults.serviceAccountUntuk cluster mode Standar, jalankan perintah berikut:
gcloud container clusters describe
CLUSTER_NAME
\ --location=LOCATION
\ --format="table(nodePools.name,nodePools.config.serviceAccount)"Jika outputnya adalah
default
, node Anda akan menggunakan akun layanan default Compute Engine. Jika outputnya bukandefault
, node Anda menggunakan akun layanan kustom. Untuk memberikan peran yang diperlukan ke akun layanan kustom, lihat Menggunakan akun layanan IAM dengan hak istimewa terendah. -
Untuk memberikan peran
roles/container.defaultNodeServiceAccount
ke akun layanan default Compute Engine, selesaikan langkah-langkah berikut:console
- Buka halaman Sambutan:
- Di kolom Project number, klik Copy to clipboard.
- Buka halaman IAM:
- Klik Berikan akses.
- Di kolom Akun utama baru, tentukan nilai berikut:
GantiPROJECT_NUMBER-compute@developer.gserviceaccount.com
PROJECT_NUMBER
dengan nomor project yang Anda salin. - Di menu Select a role, pilih peran Kubernetes Engine Default Node Service Account.
- Klik Simpan.
gcloud
- Temukan Google Cloud nomor project Anda:
gcloud projects describe PROJECT_ID \ --format="value(projectNumber)"
Ganti
PROJECT_ID
dengan project ID Anda.Outputnya mirip dengan hal berikut ini:
12345678901
- Berikan peran
roles/container.defaultNodeServiceAccount
ke akun layanan default Compute Engine:gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \ --role="roles/container.defaultNodeServiceAccount"
Ganti
PROJECT_NUMBER
dengan nomor project dari langkah sebelumnya.
Memverifikasi bahwa kuota API penulisan Cloud Logging belum tercapai
Pastikan Anda belum mencapai kuota penulisan API untuk Cloud Logging.
Buka halaman Quotas di Konsol Google Cloud.
Filter tabel berdasarkan "Cloud Logging API".
Pastikan Anda belum mencapai batas kuota.
Men-debug masalah logging GKE dengan gcpdiag
Jika Anda tidak memiliki atau mendapatkan log yang tidak lengkap dari cluster GKE, gunakan alatgcpdiag
untuk pemecahan masalah.
gcpdiag
adalah alat open source. Ini bukan produk Google Cloud yang didukung secara resmi.
Anda dapat menggunakan alat gcpdiag
untuk membantu mengidentifikasi dan memperbaiki masalah project Google Cloud. Untuk mengetahui informasi selengkapnya, lihat
project gcpdiag di GitHub.
- Logging Tingkat Project: Memastikan bahwa project Google Cloud yang menghosting cluster GKE telah mengaktifkan Cloud Logging API.
- Logging Tingkat Cluster: Memverifikasi bahwa logging diaktifkan secara eksplisit dalam konfigurasi cluster GKE.
- Izin Node Pool: Mengonfirmasi bahwa node dalam node pool cluster telah mengaktifkan cakupan 'Cloud Logging Write', sehingga node tersebut dapat mengirim data log.
- Izin Akun Layanan: Memvalidasi bahwa akun layanan yang digunakan oleh node pool memiliki izin IAM yang diperlukan untuk berinteraksi dengan Cloud Logging. Secara khusus, peran 'roles/logging.logWriter' biasanya diperlukan.
- Kuota Tulis Cloud Logging API: Memverifikasi bahwa kuota Tulis Cloud Logging API belum terlampaui dalam jangka waktu yang ditentukan.
Konsol Google Cloud
- Selesaikan, lalu salin perintah berikut.
- Buka konsol Google Cloud dan aktifkan Cloud Shell. Buka Cloud Console
- Tempel perintah yang disalin.
- Jalankan perintah
gcpdiag
, yang mendownload image dockergcpdiag
, lalu melakukan pemeriksaan diagnostik. Jika berlaku, ikuti petunjuk output untuk memperbaiki pemeriksaan yang gagal.
gcpdiag runbook gke/logs \
--parameter project_id=PROJECT_ID \
--parameter name=GKE_NAME \
--parameter location=LOCATION
Docker
Anda dapat
menjalankan gcpdiag
menggunakan wrapper yang memulai gcpdiag
dalam
penampung Docker. Docker atau
Podman harus diinstal.
- Salin dan jalankan perintah berikut di workstation lokal Anda.
curl https://gcpdiag.dev/gcpdiag.sh >gcpdiag && chmod +x gcpdiag
- Jalankan perintah
gcpdiag
../gcpdiag runbook gke/logs \ --parameter project_id=PROJECT_ID \ --parameter name=GKE_NAME \ --parameter location=LOCATION
Lihat parameter yang tersedia untuk runbook ini.
Ganti kode berikut:
- PROJECT_ID: ID project yang berisi resource.
- GKE_NAME: Nama cluster GKE.
- LOCATION: Zona atau region cluster GKE.
Flag yang berguna:
--universe-domain
: Jika berlaku, domain Trusted Partner Sovereign Cloud yang menghosting resource--parameter
atau-p
: Parameter runbook
Untuk mengetahui daftar dan deskripsi semua flag alat gcpdiag
, lihat
petunjuk penggunaan gcpdiag
.