Fitur DNS proxy dalam Service Mesh memungkinkan proxy sidecar berfungsi sebagai caching DNS proxy. Saat sebuah aplikasi mengirim kueri DNS, Service Mesh secara transparan mencegat dan menyelesaikan kueri tersebut. Topik ini menjelaskan cara mengaktifkan dan menggunakan fitur DNS proxy di ASM.
Prasyarat
-
Anda memiliki instans ASM versi 1.8.3.17 atau yang lebih baru. Untuk informasi selengkapnya, lihat Create an ASM instance.
-
Anda telah mengaktifkan injeksi sidecar otomatis untuk namespace default. Untuk informasi selengkapnya, lihat Enable automatic sidecar injection.
Latar Belakang
Secara default, setiap kluster ACK menyediakan layanan DNS untuk melakukan resolusi nama domain bagi workload. Hal ini memungkinkan aplikasi yang berjalan di kluster Kubernetes menggunakan DNS untuk menemukan layanan lain di dalam kluster tersebut.
Server DNS berjalan di setiap kluster Kubernetes, dan setiap pod menggunakan server DNS internal ini untuk resolusi nama domain. Secara default, permintaan DNS tidak dicegat oleh proxy sidecar, sehingga setiap aplikasi mencoba menyelesaikan nama DNS sebelum membuka koneksi ke layanan lain. Setelah Anda mengaktifkan fitur DNS proxy di ASM, proxy sidecar secara transparan mencegat dan menyelesaikan kueri DNS dari aplikasi, sehingga mempercepat resolusi nama domain.
Aktifkan DNS proxy
Skenario 1: Aktifkan DNS proxy secara global
-
Masuk ke ASM console. Di panel navigasi kiri, pilih .
-
Di halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih .
-
Di tab global, klik DNS Proxy, aktifkan sakelar Enable DNS Proxy Feature, lalu klik Update Settings.
-
Restart pod untuk menerapkan konfigurasi DNS.
Masuk ke ACK console. Di panel navigasi kiri, klik Clusters.
Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
-
Di halaman Pods, temukan pod target dan pilih pada kolom Actions.
-
Pada kotak dialog Message, klik Confirm.
Konfigurasi baru akan berlaku saat pod direstart.
Skenario 2: Aktifkan DNS proxy untuk namespace tertentu
-
Masuk ke ASM console. Di panel navigasi kiri, pilih .
-
Di halaman Mesh Management, klik nama instans ASM. Di panel navigasi kiri, pilih .
-
Di halaman Configure the agent parameters of the injected Sidecar, klik tab Namespaces.
-
Pilih Namespaces, klik DNS Proxy, aktifkan sakelar Enable DNS Proxy Feature, lalu klik Update Settings.
-
Restart pod untuk menerapkan konfigurasi DNS.
Masuk ke ACK console. Di panel navigasi kiri, klik Clusters.
Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
-
Di halaman Pods, temukan pod target dan pilih pada kolom Actions.
-
Pada kotak dialog Message, klik Confirm.
Konfigurasi baru akan berlaku saat pod direstart.
Skenario 3: Aktifkan DNS proxy untuk pod tertentu
Untuk mengaktifkan fitur DNS proxy pada pod tertentu, tambahkan anotasi ke konfigurasi YAML pod tersebut.
Masuk ke ACK console. Di panel navigasi kiri, klik Clusters.
Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
-
Di halaman Deployments, temukan aplikasi target dan pilih dari kolom Actions.
-
Di kotak dialog Edit YAML, tambahkan anotasi berikut ke spec.template.metadata.annotations, lalu klik Update.
annotations: proxy.istio.io/config: | proxyMetadata: ISTIO_META_DNS_CAPTURE: "true" ISTIO_META_DNS_AUTO_ALLOCATE: "true" -
Restart pod untuk menerapkan konfigurasi DNS.
Masuk ke ACK console. Di panel navigasi kiri, klik Clusters.
Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
-
Di halaman Pods, temukan pod target dan pilih pada kolom Actions.
-
Pada kotak dialog Message, klik Confirm.
Konfigurasi baru akan berlaku saat pod direstart.
Gunakan DNS proxy
Langkah 1: Buat ServiceEntry
Buat ServiceEntry untuk menambahkan aliyun.com ke registri layanan internal Service Mesh.
-
Masuk ke ASM console.
-
Di panel navigasi kiri, pilih .
-
Di halaman Mesh Management, temukan instans ASM yang ingin Anda konfigurasi. Klik nama instans ASM atau klik Manage pada kolom Actions.
-
Di halaman detail instans ASM, pilih . Di halaman yang muncul, klik Create from YAML.
-
Di halaman Create, pilih Namespaces, pilih Scenario Template, salin konten berikut ke dalam kotak teks, lalu klik Create.
apiVersion: networking.istio.io/v1beta1 kind: ServiceEntry metadata: name: test1-mydnsproxying spec: hosts: - aliyun.com location: MESH_EXTERNAL ports: - number: 443 name: https protocol: TLS resolution: DNS
Langkah 2: Sebarkan aplikasi contoh
-
Obtain the KubeConfig file of a cluster and use kubectl to connect to the cluster.
-
Buat file bernama sleep.yaml yang berisi konten berikut.
-
Jalankan perintah berikut untuk menyebarkan aplikasi sleep.
kubectl apply -f sleep.yaml -
Jalankan perintah berikut untuk memeriksa apakah pod sleep telah dimulai.
kubectl get pod |grep sleepOutput yang diharapkan:
NAME READY STATUS RESTARTS AGE sleep-66cd8f684f-nxw8v 2/2 Running 0 16m
Langkah 3: Aktifkan DNS proxy untuk kontainer sleep
Masuk ke ACK console. Di panel navigasi kiri, klik Clusters.
Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
-
Di halaman Deployments, temukan aplikasi target dan pilih dari kolom Actions.
-
Di kotak dialog Edit YAML, tambahkan anotasi berikut ke spec.template.metadata.annotations, lalu klik Update.
annotations: proxy.istio.io/config: | proxyMetadata: ISTIO_META_DNS_CAPTURE: "true" ISTIO_META_DNS_AUTO_ALLOCATE: "true" -
Restart pod untuk menerapkan konfigurasi DNS.
Masuk ke ACK console. Di panel navigasi kiri, klik Clusters.
Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
-
Di halaman Pods, temukan pod target dan pilih pada kolom Actions.
-
Pada kotak dialog Message, klik Confirm.
Konfigurasi baru akan berlaku saat pod direstart.
Langkah 4: Verifikasi DNS proxy
-
Periksa log kontainer istio-init.
Masuk ke ACK console. Di panel navigasi kiri, klik Clusters.
Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
-
Di halaman Pods, klik nama pod sleep.
-
Di halaman detail pod, klik tab Logs dan atur Containers menjadi istio-init.
Log berikut ditampilkan:
-A OUTPUT -p udp --dport 53 -d 192.168.0.10/32 -j REDIRECT --to-port 15053 -A ISTIO_OUTPUT -p tcp --dport 53 -d 192.168.0.10/32 -j REDIRECT --to-ports 15053Proxy sidecar mencegat semua kueri DNS dari kontainer aplikasi menggunakan aturan iptables, sama seperti mencegat jenis traffic lainnya. Istio menambahkan aturan iptables tambahan untuk mengarahkan semua paket DNS pada port 53 (TCP dan UDP) yang ditujukan ke layanan DNS Kubernetes, seperti layanan CoreDNS, ke port 15053.
-
Periksa port tempat proses pilot-agent mendengarkan.
Di panel navigasi kiri halaman manajemen kluster, pilih .
-
Di halaman Pods, temukan pod sleep, klik Terminal pada kolom Actions, lalu pilih istio-proxy.
-
Di kontainer istio-proxy, jalankan perintah berikut untuk memeriksa port tempat proses pilot-agent mendengarkan.
netstat -anp |grep 15053Output yang diharapkan:
tcp 0 0 127.0.0.1:15053 0.0.0.0:* LISTEN 1/pilot-agent udp 0 0 127.0.0.1:15053 0.0.0.0:* 1/pilot-agentKueri DNS dialihkan ke proses pilot-agent yang berjalan di kontainer proxy sidecar. Output menunjukkan bahwa proses tersebut sedang mendengarkan pada port 15053.
-
Akses aliyun.com.
Di panel navigasi kiri halaman manajemen kluster, pilih .
-
Di halaman Pods, temukan pod sleep, klik Terminal pada kolom Actions, lalu pilih sleep.
-
Di kontainer sleep, jalankan perintah berikut untuk mengakses aliyun.com.
curl -v https://aliyun.comOutput yang diharapkan:
* Trying 240.240.**.**:443... * Connected to aliyun.com (240.240.**.**) port 443 (#0)Alamat IP yang dikembalikan adalah 240.240.**.**. Ini adalah alamat dari Service Mesh yang ditetapkan secara otomatis oleh Service Mesh, bukan alamat IP publik yang sebenarnya. Service Mesh menggunakan iptables untuk membajak permintaan ke kube-dns dan mengarahkannya ke proxy sidecar yang berjalan di dalam Pod. Saat aplikasi mengirimkan permintaan ke alamat IP virtual ini, proxy sidecar menerjemahkannya ke alamat IP publik yang sebenarnya.
Aktifkan logging debug untuk DNS proxy
Anda dapat mengaktifkan logging debug untuk DNS proxy. Saat diaktifkan, pilot-agent mencatat setiap kueri DNS dari kontainer aplikasi.
Masuk ke ACK console. Di panel navigasi kiri, klik Clusters.
Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
-
Di halaman Deployments, temukan aplikasi target dan pilih dari kolom Actions.
-
Di kotak dialog Edit YAML, tambahkan anotasi berikut di bawah parameter spec dan klik Update.
annotations: sidecar.istio.io/agentLogLevel: "dns:debug"spec: progressDeadlineSeconds: 600 replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: app: sleep strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: labels: app: sleep annotations: sidecar.istio.io/agentLogLevel: "dns:debug" -
Jalankan perintah berikut di kluster untuk melihat log debug.
kubectl logs -n default sleep-85fdfd8896-2ctq4 -c istio-proxy | grep debugEntri log berisi
found=true, yang menunjukkan bahwa nama domain diselesaikan dari registri internal service mesh.