Memecahkan masalah koneksi cluster

Halaman ini menjelaskan cara memecahkan masalah error umum yang mungkin Anda alami saat mendaftarkan cluster ke armada atau menghubungkan ke cluster di luar Google Cloud menggunakan konsol Google Cloud , Google Cloud CLI, atau kubectl melalui gateway Connect.

Cluster lokal dan cluster di cloud publik lainnya bergantung pada Connect Agent untuk membuat dan mempertahankan koneksi antara cluster dan project Google Cloud Anda, serta untuk menangani permintaan Kubernetes. Jika Anda melihat error seperti "Agen Tidak Dapat Dijangkau" atau "Gagal terhubung ke panel kontrol cluster", hal ini dapat menunjukkan masalah pada Agen Connect.

Mengumpulkan log Connect Agent

Saat Anda mendaftarkan cluster di luar Google Cloud, cluster tersebut akan menggunakan Connect Agent untuk menangani komunikasi antara cluster dan project host fleet Anda. Connect Agent adalah Deployment, gke-connect-agent, yang biasanya diinstal di cluster Anda di namespace gke-connect. Mengumpulkan log dari Connect Agent ini dapat berguna untuk memecahkan masalah pendaftaran dan koneksi.

Anda dapat mengambil log Agen dengan menjalankan perintah berikut (sesuaikan jumlah baris jika perlu):

kubectl logs -n gke-connect -l app=gke-connect-agent --tail=-1

Untuk mendapatkan informasi tentang setiap Connect Agent yang berjalan di cluster project Anda:

kubectl describe deployment --all-namespaces -l app=gke-connect-agent

Koneksi yang berhasil akan memiliki entri yang mirip dengan contoh di bawah:

2019/02/16 17:28:43.312056 dialer.go:244: dialer: dial: connected to gkeconnect.googleapis.com:443
2019/02/16 17:28:43.312279 tunnel.go:234: serve: opening egress stream...
2019/02/16 17:28:43.312439 tunnel.go:248: serve: registering endpoint="442223602236", shard="88d2bca5-f40a-11e8-983e-42010a8000b2" {"Params":{"GkeConnect":{"endpoint_class":1,"metadata":{"Metadata":{"Default":{"manifest_version":"234227867"}}}}}} ...
2019/02/16 17:28:43.312656 tunnel.go:259: serve: serving requests...

Mengumpulkan log GKE Identity Service

Memeriksa log GKE Identity Service dapat membantu jika Anda mengalami masalah dengan Google Grup atau dukungan pihak ketiga untuk gateway Connect. Metode pembuatan log ini hanya berlaku untuk cluster dalam deployment Google Distributed Cloud di VMware atau bare metal.

  1. Tingkatkan kejelasan log GKE Identity Service dengan mengedit resource kustom clientconfig menggunakan perintah berikut:

    kubectl edit deployment -n anthos-identity-service
    

    dan menambahkan tanda vmodule di bagian kolom containers seperti berikut:

    spec:
      containers:
      ...
      - command:
        - --vmodule=cloud/identity/hybrid/charon/*=9
    
  2. Mulai ulang pod GKE Identity Service dengan menghapusnya menggunakan perintah berikut:

    kubectl delete pods -l k8s-app=ais -n anthos-identity-service
    

    Pod akan muncul kembali dalam beberapa detik.

  3. Setelah pod dimulai ulang, jalankan perintah asli yang menampilkan respons yang tidak terduga untuk mengisi log pod GKE Identity Service dengan detail selengkapnya.

  4. Simpan output log ini ke file menggunakan perintah berikut:

    kubectl logs -l k8s-app=ais -n anthos-identity-service --tail=-1 > gke_id_service_logs.txt
    

Jika grup yang diharapkan tidak ada di log pod GKE Identity Service, verifikasi penyiapan untuk cluster sudah benar. Jika ada masalah lain terkait Layanan Identitas GKE, lihat Memecahkan masalah akses pengguna atau Memecahkan masalah penyiapan tingkat fleet.

tls: oversized record error

Gejala

Anda mungkin mengalami error seperti ini:

... dialer: dial: connection to gkeconnect.googleapis.com:443 failed after
388.080605ms: serve: egress call failed: rpc error: code = Unauthenticated
desc = transport: oauth2: cannot fetch token: Post
https://oauth2.googleapis.com/token: proxyconnect tcp: tls: oversized record
received with length 20527
Kemungkinan penyebab

Hal ini dapat berarti bahwa Connect Agent mencoba terhubung melalui HTTPS ke proxy khusus HTTP. Connect Agent hanya mendukung proxy HTTP berbasis CONNECT.

Resolusi

Anda perlu mengonfigurasi ulang variabel lingkungan proxy ke berikut ini:

http_proxy=http://[PROXY_URL]:[PROXY_PORT]
https_proxy=http://[PROXY_URL]:[PROXY_PORT]

oauth2: cannot fetch token error

Gejala

Anda mungkin mengalami error seperti ini:

...  dialer: dial: connection to gkeconnect.googleapis.com:443 failed
after 388.080605ms: serve: egress call failed: rpc error: code =
Unauthenticated desc = transport: oauth2: cannot fetch token: Post
https://oauth2.googleapis.com/token: read tcp 192.168.1.40:5570->1.1.1.1:80
read: connection reset by peer
Kemungkinan penyebab

Hal ini dapat berarti bahwa proxy HTTP upstream mereset koneksi, kemungkinan besar karena URL tertentu ini tidak diizinkan oleh proxy HTTP Anda. Dalam contoh di atas, 1.1.1.1:80 adalah alamat proxy HTTP.

Resolusi

Pastikan daftar yang diizinkan untuk proxy HTTP Anda menyertakan URL/domain berikut:

gkeconnect.googleapis.com
oauth2.googleapis.com/token
www.googleapis.com/oauth2/v1/certs

Error crash dan memulai ulang pod Connect Agent

Gejala

Anda mungkin mengalami error "Agen Tidak Dapat Dijangkau" yang terjadi sesekali di konsol Google Cloud untuk cluster Anda dan/atau Anda mungkin mendapati bahwa Pod telah dimulai ulang beberapa kali:

$ kubectl get pods -n gke-connect
NAME                                                READY   STATUS    RESTARTS   AGE
gke-connect-agent-20230706-03-00-6b8f75dd58-dzwmt   1/1     Running   5          99m

Untuk memecahkan masalah perilaku ini, deskripsikan Pod untuk melihat apakah status terakhirnya dihentikan karena error kehabisan memori (OOMKilled).:

  kubectl describe pods/gke-connect-agent-20230706-03-00-6b8f75dd58-dzwmt -n gke-connect
        <some details skipped..>
        Last State:     Terminated
        Reason:       OOMKilled
Kemungkinan penyebab
Secara default, Pod Connect Agent memiliki batas RAM 256 MiB. Jika cluster telah menginstal banyak workload, beberapa permintaan dan respons mungkin tidak dapat ditangani seperti yang diharapkan.
Resolusi

Perbarui deployment Connect Agent dan berikan batas memori yang lebih tinggi, misalnya:

containers:
  name: gke-connect-agent-20230706-03-00
  resources:
    limits:
      memory: 512Mi

PermissionDenied error

Gejala

Anda mungkin mengalami error seperti ini:

tunnel.go:250: serve: recv error: rpc error: code = PermissionDenied
desc = The caller does not have permission
dialer.go:210: dialer: dial: connection to gkeconnect.googleapis.com:443
failed after 335.153278ms: serve: receive request failed: rpc error:
code = PermissionDenied desc = The caller does not have permission
dialer.go:150: dialer: connection done: serve: receive request failed:
rpc error: code = PermissionDenied desc = The caller does not have permission
dialer.go:228: dialer: backoff: 1m14.1376766s
Kemungkinan penyebab

Hal ini dapat berarti Anda belum mengikat peran Identity and Access Management (IAM) yang diperlukan ke Google Cloud akun layanan yang Anda buat untuk mengizinkan Agen Connect terhubung ke Google. Akun Google Cloud layanan memerlukan peran IAM gkehub.connect.

Hal ini juga dapat terjadi jika Anda menghapus dan membuat ulang akun layanan dengan nama yang sama. Google CloudAnda juga perlu menghapus dan membuat ulang pengikatan peran IAM dalam kasus tersebut. Lihat Menghapus dan membuat ulang akun layanan untuk mengetahui informasi selengkapnya.

Resolusi

Ikat peran gkehub.connect ke akun layanan Anda (perhatikan bahwa peran gkehub.admin tidak memiliki izin yang tepat untuk terhubung dan tidak dimaksudkan untuk digunakan oleh akun layanan).

Misalnya, untuk project bernama my-project dan akun layanan Google Cloudbernama gkeconnect@my-project., Anda akan menjalankan perintah berikut untuk mengikat peran ke akun layanan:

gcloud projects add-iam-policy-binding my-project --member \
serviceAccount:gkeconnect@my-project. \
--role "roles/gkehub.connect"

Anda dapat melihat dan memverifikasi bahwa izin akun layanan telah diterapkan ke akun layanan Google Cloud dengan memeriksa output perintah berikut, dan Anda akan melihat role: roles/gkehub.connect terikat ke Akun layanan Google Cloud terkait.

gcloud projects get-iam-policy my-project

Error saat mengikat peran IAM ke akun layanan Google Cloud

Gejala

Anda mungkin mengalami error seperti ini:

ERROR: (gcloud.projects.add-iam-policy-binding) PERMISSION_DENIED:
Service Management API has not been used in project [PROJECT_ID] before or it
is disabled. Enable it by visiting
https://console.developers.google.com/apis/api/servicemanagement.googleapis.com/overview?project=[PROJECT_ID]
then retry. If you enabled this API recently, wait a few minutes for the
action to propagate to our systems and retry.
Kemungkinan penyebab

Anda mungkin tidak memiliki izin IAM untuk menjalankan perintah gcloud projects add-iam-policy-binding.

Resolusi

Anda harus memiliki izin resourcemanager.projects.setIamPolicy Jika memiliki peran Project IAM Admin, Owner, atau Editor, Anda akan dapat menjalankan perintah. Jika kebijakan keamanan internal melarang Anda menjalankan perintah, hubungi administrator Anda.

Error dari clock sistem yang tidak akurat

Gejala

Anda mungkin mengalami error seperti ini:

acceptCall: failed to parse token in req [rpc_id=1]: Token used before issued [rpc_id=1]
Kemungkinan penyebab

Pesan log biasanya menunjukkan bahwa ada perbedaan waktu pada cluster. Token yang dikeluarkan cluster memiliki stempel waktu yang tidak sinkron sehingga token ditolak.

Resolusi

Untuk melihat apakah jam tidak disinkronkan dengan benar, Anda dapat menjalankan perintah date di cluster dan membandingkannya dengan waktu standar. Biasanya pergeseran beberapa detik akan menyebabkan masalah ini. Untuk mengatasi masalah ini, sinkronkan ulang jam cluster Anda.

Tidak dapat melihat beban kerja di konsol Google Cloud

Gejala

Di log Connect Agent, Anda mungkin melihat error berikut:

"https://10.0.10.6:443/api/v1/nodes" YYYY-MM-DDTHH mm:ss.sssZ http.go:86: GET
"https://10.0.10.6:443/api/v1/pods" YYYY-MM-DDTHH mm:ss.sssZ http.go:139:
Response status: "403 Forbidden" YYYY-MM-DDTHH mm:ss.sssZ http.go:139:
Response status: "403 Forbidden"`
Kemungkinan penyebab

Log ini menunjukkan bahwa Google Cloud berupaya mengakses cluster menggunakan kredensial yang Anda berikan selama pendaftaran. Error 403 menunjukkan bahwa kredensial tidak memiliki izin yang diperlukan untuk mengakses cluster.

Resolusi

Periksa token dan akun yang terikat dengannya, serta pastikan token tersebut memiliki izin yang sesuai di cluster.

Batas waktu konteks terlampaui

Gejala

Anda mungkin mengalami error seperti ini:

2019/03/06 21:08:43.306625 dialer.go:235: dialer: dial: connecting to gkeconnect.googleapis.com:443...
2019/03/06 21:09:13.306893 dialer.go:240: dialer: dial: unable to connect to gkeconnect.googleapis.com:443: context deadline exceeded
2019/03/06 21:09:13.306943 dialer.go:183: dialer: connection done: context deadline exceeded
Kemungkinan penyebab

Error ini menunjukkan masalah jaringan TCP tingkat rendah di mana Connect Agent tidak dapat berkomunikasi dengan gkeconnect.googleapis.com.

Resolusi

Verifikasi bahwa beban kerja Pod dalam cluster ini dapat menyelesaikan dan memiliki konektivitas keluar ke gkeconnect.googleapis.com di port 443.

Koneksi agen gagal secara berkala

Gejala

Di log Connect Agent, Anda mungkin melihat error berikut:

2020/10/06 18:02:34.409749 dialer.go:277: dialer: dial: connection to gkeconnect.googleapis.com:443 failed after 8m0.790286282s: serve: receive request failed: rpc error: code = Unavailable desc = transport is closing
2020/10/06 18:02:34.416618 dialer.go:207: dialer: connection done: serve: receive request failed: rpc error: code = Unavailable desc = transport is closing
2020/10/06 18:02:34.416722 dialer.go:295: dialer: backoff: 978.11948ms
2020/10/06 18:02:34.410097 tunnel.go:651: sendResponse: EOF [rpc_id=52]
2020/10/06 18:02:34.420077 tunnel.go:651: sendResponse: EOF [rpc_id=52]
2020/10/06 18:02:34.420204 tunnel.go:670: sendHalfClose: EOF [rpc_id=52]
2020/10/06 18:02:34.401412 tunnel.go:670: sendHalfClose: EOF [rpc_id=53]
Kemungkinan penyebab

Koneksi ke Connect ditutup saat Connect Agent tidak memiliki cukup resource, misalnya pada instance AWS EC2 yang lebih kecil seperti t3.medium.

Resolusi

Jika Anda menggunakan AWS dan jenis instance T3, aktifkan T3 unlimited atau gunakan jenis instance dengan lebih banyak resource untuk node pool Anda.

Fleet tidak dapat mengakses project

Gejala

Selama beberapa operasi Fleet (biasanya pendaftaran cluster), Anda mungkin melihat error yang mirip dengan berikut ini:

ERROR: (gcloud.container.hub.memberships.register) failed to initialize Feature
"authorizer", the fleet service account (service-PROJECT_NUMBER@gcp-sa-gkehub.) may not have access to your project
Kemungkinan penyebab

Akun layanan default Fleet, gcp-sa-gkehub, dapat secara tidak sengaja menjadi tidak terikat dari project. Agen Layanan Fleet adalah peran IAM yang memberi akun layanan izin untuk mengelola resource cluster. Jika Anda menghapus binding peran ini dari akun layanan, akun layanan default akan terlepas dari project, sehingga Anda tidak dapat mendaftarkan cluster dan melakukan operasi cluster lainnya.

Anda dapat memeriksa apakah akun layanan telah dihapus dari project Anda menggunakan gcloud CLI atau konsol Google Cloud . Jika perintah atau dasbor tidak menampilkan gcp-sa-gkehub di antara akun layanan Anda, akun layanan telah terlepas.

gcloud

Jalankan perintah berikut:

gcloud projects get-iam-policy PROJECT_NAME

dengan PROJECT_NAME adalah nama project tempat Anda mencoba mendaftarkan cluster.

Konsol

Buka halaman IAM & admin di konsol Google Cloud .

Resolusi

Jika Anda menghapus binding peran Agen Layanan Fleet, jalankan perintah berikut untuk memulihkan binding peran:

PROJECT_NUMBER=$(gcloud projects describe PROJECT_NAME --format "value(projectNumber)")
gcloud projects add-iam-policy-binding PROJECT_NAME \
  --member "serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-gkehub." \
  --role roles/gkehub.serviceAgent

Untuk mengonfirmasi bahwa binding peran telah diberikan:

gcloud projects get-iam-policy PROJECT_NAME

Jika Anda melihat nama akun layanan beserta peran gkehub.serviceAgent, artinya binding peran telah diberikan. Contoh:

- members:
  - serviceAccount:service-1234567890@gcp-sa-gkehub.
  role: roles/gkehub.serviceAgent

Error saat mendaftarkan cluster GKE dari project yang berbeda dengan Fleet

Gejala

Saat mendaftarkan cluster GKE dari project yang berbeda dengan project Fleet, Anda mungkin melihat error yang mirip dengan berikut di gcloud CLI:

...
message: 'DeployPatch failed'>
detail: 'DeployPatch failed'
...

Hal ini dapat diverifikasi dalam logging dengan menerapkan filter berikut:

resource.type="gke_cluster"
resource.labels.cluster_name="my-cluster"
protoPayload.methodName="google.container.v1beta1.ClusterManager.UpdateCluster"
protoPayload.status.code="13"
protoPayload.status.message="Internal error."
severity=ERROR

Kemungkinan penyebab

Akun Layanan default Fleet tidak memiliki izin yang diperlukan dalam project cluster GKE.

Resolusi

Berikan izin yang diperlukan untuk Akun Layanan default Fleet sebelum mendaftarkan cluster.

Error saat mendaftarkan/membatalkan pendaftaran cluster GKE atau memperbarui detail keanggotaan fleet untuk cluster GKE terdaftar selama rotasi kredensial

Gejala

Saat mengganti kredensial cluster(https://cloud.google.com/kubernetes-engine/docs/how-to/credential-rotation), Anda mungkin menemukan error jika mendaftarkan/membatalkan pendaftaran cluster GKE atau memperbarui keanggotaan untuk cluster GKE terdaftar.

ERROR: (gcloud.container.hub.memberships.unregister) "code": 13,
"message": "an internal error has occurred"
Kemungkinan penyebab

Kredensial cluster berada dalam status perantara saat layanan Fleet tidak dapat mengaksesnya.

Resolusi

Selesaikan rotasi sebelum mendaftarkan/membatalkan pendaftaran cluster atau memperbarui keanggotaan untuk cluster GKE terdaftar.

Error saat menonaktifkan Fleet API

Gejala

Saat mencoba menonaktifkan Fleet API (gkehub.googleapis.com), Anda mungkin mengalami error yang mirip dengan berikut ini:

Not ready to deactivate the service on this project; ensure there are no more resources managed by this service.
Kemungkinan penyebab

Masih ada cluster yang terdaftar ke Google Cloud (membership) atau fitur tingkat fleet yang diaktifkan dalam project ini. Semua langganan atau fitur harus dibatalkan pendaftarannya atau dinonaktifkan sebelum API dapat dinonaktifkan.

  • Untuk melihat cluster terdaftar Anda saat ini, ikuti petunjuk di Melihat anggota fleet

  • Untuk melihat semua fitur tingkat fleet yang aktif untuk project Anda:

gcloud dan cURL

$ curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://gkehub.googleapis.com/v1alpha/projects/PROJECT_NAME/locations/global/features

dengan PROJECT_NAME adalah nama project tempat Anda mencoba menonaktifkan Fleet API.

Konsol

Jika Anda telah mengaktifkan GKE di project, buka halaman Feature Manager di konsol Google Cloud . Fitur yang tercantum sebagai DIAKTIFKAN adalah fitur tingkat armada yang aktif.

Resolusi

Pertama, batalkan pendaftaran cluster yang masih terdaftar ke fleet project Anda. Semua cluster harus dibatalkan pendaftarannya sebelum beberapa fitur dapat dinonaktifkan.

Setelah melakukannya, nonaktifkan semua fitur tingkat fleet. Saat ini, hal ini hanya dapat dilakukan dengan Fleet REST API.

  1. Menonaktifkan fitur tingkat fleet yang telah Anda aktifkan untuk project Anda

    $ gcloud alpha container hub FEATURE_COMMAND disable
    
  2. Nonaktifkan pengotorisasi dan pengukuran fitur, yang diaktifkan secara default.

    $ curl -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        -X "DELETE" \
        https://gkehub.googleapis.com/v1alpha/projects/PROJECT_NAME/locations/global/features/FEATURE
    

    dengan FEATURE adalah nama fitur yang akan dinonaktifkan (seperti authorizer atau metering).

Izin cluster tidak ada saat mendaftarkan cluster

Gejala:

Saat mencoba mendaftarkan cluster dengan akun pengguna atau Google Cloud akun layanan, Anda mungkin mendapatkan error yang serupa dengan berikut ini:

ERROR: (gcloud.container.hub.memberships.register) ResponseError: code=403, message=Required "container.clusters.get" permission(s) for "projects/my-project/zones/zone-a/clusters/my-cluster"
Penyebab yang mungkin:

Akun yang mencoba mendaftarkan cluster tidak memiliki peran cluster-admin role-based access control (RBAC) yang diperlukan di cluster.

Penyelesaian:

Berikan peran RBAC cluster-admin ke akun sebelum mendaftarkan cluster.

Error Failed to check if the user is a cluster-admin: Unable to connect to the server saat mendaftarkan cluster

Gejala:

Saat mencoba mendaftarkan cluster, Anda mungkin mendapatkan error yang mirip dengan berikut ini:

ERROR: (gcloud.container.hub.memberships.register) Failed to check if the user is a cluster-admin: Unable to connect to the server: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

Atau

ERROR: (gcloud.container.hub.memberships.register) Failed to check if the user is a cluster-admin: Unable to connect to the server: dial tcp MASTER_ENDPOINT_IP:443: i/o timeout
Penyebab yang mungkin:

Mesin tempat Anda menjalankan perintah pendaftaran gcloud tidak dapat terhubung ke endpoint eksternal cluster. Hal ini biasanya terjadi jika Anda memiliki cluster pribadi dengan akses/IP eksternal dinonaktifkan, tetapi alamat IP eksternal komputer Anda tidak diizinkan. Perhatikan bahwa pendaftaran cluster GKE tidak memiliki persyaratan ini setelah gcloud 407.0.0.

Penyelesaian:

Pastikan komputer tempat Anda ingin menjalankan perintah pendaftaran gcloud dapat mengakses server API cluster. Jika cluster Anda tidak mengaktifkan akses eksternal, ajukan kasus ke Google Cloud Dukungan.

Error: Langganan yang dikelola Google tidak dapat dihapus

Setelah Anda mendaftarkan cluster ke fleet, cluster tersebut akan menjadi anggota fleet dengan nama keanggotaan fleet yang unik. Jika Anda mencoba menghapus keanggotaan ini dengan menjalankan gcloud container hub memberships delete MEMBERSHIP_NAME, Anda mungkin melihat error berikut:

ERROR: (gcloud.container.hub.memberships.delete) FAILED_PRECONDITION: membership "projects/PROJECT_ID/locations/us-centrall/memberships/MEMBERSHIP_NAME" is a managed resource of your cluster. Deleting a google-managed membership directly is not allowed. Please offboard your fleet membership via cluster API: failed precondition

Untuk menghapus keanggotaan fleet dengan benar, ikuti petunjuk di Membatalkan pendaftaran cluster.

Mendapatkan bantuan tambahan

Anda dapat mengajukan tiket ke Google Cloud dukungan untuk GKE dengan melakukan langkah-langkah berikut:

  1. Ajukan kasus ke Google Cloud Dukungan.
  2. Ikuti petunjuk di Mengumpulkan log Agen Connect untuk menyimpan log Connect.
  3. Jika memecahkan masalah cluster lokal menggunakan Google Grup atau dukungan pihak ketiga, ikuti petunjuk di Mengumpulkan log Layanan Identitas GKE untuk menyimpan log Layanan Identitas GKE. Pastikan untuk membersihkan log pod dalam file yang disimpan jika perlu.
  4. Lampirkan log yang relevan ke kasus Anda.