Dokumen ini menjelaskan masalah umum Anthos Service Mesh dan cara menyelesaikannya, seperti saat pod dimasukkan dengan istio.istio-system
, alat penginstalan akan menghasilkan error seperti kode status HTTP 400
dan error keanggotaan cluster.
Jika Anda memerlukan bantuan tambahan untuk memecahkan masalah Anthos Service Mesh, lihat Mendapatkan dukungan.
Revisi melaporkan sebagai error yang tidak responsif
Anda mungkin melihat error Revision(s) reporting unhealthy
umum jika Anthos Service Mesh terkelola tidak memiliki Akun Layanan yang dikelola Google yang diperlukan dengan binding peran Identity and Access Management (IAM) Anthos Service Mesh. Umumnya, hal ini terjadi jika izin untuk peran Anthos Service Mesh Service Agent dicabut melalui konfigurasi ulang Terraform, Puppet, atau CI/CD.
Langkah-langkah yang diperlukan untuk memecahkan masalah ini bergantung pada apakah Anda menggunakan konsol Google Cloud atau Google Cloud CLI.
Konsol Google Cloud
Di Konsol Google Cloud, buka IAM & Admin > IAM.
Pilih Sertakan pemberian peran yang disediakan Google.
Tinjau daftar Akun Utama.
Jika Anda melihat Akun Layanan terkelola dengan peran IAM yang diperlukan dalam daftar, berarti akun tersebut telah dikonfigurasi dengan benar.
Jika Anda tidak melihat Akun Layanan terkelola yang diperlukan dengan peran IAM yang diperlukan dalam daftar, berarti binding peran IAM Service Mesh Service Agent Anthos yang diperlukan tidak ada di Akun Layanan terkelola.
Memberikan binding peran IAM Anthos Service Mesh Service Agent (
roles/anthosservicemesh.serviceAgent
) ke Akun Layanan terkelola Anthos Service Mesh di Konsol Google Cloud.
Google Cloud CLI
Di Google Cloud CLI, jalankan perintah berikut untuk memeriksa apakah peran IAM yang diperlukan sudah dikonfigurasi:
gcloud projects get-iam-policy PROJECT_ID \ --flatten="bindings[].members" \ --filter="bindings.members:serviceAccount:service-PROJECT_NUMBER@gcp-sa-servicemesh.iam.gserviceaccount.com AND bindings.role:roles/anthosservicemesh.serviceAgent" \ --format='table(bindings.role)'
Tinjau daftar
ROLE
.Jika Anda melihat peran dalam daftar, berarti peran tersebut telah dikonfigurasi dengan benar.
Jika Anda tidak melihat peran apa pun dalam daftar, berarti semua peran Akun Layanan terkelola telah dicabut.
Jalankan perintah berikut untuk menetapkan binding peran IAM yang sesuai ke Akun Layanan terkelola Anthos Service Mesh:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:service-PROJECT_NUMBER@gcp-sa-servicemesh.iam.gserviceaccount.com" \ --role="roles/anthosservicemesh.serviceAgent"
Pod diinjeksi dengan istiod.istio-system
Hal ini dapat terjadi jika Anda tidak mengganti label istio-injection: enabled
.
Selain itu, verifikasi konfigurasi webhook yang bermutasi dengan menggunakan perintah berikut:
kubectl get mutatingwebhookconfiguration
...
istiod-asm-managed
…
# may include istio-sidecar-injector
kubectl get mutatingwebhookconfiguration istio-sidecar-injector -o yaml
# Run debug commands
export T=$(echo '{"kind":"TokenRequest","apiVersion":"authentication.k8s.io/v1","spec":{"audiences":["istio-ca"], "expirationSeconds":2592000}}' | kubectl create --raw /api/v1/namespaces/default/serviceaccounts/default/token -f - | jq -j '.status.token')
export INJECT_URL=$(kubectl get mutatingwebhookconfiguration istiod-asmca -o json | jq -r .webhooks[0].clientConfig.url)
export ISTIOD_ADDR=$(echo $INJECT_URL | 'sed s/\/inject.*//')
curl -v -H"Authorization: Bearer $T" $ISTIOD_ADDR/debug/configz
Alat penginstalan menghasilkan error HTTP 400
Alat penginstalan mungkin menghasilkan error 400
HTTP seperti berikut:
HealthCheckContainerError, message: Cloud Run error: Container failed to start.
Failed to start and then listen on the port defined by the PORT environment
variable. Logs for this revision might contain more information.
Error ini dapat terjadi jika Anda tidak mengaktifkan Workload Identity di cluster Kubernetes, yang dapat dilakukan menggunakan perintah berikut:
export CLUSTER_NAME=...
export PROJECT_ID=...
export LOCATION=...
gcloud container clusters update $CLUSTER_NAME --zone $LOCATION \
--workload-pool=$PROJECT_ID.svc.id.goog
Status bidang data terkelola
Perintah berikut menampilkan status bidang data terkelola:
gcloud container fleet mesh describe --project PROJECT_ID
Tabel berikut mencantumkan semua kemungkinan status bidang data terkelola:
Status | Kode | Deskripsi |
---|---|---|
ACTIVE |
OK |
Bidang data terkelola berjalan normal. |
DISABLED |
DISABLED |
Bidang data terkelola akan berada dalam status ini jika tidak ada namespace atau revisi yang dikonfigurasi untuk menggunakannya. Ikuti petunjuk untuk mengaktifkan Anthos Service Mesh terkelola melalui API fleet, atau mengaktifkan bidang data terkelola setelah menyediakan Anthos Service Mesh terkelola dengan asmcli .
Perhatikan bahwa pelaporan status bidang data terkelola hanya tersedia jika Anda mengaktifkan bidang data terkelola dengan menganotasi namespace atau revisi.
Menganotasi masing-masing pod akan menyebabkan pod tersebut dikelola, tetapi dengan status fitur DISABLED jika tidak ada namespace atau revisi yang dianotasikan. |
FAILED_PRECONDITION |
MANAGED_CONTROL_PLANE_REQUIRED |
Bidang data terkelola memerlukan bidang kontrol Anthos Service Mesh terkelola yang aktif. |
PROVISIONING |
PROVISIONING |
Bidang data terkelola sedang disediakan. Jika status ini berlanjut selama lebih dari 10 menit, error kemungkinan telah terjadi dan Anda harus menghubungi Dukungan. |
STALLED |
INTERNAL_ERROR |
Bidang data terkelola diblokir agar tidak beroperasi karena kondisi error internal. Jika masalah berlanjut, hubungi Dukungan. |
NEEDS_ATTENTION |
UPGRADE_FAILURES |
Bidang data terkelola memerlukan intervensi manual untuk mengembalikan layanan ke status normal. Untuk mengetahui informasi selengkapnya dan cara menyelesaikan
masalah ini, lihat
status NEEDS_ATTENTION . |
NEEDS_ATTENTION
state
Jika perintah gcloud container fleet mesh describe
menunjukkan bahwa
status bidang data terkelola berada dalam status NEEDS_ATTENTION
dan kodenya
UPGRADE_FAILURES
, bidang data terkelola gagal mengupgrade beban kerja
tertentu. Workload ini akan diberi label dengan dataplane-upgrade: failed
oleh
layanan bidang data terkelola untuk analisis lebih lanjut. Proxy harus dimulai ulang secara manual agar dapat diupgrade. Untuk mendapatkan daftar pod yang memerlukan
perhatian, jalankan perintah berikut:
kubectl get pods --all-namespaces -l dataplane-upgrade=failed
Error keanggotaan cluster (Tidak ada penyedia identitas yang ditentukan)
Alat penginstalan mungkin gagal dengan error keanggotaan Cluster seperti berikut:
asmcli: [ERROR]: Cluster has memberships.hub.gke.io CRD but no identity
provider specified. Please ensure that an identity provider is available for the
registered cluster.
Error ini dapat terjadi jika Anda tidak mengaktifkan identitas workload GKE sebelum mendaftarkan cluster. Anda dapat mendaftarkan ulang cluster di command
line menggunakan
perintah gcloud container fleet memberships register --enable-workload-identity
.
Memeriksa status bidang kontrol yang dikelola
Untuk memeriksa status bidang kontrol yang dikelola, jalankan
gcloud container fleet mesh describe --project FLEET_PROJECT_ID
.
Dalam responsnya, kolom membershipStates[].servicemesh.controlPlaneManagement.details
mungkin
menjelaskan error tertentu.
Jika Anda memerlukan detail selengkapnya, periksa resource kustom ControlPlaneRevision
dalam cluster, yang diupdate saat bidang kontrol terkelola disediakan
atau gagal penyediaan.
Untuk memeriksa status resource, ganti NAME dengan nilai
yang sesuai dengan setiap saluran: asm-managed
, asm-managed-stable
, atau
asm-managed-rapid
.
kubectl describe controlplanerevision NAME -n istio-system
Outputnya mirip dengan:
Name: asm-managed … Status: Conditions: Last Transition Time: 2021-08-05T18:56:32Z Message: The provisioning process has completed successfully Reason: Provisioned Status: True Type: Reconciled Last Transition Time: 2021-08-05T18:56:32Z Message: Provisioning has finished Reason: ProvisioningFinished Status: True Type: ProvisioningFinished Last Transition Time: 2021-08-05T18:56:32Z Message: Provisioning has not stalled Reason: NotStalled Status: False Type: Stalled
Kondisi Reconciled
menentukan apakah bidang kontrol yang dikelola
berjalan dengan benar. Jika true
, bidang kontrol berhasil berjalan.
Stalled
menentukan apakah proses penyediaan bidang kontrol terkelola telah mengalami error. Jika Stalled
, kolom Message
akan berisi informasi
selengkapnya tentang error tertentu. Lihat
Kode macet untuk informasi selengkapnya tentang kemungkinan error.
Kode Terhenti di ControlPlaneRevision
Ada beberapa alasan kondisi Stalled
dapat menjadi benar dalam
status ControlPlaneRevisions
.
Alasan | Pesan | Deskripsi |
---|---|---|
PreconditionFailed | Hanya keanggotaan GKE yang didukung, tetapi ${CLUSTER_NAME} bukan cluster GKE. | Cluster saat ini tampaknya bukan cluster GKE. Bidang kontrol terkelola hanya berfungsi pada cluster GKE. |
Nama ControlPlaneRevision tidak didukung: ${NAME} | Nama ControlPlaneRevision harus berupa salah satu dari berikut:
|
|
Namespace ControlPlaneRevision tidak didukung: ${NAMESPACE} | Namespace ControlPlaneRevision harus istio-system . |
|
Channel ${CHANNEL} tidak didukung untuk ControlPlaneRevision dengan nama${NAME}. Diharapkan ${OTHER_CHANNEL} | Nama ControlPlaneRevision harus cocok dengan saluran ControlPlaneRevision dengan kode berikut:
|
|
Saluran tidak boleh dihilangkan atau kosong | Channel adalah kolom wajib diisi di ControlPlaneRevision. Sumber daya khusus tidak ada atau kosong. |
|
Jenis revisi bidang kontrol tidak didukung: ${TYPE} | managed_service adalah satu-satunya kolom yang diizinkan untuk kolom ControlPlaneRevisionType. |
|
Versi Kubernetes tidak didukung: ${VERSION} | Kubernetes versi 1.15+ didukung. | |
Workload Identity tidak diaktifkan | Aktifkan workload identity di cluster Anda. | |
Kumpulan beban kerja yang tidak didukung: ${POOL} | Kumpulan beban kerja harus dalam bentuk ${PROJECT_ID}.svc.id.goog . |
|
Project cluster dan project lingkungan tidak cocok | Cluster harus menjadi bagian dari project yang sama tempat cluster didaftarkan ke fleet. | |
ProvisioningFailed | Terjadi error saat memperbarui resource cluster | Google tidak dapat memperbarui resource dalam cluster seperti CRD dan webhook. |
MutatingWebhookConfiguration "istiod-asm-managed" berisi webhook dengan URL ${EXISTING_URL} tetapi yang diharapkan adalah ${SUPPORTED_URL} | Google tidak akan menimpa webhook yang ada agar penginstalan tidak terhenti. Perbarui secara manual jika ini merupakan perilaku yang diinginkan. | |
ValidatingWebhookConfiguration ${NAME} berisi webhook dengan URL ${EXISTING_URL} tetapi yang diharapkan adalah ${SUPPORTED_URL} | Google tidak akan menimpa webhook yang ada agar penginstalan tidak terhenti. Perbarui secara manual jika ini merupakan perilaku yang diinginkan. |
Anthos Service Mesh terkelola tidak dapat terhubung ke cluster GKE
Antara Juni 2022 dan September 2022, Google telah menyelesaikan tugas keamanan terkait Jaringan Resmi, Cloud Run, dan Cloud Functions di Google Kubernetes Engine (GKE). Project yang sebelumnya menggunakan Anthos Service Mesh terkelola tetapi berhenti menggunakannya sebelum migrasi tidak memiliki API yang diperlukan untuk komunikasi antara Cloud Run dan GKE.
Dalam skenario ini, penyediaan Anthos Service Mesh terkelola akan gagal dan Cloud Logging akan menampilkan pesan error berikut:
Connect Gateway API has not been used in project [*PROJECT_NUMBER*] before or it is disabled.
Enable it by visiting https://console.developers.google.com/apis/api/connectgateway.googleapis.com/overview?project=[*PROJECT_NUMBER*] then retry.
If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.
Filter pesan ini menggunakan kueri berikut:
resource.type="istio_control_plane"
resource.labels.project_id=[*PROJECT_ID*]
resource.labels.location=[*REGION*]
severity=ERROR
jsonPayload.message=~"Connect Gateway API has not been used in project"
Sementara itu, injeksi sidecar dan men-deploy resource kustom Kubernetes terkait Anthos Service Mesh juga akan gagal dan Cloud Logging akan menampilkan pesan peringatan berikut:
Error creating: Internal error occurred: failed calling webhook
"rev.namespace.sidecar-injector.istio.io": failed to call webhook: an error on
the server ("unknown") has prevented the request from succeeding.
Filter pesan ini menggunakan kueri berikut:
resource.type="k8s_cluster"
resource.labels.project_id=[*PROJECT_ID*]
resource.labels.location=[*REGION*]
resource.labels.cluster_name=[*CLUSTER_NAME*]
severity=WARNING
jsonPayload.message=~"Internal error occurred: failed calling webhook"
Untuk mengatasi masalah ini:
Aktifkan
connectgateway
API yang diperlukan:gcloud services enable connectgateway.googleapis.com --project=[*PROJECT_ID*]
Lakukan mulai ulang berkelanjutan pada workload.