Container Service for Kubernetes (ACK) memungkinkan Anda untuk menerapkan NodeLocal DNSCache guna meningkatkan stabilitas dan performa penemuan layanan. NodeLocal DNSCache diimplementasikan sebagai DaemonSet dan menjalankan agen caching DNS pada setiap node klaster untuk meningkatkan efisiensi resolusi DNS dalam klaster ACK. Topik ini menjelaskan cara menerapkan dan mengonfigurasi NodeLocal DNSCache untuk aplikasi dalam klaster ACK.
Prasyarat
Klaster ACK telah dibuat. Untuk informasi lebih lanjut, lihat Buat klaster ACK yang dikelola.
Klien kubectl terhubung ke klaster. Untuk informasi lebih lanjut, lihat Dapatkan file kubeconfig klaster dan gunakan kubectl untuk terhubung ke klaster.
Batasan
NodeLocal DNSCache tidak mendukung pod yang berjalan di ACK Serverless cluster atau pada instance kontainer elastis dalam klaster ACK yang dikelola atau klaster ACK khusus.
Jika klaster Anda menggunakan plug-in jaringan Terway, versi Terway harus 1.0.10.301 atau lebih baru. Jika klaster Anda menjalankan Terway dalam mode ENI inklusif berbasis IPvlan, Anda harus memodifikasi konfigurasi Terway. Untuk informasi lebih lanjut, lihat Modifikasi konfigurasi Terway (Klaster yang dibuat menggunakan versi awal Terway).
NodeLocal DNSCache berfungsi sebagai proxy caching transparan untuk CoreDNS dan tidak menyediakan plug-in seperti hosts atau rewrite. Jika Anda ingin mengaktifkan plug-in ini, modifikasi konfigurasi CoreDNS.
Jika Anda tidak memodifikasi konfigurasi CoreDNS sebelum menggunakan NodeLocal DNSCache, CoreDNS mungkin gagal menyelesaikan nama domain eksternal. Untuk informasi lebih lanjut, lihat Konfigurasikan protokol default untuk Forward plug-in dan server DNS upstream dari VPC.
Pengenalan
ACK NodeLocal DNSCache adalah solusi caching DNS lokal yang dikembangkan berdasarkan proyek NodeLocal DNSCache open source. Solusi ini terdiri dari agen caching DNS yang berjalan sebagai DaemonSet dan pengontrol admission yang berjalan sebagai Deployment untuk menyuntikkan DNSConfig secara dinamis.
Pengontrol admission mencegat permintaan pembuatan pod berdasarkan admission webhook dan menyuntikkan DNSConfig secara dinamis ke dalam konfigurasi pod.
CatatanJika Anda tidak mengaktifkan pengontrol admission untuk menyuntikkan DNSConfig secara otomatis, Anda harus menambahkan pengaturan DNS secara manual ke konfigurasi pod. Untuk informasi lebih lanjut, lihat Metode 2: Tentukan DNSConfig secara manual.
DaemonSet yang menjalankan agen caching DNS pada setiap node dapat membuat antarmuka jaringan virtual. Secara default, antarmuka jaringan virtual mendengarkan kueri DNS yang dikirim ke alamat IP 169.254.20.10. Untuk mengubah alamat IP, submit a ticket. Kueri DNS yang dihasilkan dalam pod diproksi oleh DaemonSet berdasarkan DNSConfig pod dan pengaturan jaringan node.
PentingDaemonSet yang menjalankan agen caching DNS dibangun berdasarkan CoreDNS dan hanya menyediakan layanan proxy dan caching. Jangan aktifkan plug-in lain seperti hosts atau rewrite.
Untuk informasi lebih lanjut tentang kebijakan caching yang didukung oleh NodeLocal DNSCache, lihat Kebijakan resolusi DNS dan kebijakan caching.
Gambar 1. Cara kerja NodeLocal DNSCache
No. | Deskripsi |
① | Secara default, pod dengan DNSConfig lokal yang disuntikkan menggunakan NodeLocal DNSCache untuk mendengarkan kueri DNS yang dikirim ke alamat IP 169.254.20.10 pada node. |
② | Jika NodeLocal DNSCache tidak menemukan cache hit untuk kueri DNS, layanan kube-dns digunakan untuk meminta CoreDNS menangani kueri tersebut. |
③ | CoreDNS menggunakan server DNS yang diterapkan di virtual private cloud (VPC) untuk menyelesaikan nama domain yang bukan milik klaster. |
④ | Jika pod dengan DNSConfig lokal yang disuntikkan gagal terhubung ke NodeLocal DNSCache, pod menggunakan layanan kube-dns untuk terhubung ke CoreDNS untuk resolusi DNS. |
⑤ | Pod tanpa DNSConfig lokal yang disuntikkan menggunakan layanan kube-dns untuk terhubung ke CoreDNS untuk resolusi DNS. |
Instal NodeLocal DNSCache
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Di halaman Clusters, temukan klaster yang ingin Anda kelola dan pilih di kolom Actions.
Di halaman Add-ons, klik tab Networking dan temukan ACK NodeLocal DNSCache.
Klik Install. Dalam pesan yang muncul, klik OK.
Konfigurasi NodeLocal DNSCache
Secara default, NodeLocal DNSCache tidak diinstal pada node master. Jika Anda ingin menerapkan pod bisnis pada node master dan node master ditambahkan dengan taint, Anda harus menambahkan toleransi yang sesuai ke konfigurasi node-local-dns di namespace kube-system.
Untuk mengarahkan ulang permintaan DNS yang ditujukan untuk CoreDNS ke DaemonSet yang menjalankan agen caching DNS, Anda harus mengatur parameter nameservers dalam konfigurasi pod ke 169.254.20.10 dan alamat IP kube-dns. Untuk melakukannya, gunakan salah satu metode berikut:
Metode 1: Suntikkan DNSConfig secara otomatis (Direkomendasikan): Gunakan pengontrol admission untuk menyuntikkan DNSConfig secara otomatis saat pod dibuat.
Metode 2: Tentukan DNSConfig secara manual: Tentukan DNSConfig secara manual saat pod dibuat.
Metode 3: Konfigurasikan parameter startup kubelet (Tidak direkomendasikan): Modifikasi parameter kubelet dan mulai ulang kubelet. Metode ini dapat mengganggu bisnis Anda.
Metode 1: Suntikkan DNSConfig secara otomatis
Anda dapat menggunakan pengontrol admission untuk menyuntikkan DNSConfig secara otomatis ke pod baru yang dibuat. Dengan cara ini, Anda tidak perlu mengonfigurasi file YAML pod secara manual. Secara default, aplikasi mendengarkan permintaan pembuatan pod dari namespace yang memiliki label node-local-dns-injection=enabled. Anda dapat menggunakan perintah berikut untuk menambahkan label ini ke namespace.
kubectl label namespace default node-local-dns-injection=enabledPerintah di atas hanya mengaktifkan penyuntikan DNSConfig otomatis untuk namespace default. Untuk mengaktifkan penyuntikan DNSConfig otomatis untuk namespace lainnya, ganti
defaultsesuai kebutuhan Anda.Jika penyuntikan DNSConfig otomatis diaktifkan untuk namespace tetapi Anda tidak ingin menyuntikkan DNSConfig secara otomatis ke beberapa pod, Anda dapat menambahkan label
node-local-dns-injection=disabledke template pod tersebut.Instance kontainer elastis tidak mendukung NodeLocal DNSCache. Saat Deployment diskalakan secara dinamis, pod baru mungkin dibuat pada instance kontainer elastis. Dalam kasus ini, pod baru yang berjalan pada instance kontainer elastis tidak dapat terhubung ke NodeLocal DNSCache, yang dapat menyebabkan kegagalan resolusi DNS. Untuk menyelesaikan masalah ini, Anda harus menonaktifkan penyuntikan DNSConfig otomatis untuk semua pod yang disediakan untuk Deployment dengan menambahkan
node-local-dns-injection=disabledke parameter label template pod.
Setelah penyuntikan DNSConfig otomatis diaktifkan, parameter berikut ditambahkan ke pod baru yang dibuat. Untuk memastikan ketersediaan tinggi layanan DNS, alamat IP klaster kube-dns ditambahkan ke parameter nameservers sebagai server DNS cadangan.
dnsConfig:
nameservers:
- 169.254.20.10
- 172.21.0.10
options:
- name: ndots
value: "3"
- name: attempts
value: "2"
- name: timeout
value: "1"
searches:
- default.svc.cluster.local
- svc.cluster.local
- cluster.local
dnsPolicy: NonePenyuntikan DNSConfig otomatis hanya berlaku jika pod memenuhi semua persyaratan berikut. Jika tidak ada alamat IP server DNS yang disuntikkan ke kontainer dalam pod, Anda perlu memeriksa apakah pod memenuhi persyaratan ini.
Pod baru yang dibuat tidak termasuk dalam namespace kube-system atau kube-public.
Namespace tempat pod baru dibuat memiliki label
node-local-dns-injection=enabled.Namespace tempat pod baru dibuat tidak memiliki label terkait Elastic Container Instance, seperti
virtual-node-affinity-injection,eci, danalibabacloud.com/eci.Pod baru yang dibuat tidak memiliki label terkait Elastic Container Instance, seperti
ecidanalibabacloud.com/eci, atau labelnode-local-dns-injection=disabled label.Pod baru yang dibuat menggunakan jaringan
hostNetworkdan kebijakan DNSClusterFirstWithHostNet, atau pod tidak menggunakan jaringanhostNetworktetapi menggunakan kebijakan DNSClusterFirst.
Metode 2: Tentukan DNSConfig secara manual
Jika Anda tidak ingin menggunakan admission webhook untuk menyuntikkan DNSConfig secara otomatis, Anda dapat memodifikasi konfigurasi pod untuk menentukan DNSConfig secara manual.
apiVersion: v1
kind: Pod
metadata:
name: alpine
namespace: default
spec:
containers:
- image: alpine
command:
- sleep
- "10000"
imagePullPolicy: Always
name: alpine
dnsPolicy: None
dnsConfig:
nameservers: ["169.254.20.10","172.21.0.10"]
searches:
- default.svc.cluster.local
- svc.cluster.local
- cluster.local
options:
- name: ndots
value: "3"
- name: attempts
value: "2"
- name: timeout
value: "1"dnsPolicy: Atur nilainya menjadi
None.nameservers: Atur nilainya menjadi 169.254.20.10 dan alamat IP klaster kube-dns.
searches: Atur domain pencarian DNS. Pastikan bahwa nama domain internal dapat diselesaikan.
ndots: Anda dapat meningkatkan efisiensi resolusi dengan mengatur parameter ini ke nilai yang lebih kecil. Nilai default: 5. Untuk informasi lebih lanjut, lihat resolv.conf.
Metode 3: Konfigurasikan parameter startup kubelet
Kubelet menggunakan parameter --cluster-dns dan --cluster-domain untuk mengontrol DNSConfig pod. Dalam file /etc/systemd/system/kubelet.service.d/10-kubeadm.conf, tambahkan parameter --cluster-dns dan atur nilainya ke alamat IP lokal 169.254.20.10. Kemudian, jalankan perintah sudo systemctl daemon-reload dan sudo systemctl restart kubelet agar perubahan diterapkan.
--cluster-dns=169.254.20.10 --cluster-dns=<kube-dns ip> --cluster-domain=<search domain>cluster-dns: menentukan server DNS yang digunakan dalam konfigurasi pod. Secara default, hanya alamat IP
`kube-dns`yang ditentukan. Anda harus menambahkan alamat IP lokal 169.254.20.10.cluster-domain: menentukan domain pencarian DNS yang digunakan dalam konfigurasi pod. Anda dapat menggunakan domain pencarian yang ada. Dalam banyak kasus, domain pencarian yang ada adalah
`cluster.local`.
Contoh cara mengonfigurasi NodeLocal DNSCache
Contoh berikut menunjukkan cara mengonfigurasi NodeLocal DNSCache untuk Deployment yang dibuat di namespace default.
Jalankan perintah berikut untuk menambahkan label ke namespace tempat Deployment berada. Dalam contoh ini, Deployment dibuat di namespace default.
kubectl label namespace default node-local-dns-injection=enabledPentingPengontrol admission mengabaikan aplikasi di namespace kube-system dan kube-public. Jangan konfigurasikan untuk menyuntikkan dnsConfig secara otomatis ke aplikasi di kedua namespace tersebut.
Terapkan aplikasi sampel di namespace default.
Gunakan template YAML berikut untuk membuat aplikasi sampel bernama ubuntu-deployment:
apiVersion: apps/v1 # for versions before 1.8.0 use apps/v1beta1 kind: Deployment metadata: name: ubuntu labels: app: ubuntu spec: replicas: 2 selector: matchLabels: app: ubuntu template: metadata: labels: app: ubuntu spec: containers: - name: ubuntu image: ubuntu command: ["sh", "-c"] args: ["sleep 100000"]Jalankan perintah berikut untuk menerapkan aplikasi di klaster:
kubectl apply -f ubuntu-deployment.yamlOutput yang diharapkan:
deployment.apps/ubuntu createdJalankan perintah berikut untuk melihat informasi tentang aplikasi:
kubectl get deployment ubuntuOutput yang diharapkan:
NAME READY UP-TO-DATE AVAILABLE AGE ubuntu 2/2 2 2 7s
Periksa apakah dnsConfig disuntikkan.
Jalankan perintah berikut untuk menanyakan pod yang menjalankan aplikasi:
kubectl get podsOutput yang diharapkan:
NAME READY STATUS RESTARTS AGE ubuntu-766448f68c-m**** 1/1 Running 0 4m39s ubuntu-766448f68c-w**** 1/1 Running 0 4m39sJalankan perintah berikut untuk memeriksa apakah NodeLocal DNSCache diaktifkan dalam dnsConfig pod:
kubectl get pod ubuntu-766448f68c-m**** -o=jsonpath='{.spec.dnsConfig}'Output yang diharapkan:
map[nameservers:[169.254.20.10 172.21.0.10] options:[map[name:ndots value:5]] searches:[default.svc.cluster.local svc.cluster.local cluster.local]]Output di atas menunjukkan bahwa NodeLocal DNSCache diaktifkan untuk aplikasi.
Setelah NodeLocal DNSCache diaktifkan untuk aplikasi, parameter berikut ditambahkan ke pod yang disediakan untuk aplikasi. Untuk memastikan ketersediaan tinggi layanan DNS, alamat IP klaster 172.21.0.10 dari layanan kube-dns ditentukan sebagai alamat IP server DNS cadangan dalam parameter nameservers.
dnsConfig: nameservers: - 169.254.20.10 - 172.21.0.10 options: - name: ndots value: "3" - name: attempts value: "2" - name: timeout value: "1" searches: - default.svc.cluster.local - svc.cluster.local - cluster.local dnsPolicy: None
Memperbarui NodeLocal DNSCache
Masuk ke Konsol ACK. Di panel navigasi di sebelah kiri, klik Clusters.
Di halaman Clusters, temukan kluster yang ingin Anda kelola dan klik namanya. Di panel navigasi di sebelah kiri, klik Add-ons.
Di halaman Add-ons, temukan NodeLocal DNSCache dan klik Upgrade. Di pesan yang muncul, klik OK.
CatatanJika Anda memodifikasi tolerations untuk DaemonSet node-local-dns, modifikasi tersebut akan ditimpa selama proses pembaruan. Anda harus mengonfigurasi ulang tolerations setelah pembaruan selesai.
Jika sistem gagal memperbarui NodeLocal DNSCache, lakukan pemecahan masalah berdasarkan kode kesalahan yang diberikan. Untuk informasi lebih lanjut, lihat Pemecahan Masalah Komponen.
Hapus Instalasi NodeLocal DNSCache
Masuk ke Konsol ACK. Di panel navigasi di sebelah kiri, klik Clusters.
Di halaman Clusters, temukan yang ingin Anda kelola dan klik namanya. Di panel navigasi di sebelah kiri, klik Add-ons.
Di halaman Add-ons, temukan NodeLocal DNSCache dan klik Uninstall. Di pesan yang muncul, klik OK.
CatatanSetelah NodeLocal DNSCache dihapus instalasinya, semua permintaan DNS dikirim ke CoreDNS. Kami menyarankan Anda untuk memperluas CoreDNS sebelum menghapus instalasi NodeLocal DNSCache.
Modifikasi konfigurasi Terway (Kluster yang dibuat menggunakan versi awal Terway)
Pada kluster yang dibuat dengan versi awal Terway, konfigurasi default Terway mungkin tidak mendukung NodeLocal DNSCache. Anda dapat merujuk pada langkah-langkah berikut untuk memeriksa dan memodifikasi konfigurasi Terway.
Jalankan perintah berikut untuk melihat ConfigMap dari Terway:
kubectl -n kube-system edit cm eni-config -o yamlPeriksa ConfigMap dari Terway.
Periksa apakah IPvlan diaktifkan di dalam bidang
eniip_virtual_type. Jika bidang ini tidak ada di dalam ConfigMap atau nilainya tidak diatur ke IPvlan, Anda tidak perlu melakukan langkah-langkah berikut sebelum menginstal NodeLocal DNSCache. Untuk informasi lebih lanjut, lihat Instal NodeLocal DNSCache.Periksa apakah bidang
host_stack_cidrsditentukan di dalam ConfigMap. Jika bidanghost_stack_cidrsditentukan, Anda tidak perlu melakukan langkah-langkah berikut sebelum menginstal NodeLocal DNSCache. Untuk informasi lebih lanjut, lihat Instal NodeLocal DNSCache.
Tambahkan bidang
host_stack_cidrske dalam ConfigMap Terway dan atur nilainya menjadi 169.254.20.10/32. Lalu, simpan ConfigMap dan keluar.10-terway.conf: | { "cniVersion": "0.3.0", "name": "terway", "eniip_virtual_type": "IPVlan", "host_stack_cidrs": ["169.254.20.10/32"], "type": "terway" }Jalankan perintah berikut untuk menanyakan semua DaemonSet pod yang disediakan untuk Terway:
kubectl -n kube-system get pod | grep terway-eniipOutput yang diharapkan:
terway-eniip-7**** 2/2 Running 0 30m terway-eniip-s**** 2/2 Running 0 30mJalankan perintah berikut untuk membuat ulang pod Terway:
kubectl -n kube-system delete pod terway-eniip-7**** terway-eniip-s****Masuk ke salah satu node kluster dan jalankan perintah berikut untuk menanyakan ConfigMap dari Terway.
Jika ConfigMap berisi blok CIDR yang Anda tambahkan, maka ConfigMap dari Terway telah dimodifikasi.
cat /etc/cni/net.d/*Output yang diharapkan:
{ "cniVersion": "0.3.0", "name": "terway-chainer", "plugins": [ { "eniip_virtual_type": "IPVlan", "host_stack_cidrs": [ "169.254.20.10/32", ], "type": "terway" }, { "type": "cilium-cni" } ] }Setelah semua pod Terway dibuat ulang dan berjalan normal, Anda dapat menginstal NodeLocal DNSCache.