Memecahkan masalah Cloud DNS di GKE


Halaman ini menunjukkan cara menyelesaikan masalah terkait Cloud DNS di Google Kubernetes Engine (GKE).

Mengidentifikasi sumber masalah DNS di Cloud DNS

Error seperti dial tcp: i/o timeout, no such host, atau Could not resolve host sering kali menandakan masalah pada kemampuan Cloud DNS untuk me-resolve kueri.

Jika Anda telah melihat salah satu error tersebut, tetapi tidak tahu penyebabnya, gunakan bagian berikut untuk membantu Anda menemukannya. Bagian-bagian ini disusun untuk memulai dengan langkah-langkah yang kemungkinan besar akan membantu Anda, jadi coba setiap bagian secara berurutan.

Memverifikasi setelan dasar

Jika Pod Anda tidak dapat me-resolve pencarian DNS, pastikan Cloud DNS dikonfigurasi seperti yang Anda inginkan. Bagian ini membantu Anda memverifikasi apakah Anda menggunakan Cloud DNS, mengonfirmasi keberadaan zona DNS pribadi untuk cluster GKE, dan memastikan akurasi data DNS untuk layanan target.

Untuk memverifikasi setelan ini, selesaikan perintah berikut:

  1. Periksa server DNS yang digunakan Pod Anda:

    kubectl exec -it POD_NAME -- cat /etc/resolv.conf | grep nameserver
    

    Ganti POD_NAME dengan nama Pod yang mengalami masalah dengan resolusi DNS.

    Jika Anda menggunakan Cloud DNS, output-nya adalah sebagai berikut:

    nameserver 169.254.169.254
    

    Jika Anda melihat nilai lain, berarti Anda tidak menggunakan Cloud DNS. Pastikan Cloud DNS telah diaktifkan dengan benar.

  2. Pastikan zona terkelola ada:

    gcloud dns managed-zones list --format list
    

    Outputnya mirip dengan hal berikut ini:

    - creationTime: 2021-02-12T19:24:37.045Z
      description: Private zone for GKE cluster "" with cluster suffix "CLUSTER_DOMAIN" in project "PROJECT_ID"
      dnsName: CLUSTER_DOMAIN.
      id: 5887499284756055830
      kind: dns#managedZone
      name: gke-CLUSTER_NAME-aa94c1f9-dns
      nameServers: ['ns-gcp-private.googledomains.com.']
      privateVisibilityConfig: {'kind': 'dns#managedZonePrivateVisibilityConfig'}
      visibility: private
    

    Output ini mencakup nilai-nilai berikut:

    • CLUSTER_DOMAIN: akhiran domain DNS yang secara otomatis ditetapkan ke cluster Anda.
    • PROJECT_ID: project ID Anda.
    • CLUSTER_NAME: nama cluster dengan zona pribadi.

    Dalam output ini, nilai di kolom name menunjukkan bahwa Google Cloud membuat zona bernama gke-CLUSTER_NAME-aa94c1f9-dns.

    Jika Anda tidak melihat zona terkelola, artinya zona pribadi tidak dibuat untuk cluster Anda, atau Anda mungkin tidak diautentikasi dengan benar. Untuk memecahkan masalah, lihat Zona pribadi dalam dokumentasi Cloud DNS.

  3. Verifikasi data DNS untuk Layanan Anda:

    gcloud dns record-sets list --zone ZONE_NAME | grep SERVICE_NAME
    

    Ganti kode berikut:

    • ZONE_NAME: nama zona pribadi.
    • SERVICE_NAME: nama Layanan.

    Outputnya mirip dengan berikut ini:

    dns-test.default.svc.cluster.local.                A     30     10.47.255.11
    

    Output ini menunjukkan bahwa Cloud DNS berisi data A untuk domain dns-test.default.svc.cluster.local. dan alamat IP cluster Anda adalah 10.47.255.11.

    Jika data terlihat salah, lihat Menambahkan patch ke kumpulan data resource di dokumentasi Cloud DNS untuk memperbaruinya.

Memverifikasi kebijakan respons

Pastikan kebijakan respons Anda ada dan diberi nama dengan benar:

  1. Lihat daftar semua kebijakan respons Anda:

    gcloud dns response-policies list --format="table(responsePolicyName, description)"
    

    Outputnya mirip dengan hal berikut ini:

    RESPONSE_POLICY_NAME          DESCRIPTION
    gke-CLUSTER_NAME-52c8f518-rp  Response Policy for GKE cluster "CLUSTER_NAME" with cluster suffix "cluster.local." in project "gke-dev" with scope "CLUSTER_SCOPE".
    

    Dalam output ini, gke-CLUSTER_NAME-52c8f518-rp menunjukkan bahwa Google Cloud membuat zona pribadi bernama gke-CLUSTER_NAME-aa94c1f9-rp. Kebijakan respons yang dibuat Google Cloud memiliki awalan gke-.

  2. Melihat kebijakan respons di zona pribadi tertentu:

    gcloud dns response-policies rules list ZONE_NAME \
        --format="table(localData.localDatas[0].name, localData.localDatas[0].rrdatas[0])"
    

    Ganti ZONE_NAME dengan nama zona pribadi yang mengalami masalah.

    Outputnya mirip dengan hal berikut ini:

    1.240.27.10.in-addr.arpa.    kubernetes.default.svc.cluster.local.
    52.252.27.10.in-addr.arpa.   default-http-backend.kube-system.svc.cluster.local.
    10.240.27.10.in-addr.arpa.   kube-dns.kube-system.svc.cluster.local.
    146.250.27.10.in-addr.arpa.  metrics-server.kube-system.svc.cluster.local.
    

    Kolom pertama menampilkan alamat IP atau pola nama domain yang cocok dengan aturan. Kolom kedua adalah nama host yang terkait dengan alamat IP.

Jika Anda melihat masalah dalam output perintah ini, lihat memperbarui aturan kebijakan respons dalam dokumentasi Cloud DNS.

Menyelidiki dengan log, dasbor, dan metrik

Cloud DNS menyertakan beberapa opsi logging dan pemantauan untuk membantu Anda menyelidiki masalah DNS lebih lanjut:

Memeriksa data baru

Tinjau log untuk melihat apakah ada data baru yang dibuat di zona pribadi Cloud DNS yang dikelola. Hal ini dapat membantu jika Anda tiba-tiba mengalami kegagalan resolusi DNS di cluster.

Untuk memeriksa data baru, selesaikan langkah-langkah berikut:

  1. Di Konsol Google Cloud, buka halaman Logs Explorer.

    Buka Logs Explorer

  2. Di panel kueri, masukkan kueri berikut:

    resource.type="dns_managed_zone"
    protoPayload.request.change.additions.name="headless-svc-stateful.default.svc.cluster.local."
    protoPayload.methodName="dns.changes.create"
    
  3. Klik Run query.

  4. Tinjau output. Jika Anda menemukan perubahan yang sesuai dengan saat pertama kali melihat error, pertimbangkan untuk mengembalikannya.

Memverifikasi domain stub dan server nama kustom

Jika Anda menggunakan cluster GKE Standard dengan domain stub atau server nama upstream kustom, tinjau ConfigMap dan pastikan nilainya sudah benar.

Cloud DNS menerjemahkan nilai stubDomains dan upstreamNameservers menjadi zona penerusan Cloud DNS. Google mengelola resource ini, jadi jika Anda melihat error, hubungi Cloud Customer Care untuk mendapatkan bantuan.

Menghubungi Cloud Customer Care

Jika Anda telah menyelesaikan bagian sebelumnya, tetapi masih tidak dapat mendiagnosis penyebab masalah, hubungi Cloud Customer Care.

Mengatasi error tertentu

Jika Anda mengalami error atau masalah tertentu, gunakan saran di bagian berikut.

Masalah: Tidak dapat me-resolve Layanan cluster GKE dari VM Compute Engine

Jika Anda tidak dapat me-resolve Layanan cluster GKE dari VM Compute Engine, verifikasi cakupan Cloud DNS cluster.

Cakupan yang Anda gunakan dengan Cloud DNS menentukan resource mana yang dapat di-resolve:

  • Cakupan cluster: Resolusi DNS dibatasi untuk resource dalam cluster Kubernetes (Pod dan Layanan). Ini adalah setelan default dan cocok jika Anda tidak perlu me-resolve resource eksternal di luar cluster Kubernetes atau Virtual Private Cloud (VPC) GKE.

  • Cakupan VPC: Resolusi DNS diperluas ke seluruh VPC, termasuk resource seperti VM Compute Engine. Hal ini memungkinkan cluster me-resolve data DNS internal untuk resource di luar cluster GKE, tetapi dalam VPC yang sama, seperti VM Google Cloud.

Untuk memverifikasi cakupan Cloud DNS cluster, selesaikan langkah-langkah berikut:

  1. Di konsol Google Cloud, buka halaman Kubernetes clusters.

    Buka cluster Kubernetes

  2. Klik nama cluster yang mengalami masalah dengan DNS.

  3. Di bagian Cluster networking pada halaman detail cluster, tinjau informasi di baris DNS provider.

  4. Jika Anda melihat Cloud DNS (cakupan cluster), berarti Anda menggunakan cakupan cluster. Untuk mengubah cakupan DNS, buat ulang cluster dengan cakupan DNS yang sesuai.

Masalah: Pod masih menggunakan kube-dns setelah Cloud DNS diaktifkan

Jika Pod Anda menggunakan kube-dns bahkan setelah Cloud DNS diaktifkan di cluster yang ada, pastikan Anda telah mengupgrade atau membuat ulang node pool setelah mengaktifkan Cloud DNS di cluster. Hingga langkah ini selesai, Pod akan terus menggunakan kube-dns.

Masalah: Tidak dapat memperbarui cluster yang ada atau membuat cluster dengan mengaktifkan Cloud DNS

Pastikan Anda menggunakan versi yang benar. Cloud DNS untuk GKE memerlukan GKE versi 1.19 atau yang lebih baru untuk cluster yang menggunakan cakupan VPC, atau GKE versi 1.24.7-gke.800, 1.25.3-gke.700 atau yang lebih baru untuk cluster yang menggunakan cakupan cluster.

Masalah: Pencarian DNS pada node gagal setelah Cloud DNS diaktifkan di cluster

Jika Anda mengaktifkan Cloud DNS cakupan cluster di cluster GKE yang memiliki domain stub kustom atau server nama upstream, konfigurasi kustom akan berlaku untuk node dan Pod di cluster karena Cloud DNS tidak dapat membedakan antara Pod dan node Permintaan DNS. Pencarian DNS pada node mungkin gagal jika server upstream khusus tidak dapat menyelesaikan kueri.

Masalah: Tidak dapat memperbarui atau membuat cluster dengan mengaktifkan cakupan VPC tambahan Cloud DNS

Pastikan Anda menggunakan versi yang benar. Cakupan VPC Tambahan Cloud DNS memerlukan GKE versi 1.28 atau yang lebih baru.

Error: Cloud DNS dinonaktifkan

Peristiwa berikut terjadi saat Cloud DNS API dinonaktifkan:

Warning   FailedPrecondition        service/default-http-backend
Failed to send requests to Cloud DNS: Cloud DNS API Disabled. Please enable the Cloud DNS API in your project PROJECT_NAME: Cloud DNS 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/dns.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.

Error ini terjadi karena Cloud DNS API tidak diaktifkan secara default. Anda harus mengaktifkan Cloud DNS API secara manual.

Untuk mengatasi masalah ini, aktifkan Cloud DNS API.

Error: Gagal mengirim permintaan ke Cloud DNS: Batas kapasitas API terlampaui.

Peristiwa berikut terjadi saat project telah melampaui kuota atau batas Cloud DNS:

kube-system   27s         Warning   InsufficientQuota
managedzone/gke-cluster-quota-ee1bd2ca-dns     Failed to send requests to Cloud DNS: API rate limit exceeded. Contact Google Cloud support team to request a quota increase for your project PROJECT_NAME: Quota exceeded for quota metric 'Write requests' and limit 'Write limit for a minute for a region' of service 'dns.googleapis.com' for consumer 'project_number:PROJECT_NUMBER.

Untuk mengatasi masalah ini, tinjau kuota Cloud DNS serta kuota dan batasan Compute Engine. Anda dapat menambah kuota menggunakan Konsol Google Cloud.

Error: Gagal mengirim permintaan ke Cloud DNS karena error sebelumnya

Peristiwa berikut terjadi saat error menyebabkan kegagalan beruntun:

kube-system   27s         Warning   InsufficientQuota
managedzone/gke-cluster-quota-ee1bd2ca-dns     Failed to send requests to Cloud DNS: API rate limit exceeded. Contact Google Cloud support team to request a quota increase for your project PROJECT_NAME: Quota exceeded for quota metric 'Write requests' and limit 'Write limit for a minute for a region' of service 'dns.googleapis.com' for consumer 'project_number:PROJECT_NUMBER.
kube-system   27s         Warning   FailedPrecondition               service/default-http-backend                         Failed to send requests to Cloud DNS due to a previous error. Please check the cluster events.

Untuk mengatasi masalah ini, periksa peristiwa cluster untuk menemukan sumber error asli, lalu ikuti petunjuk untuk menyelesaikan masalah pokok tersebut.

Pada contoh sebelumnya, error InsufficientQuota untuk zona terkelola memicu kegagalan beruntun. Error kedua untuk FailedPrecondition menunjukkan bahwa error sebelumnya terjadi, yaitu masalah kuota awal yang tidak memadai. Untuk mengatasi contoh masalah ini, Anda akan mengikuti panduan untuk error kuota Cloud DNS.

Error: Gagal mengikat kebijakan respons

Peristiwa berikut terjadi saat kebijakan respons terikat ke jaringan cluster dan Cloud DNS untuk GKE mencoba mengikat kebijakan respons ke jaringan:

kube-system   9s          Warning   FailedPrecondition               responsepolicy/gke-2949673445-rp
Failed to bind response policy gke-2949673445-rp to test. Please verify that another Response Policy is not already associated with the network: Network 'https://www.googleapis.com/compute/v1/projects/PROJECT_NAME/global/networks/NETWORK_NAME' cannot be bound to this response policy because it is already bound to another response policy.
kube-system   9s          Warning   FailedPrecondition               service/kube-dns
Failed to send requests to Cloud DNS due to a previous error. Please check the cluster events.

Untuk mengatasi masalah ini, selesaikan beberapa langkah berikut:

  1. Dapatkan kebijakan respons yang terikat ke jaringan:

    gcloud dns response-policies list --filter='networks.networkUrl: NETWORK_URL'
    

    Ganti NETWORK_URL dengan URL jaringan dari error, seperti https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/NETWORK_NAME.

    Jika output kosong, kebijakan respons mungkin tidak berada dalam project yang sama. Lanjutkan ke langkah berikutnya untuk menelusuri kebijakan respons.

    Jika output mirip dengan berikut ini, lanjutkan ke langkah 4 untuk menghapus kebijakan respons.

    [
       {
          "description": "Response Policy for GKE cluster \"CLUSTER_NAME\" with cluster suffix \"cluster.local.\" in project \"PROJECT_ID\" with scope \"CLUSTER_SCOPE\".",
          ...
          "kind": "dns#responsePolicy",
          "responsePolicyName": "gke-CLUSTER_NAME-POLICY_ID-rp"
       }
    ]
    
  2. Dapatkan daftar project dengan izin dns.networks.bindDNSResponsePolicy menggunakan Penganalisis Kebijakan IAM.

  3. Periksa apakah setiap project memiliki kebijakan respons yang terikat ke jaringan:

    gcloud dns response-policies list --filter='networks.networkUrl:NETWORK_URL' \
        --project=PROJECT_NAME
    
  4. Hapus kebijakan respons.

Error: Konfigurasi yang tidak valid ditetapkan dalam kube-dns

Peristiwa berikut terjadi saat Anda menerapkan kube-dns ConfigMap kustom yang tidak valid untuk Cloud DNS untuk GKE:

kube-system   49s         Warning   FailedValidation                 configmap/kube-dns
Invalid configuration specified in kube-dns: error parsing stubDomains for ConfigMap kube-dns: dnsServer [8.8.8.256] validation: IP address "8.8.8.256" invalid

Untuk mengatasi masalah ini, tinjau detail dalam error untuk bagian ConfigMap yang tidak valid. Dalam contoh sebelumnya, 8.8.8.256 bukan alamat IP yang valid.

Langkah selanjutnya