Tetapkan dnsPolicy untuk mengontrol perilaku DNS pod, dan gunakan hostAliases untuk memetakan domain ke alamat IP tetap.
Prasyarat
Cara kerja CoreDNS di ACK
ACK menyebarkan CoreDNS di setiap kluster. Sebuah Service bernama kube-dns mengeksposnya untuk kueri DNS pod. Secara default, dua Pod coredns berfungsi sebagai backend.
Periksa komponen DNS di kluster Anda:
# Periksa Service kube-dns
kubectl get svc kube-dns -n kube-system
# Periksa Deployment coredns
kubectl get deployment coredns -n kube-system
Lihat Ikhtisar DNS.
Tetapkan kebijakan DNS untuk sebuah pod
dnsPolicy mengontrol cara sebuah pod menyelesaikan nama domain. ACK mendukung empat kebijakan:
| Kebijakan | Perilaku |
|---|---|
ClusterFirst |
Pod menggunakan CoreDNS. /etc/resolv.conf mengarah ke Service kube-dns. Kebijakan default. |
None |
Pod mengabaikan pengaturan DNS kluster. Gunakan dnsConfig untuk pengaturan kustom; tanpa itu, tidak ada nama yang dapat diselesaikan. |
Default |
Pod mewarisi pengaturan DNS dari nodenya. Di ACK, node adalah Instance ECS, sehingga pod menggunakan /etc/resolv.conf node tersebut, yang mengarah ke Alibaba Cloud DNS. CoreDNS dilewati. |
ClusterFirstWithHostNet |
Untuk pod hostNetwork. Tanpa kebijakan ini, pod hostNetwork secara default menggunakan Default dan tidak dapat mengakses Service kluster. |
Defaultbukanlah kebijakan default. Jika Anda menghilangkandnsPolicy, pod akan menggunakanClusterFirst.
Gunakan CoreDNS untuk menyelesaikan nama domain
Gunakan ClusterFirst (default) ketika pod perlu mengakses Service kluster lainnya.
Tetapkan dnsPolicy: ClusterFirst dalam spesifikasi pod:
apiVersion: v1
kind: Pod
metadata:
name: alpine
namespace: default
spec:
containers:
- image: alpine
command:
- sleep
- "10000"
imagePullPolicy: Always
name: alpine
dnsPolicy: ClusterFirst
Terapkan manifes dan verifikasi resolusi DNS:
kubectl apply -f pod.yaml
# Verifikasi bahwa pod dapat menyelesaikan Service kluster dengan benar
kubectl exec alpine -- nslookup kubernetes.default
Kustomisasi pengaturan DNS untuk sebuah pod
Gunakan dnsPolicy: None untuk kontrol penuh atas server DNS dan domain pencarian pod.
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.xx.xx"]
searches:
- default.svc.cluster.local
- svc.cluster.local
- cluster.local
options:
- name: ndots
value: "2"
dnsConfig menerima properti-properti berikut:
-
nameservers: Alamat IP server DNS untuk pod. Maksimal tiga. Wajib jika
dnsPolicybernilaiNone; opsional jika tidak. Digabungkan dengan nameserver yang dihasilkan oleh kebijakan; duplikat dihapus. -
searches: Domain pencarian DNS untuk pencarian hostname. Opsional. Maksimal enam. Digabungkan dengan domain pencarian yang dihasilkan oleh kebijakan; duplikat dihapus. Hanya domain pertama yang dicoba jika server DNS tidak dapat dijangkau.
-
options: Objek dengan
namewajib danvalueopsional. Digabungkan dengan opsi yang dihasilkan oleh kebijakan; duplikat dihapus. Lihat Kebijakan resolusi dan caching DNS.
Terapkan manifes dan verifikasi:
kubectl apply -f pod.yaml
# Periksa konfigurasi DNS di dalam pod
kubectl exec alpine -- cat /etc/resolv.conf
Lihat DNS untuk Service dan Pod.
Gunakan pengaturan DNS node
Gunakan dnsPolicy: Default ketika pod tidak memerlukan Service kluster dan harus menyelesaikan melalui Alibaba Cloud DNS, bukan CoreDNS.
apiVersion: v1
kind: Pod
metadata:
name: alpine
namespace: default
spec:
containers:
- image: alpine
command:
- sleep
- "10000"
imagePullPolicy: Always
name: alpine
dnsPolicy: Default
Terapkan manifes dan verifikasi:
kubectl apply -f pod.yaml
# Konfirmasi bahwa pod mewarisi resolv.conf dari node
kubectl exec alpine -- cat /etc/resolv.conf
Aktifkan pod hostNetwork untuk mengakses Service kluster
Pod dengan hostNetwork: true secara default menggunakan kebijakan DNS Default dan tidak dapat mengakses Service kluster berdasarkan nama. Tetapkan dnsPolicy: ClusterFirstWithHostNet untuk memulihkan resolusi DNS kluster.
apiVersion: v1
kind: Pod
metadata:
name: alpine
namespace: default
spec:
hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet
containers:
- image: alpine
command:
- sleep
- "10000"
imagePullPolicy: Always
name: alpine
Terapkan manifes dan verifikasi:
kubectl apply -f pod.yaml
# Verifikasi bahwa pod dapat menyelesaikan Service kluster dengan benar
kubectl exec alpine -- nslookup kubernetes.default
Petakan nama domain ke alamat IP tertentu
Dua metode tersedia:
-
Semua pod (global): Aktifkan plugin hosts CoreDNS untuk menerapkan pemetaan di seluruh kluster. Lihat Konfigurasikan fitur tambahan berdasarkan CoreDNS.
-
Pod individual: Gunakan bidang
hostAliasesuntuk menambahkan entri ke/etc/hostspod tersebut.
Tambahkan alias host ke sebuah pod
hostAliases menambahkan entri ke /etc/hosts pod setelah Kubernetes menginisialisasi file tersebut.
Jangan mengedit /etc/hosts secara langsung. File ini dikelola oleh kubelet dan akan menimpa perubahan manual saat pod dimulai ulang atau restart.
apiVersion: v1
kind: Pod
metadata:
name: hostaliases-pod
spec:
hostAliases:
- ip: "127.0.**.**"
hostnames:
- "foo.local"
- "bar.local"
- ip: "10.1.**.**"
hostnames:
- "foo.remote"
containers:
- name: cat-hosts
image: busybox:1.28
command:
- cat
args:
- "/etc/hosts"
Setelah inisialisasi, /etc/hosts berisi entri yang dikelola Kubernetes diikuti oleh alias Anda:
# File hosts yang dikelola Kubernetes.
127.0.**.** localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
fe00::0 ip6-mcastprefix
fe00::1 ip6-allnodes
fe00::2 ip6-allrouters
10.200.**.** hostaliases-pod
# Entri yang ditambahkan oleh HostAliases.
127.0.**.** foo.local bar.local
10.1.**.** foo.remote
Terapkan manifes dan verifikasi bahwa alias terselesaikan dengan benar:
kubectl apply -f hostaliases-pod.yaml
# Periksa apakah alias muncul di /etc/hosts
kubectl exec hostaliases-pod -- cat /etc/hosts
# Verifikasi resolusi
kubectl exec hostaliases-pod -- nslookup foo.local
Langkah selanjutnya
-
Praktik terbaik untuk layanan DNS — optimalkan performa dan keandalan DNS di ACK.
-
Kebijakan resolusi dan caching DNS — referensi resolusi dan caching CoreDNS.