All Products
Search
Document Center

Container Service for Kubernetes:Konfigurasikan kebijakan DNS Pod dan resolusi nama domain

Last Updated:Aug 21, 2026

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.
Default bukanlah kebijakan default. Jika Anda menghilangkan dnsPolicy, pod akan menggunakan ClusterFirst.

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 dnsPolicy bernilai None; 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 name wajib dan value opsional. 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 hostAliases untuk menambahkan entri ke /etc/hosts pod tersebut.

Tambahkan alias host ke sebuah pod

hostAliases menambahkan entri ke /etc/hosts pod setelah Kubernetes menginisialisasi file tersebut.

Peringatan

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