DNS untuk Service dan Pod

Laman ini menyediakan ikhtisar dari dukungan DNS oleh Kubernetes.

Pendahuluan

Kubernetes DNS melakukan scheduling DNS Pod dan Service yang ada pada klaster, serta melakukan konfigurasi kubelet untuk memberikan informasi bagi setiap Container untuk menggunakan DNS Service IP untuk melakukan resolusi DNS.

Apa Sajakah yang Mendapatkan Nama DNS?

Setiap Service yang didefinisikan di dalam klaster (termasuk server DNS itu sendiri) memiliki nama DNS. Secara default, sebuah list pencarian DNS pada Pod klien akan mencantumkan namespace Pod itu sendiri serta domain default klaster. Hal ini dapat diilustrasikan dengan contoh berikut:

Asumsikan sebuah Service dengan nama foo pada Kubernetes dengan namespace bar. Sebuah Pod yang dijalankan di namespace bar dapat melakukan resolusi terhadap Service ini dengan melakukan query DNS untuk foo. Sebuah Pod yang dijalankan pada namespace quux dapat melakukan resolusi Service ini dengan melakukan query DNS untuk foo.bar.

Bagian di bawah ini akan menampilkan detail tipe rekaman serta layout yang didukung. Layout atau nama query lain yang dapat digunakan dianggap sebagai detail implementasi yang bisa saja berubah tanpa adanya pemberitahuan sebelumnya. Untuk informasi spesifikasi terbaru kamu dapat membaca Service Discovery pada Kubernetes berbasis DNS.

Service

A record

Service "Normal" (bukan headless) akan diberikan sebuah A record untuk sebuah nama dalam bentuk my-svc.my-namespace.svc.cluster-domain.example. Inilah yang kemudian digunakan untuk melakukan resolusi IP klaster dari Service tersebut.

Service "Headless" (tanpa IP klaster) juga memiliki sebuah A record DNS dengan format my-svc.my-namespace.svc.cluster-domain.example. Tidak seperti halnya Service normal, DNS ini akan melakukan resolusi pada serangkauan IP dari Pod yang dipilih oleh Service tadi. Klien diharapkan untuk mengkonsumsi serangkaian IP ini atau cara lain yang digunakan adalah pemilihan menggunakan penjadwalan Round-Robin dari set yang ada.

SRV record

SRV record dibuat untuk port bernama yang merupakan bagian dari Service normal maupun Headless Services. Untuk setiap port bernama, SRV record akan memiliki format _my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster-domain.example. Untuk sebuah Service normal, ini akan melakukan resolusi pada nomor port dan nama domain: my-svc.my-namespace.svc.cluster-domain.example. Untuk Service headless, ini akan melakukan resolusi pada serangkaian Pod yang merupakan backend dari Service tersebut yang memiliki format: auto-generated-name.my-svc.my-namespace.svc.cluster-domain.example.

Pod

Hostname Pod dan Field Subdomain

Saat ini ketika sebuah Pod dibuat, hostname-nya adalah nilai dari metadata.name.

Spek Pod memiliki field opsional hostname, yang dapat digunakan untuk menspesifikasikan hostname Pod. Ketika dispesifikasikan, maka nama ini akan didahulukan di atas nama Pod . Misalnya, sebuah Pod dengan hostname yang diberikan nilai "my-host", maka hostname Pod tersebut akan menjadi "my-host".

Spek Pod juga memiliki field opsional subdomain yang dapat digunakan untuk menspesifikasikan subdomain Pod tersebut. Misalnya saja sebuah Pod dengan hostname yang diberi nilai "foo", dan subdomain yang diberi nilai "bar", pada namespace "my-namespace", akan memiliki fully qualified domain name (FQDN) "foo.bar.my-namespace.svc.cluster-domain.example".

Contoh:

apiVersion: v1
kind: Service
metadata:
  name: default-subdomain
spec:
  selector:
    name: busybox
  clusterIP: None
  ports:
  - name: foo # Actually, no port is needed.
    port: 1234
    targetPort: 1234
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox1
  labels:
    name: busybox
spec:
  hostname: busybox-1
  subdomain: default-subdomain
  containers:
  - image: busybox:1.28
    command:
      - sleep
      - "3600"
    name: busybox
---
apiVersion: v1
kind: Pod
metadata:
  name: busybox2
  labels:
    name: busybox
spec:
  hostname: busybox-2
  subdomain: default-subdomain
  containers:
  - image: busybox:1.28
    command:
      - sleep
      - "3600"
    name: busybox

Jika terdapat sebuah Service headless memiliki nama yang sama dengan subdomain dari suatu Pod pada namespace yang sama, server KubeDNS klaster akan mengembalikan A record untuk FQDN Pod. Sebagai contoh, misalnya terdapat sebuah Pod dengan hostname "busybox-1" dan subdomain "default-subdomain", serta sebuah Service headless dengan nama "default-subdomain"
berada pada suatu namespace yang sama, maka Pod tersebut akan menerima FQDN dirinya sendiri sebagai "busybox-1.default-subdomain.my-namespace.svc.cluster-domain.example". DNS mengembalikan A record pada nama tersebut dan mengarahkannya pada IP Pod. Baik Pod "busybox1" dan "busybox2" bisa saja memiliki A record yang berbeda.

Objek Endpoint dapat menspesifikasikan hostname untuk alamat endpoint manapun beserta dengan alamat IP-nya.

Catatan: Karena A record tidak dibuat untuk sebuah Pod, maka hostname diperlukan agar sebuah Pod memiliki A record. Sebuah Pod yang tidak memiliki hostname tetapi memiliki subdomain hanya akan membuat sebuah A record untuk Service headless (default-subdomain.my-namespace.svc.cluster-domain.example), yang merujuk pada IP dari Pod tersebut. Pod juga harus dalam status ready agar dapat memiliki A record kecuali field publishNotReadyAddresses=True diaktifkan pada Service.

Kebijakan DNS Pod

Kebijakan DNS dapat diaktifkan untuk setiap Pod. Kubernetes saat ini mendukung kebijakan DNS spesifik Pod (pod-specific DNS policies). Kebijakan ini dispesifikasikan pada field dnsPolicy yang ada pada spek Pod.

  • "Default": Pod akan mewarisi konfigurasi resolusi yang berasal dari Node dimana Pod tersebut dijalankan. Silakan baca diskusi terkait untuk detailnya.
  • "ClusterFirst": Query DNS apa pun yang tidak sesuai dengan sufiks domain klaster yang sudah dikonfigurasi misalnya "www.kubernetes.io", akan di-forward ke nameserver upstream yang diwarisi dari Node. Administrator klaster bisa saja memiliki stub-domain atau DNS usptream lain yang sudah dikonfigurasi. Silakan lihat diskusi terkait untuk detail lebih lanjut mengenai bagaimana query DNS melakukan hal tersebut.
  • "ClusterFirstWithHostNet": Untuk Pod yang dijalankan dengan menggunakan hostNetwork, kamu harus secara eksplisit mengaktifkan kebijakan DNS-nya menjadi "ClusterFirstWithHostNet".
  • "None": Hal ini mengisikan sebuah Pod untuk mengabaikan konfigurasi DNS dari environment Kubernetes Semua pengaturan DNS disediakan menngunakan field dnsConfig yang ada pada spek Pod. Silakan lihat konfigurasi DNS Pod di bawah.
Catatan: "Default" bukan merupakan nilai default kebijakan DNS. Jika dnsPolicy tidak secara eksplisit dispesifikasikan, maka “ClusterFirst” akan digunakan.

Contoh di bawah ini menunjukkan sebuah Pod dengan kebijakan DNS yang diubah menjadi "ClusterFirstWithHostNet" karena field hostNetwork diubah menjadi true.

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - image: busybox:1.28
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
    name: busybox
  restartPolicy: Always
  hostNetwork: true
  dnsPolicy: ClusterFirstWithHostNet

Konfigurasi DNS Pod

Konfigurasi DNS Pod mengizinkan pengguna untuk memiliki lebih banyak kontrol terhadap pengaturan DNS pada Pod.

Field dnsConfig bersifat opsional dan dapat digunakan dengan pengaturan dnsPolicy apa pun. Meskipun begitu, ketika field dnsPolicy pada sebuah Pod diubah menjadi "None", maka field dnsConfig harus dispesifikasikan.

Berikut merupakan properti yang dapat dispesifikasikan oleh pengguna pada field dnsConfig:

  • nameservers: serangkaian alamat IP yang akan digunakan sebagai server DNS bagi Pod. Jumlah maksimum dari IP yang dapat didaftarkan pada field ini adalah tiga buah IP. Ketika sebuah dnsPolicy pada Pod diubah menjadi "None", maka list ini setidaknya harus mengandung sebuah alamat IP, selain kasus tersebut properti ini bersifat opsional. Server yang didaftarkan akan digabungkan di dalam nameserver dasar yang dihasilkan dari kebijakan DNS yang dispesifikasikan, apabila terdapat duplikat terhadap alamat yang didaftarkan maka alamat tersebut akan dihapus.
  • searches: merupakan serangkaian domain pencarian DNS yang digunakan untuk proses lookup pada Pod. Properti ini bersifat opsional. Ketika dispesifikasikan, list yang disediakan akan digabungkan dengan nama domain pencarian dasar yang dihasilkan dari kebijakan DNS yang dipilih. Alamat yang duplikat akan dihapus. Nilai maksimum domain pencarian yang dapat didaftarkan adalah 6 domain.
  • options: merupakan sebuah list opsional yang berisikan objek dimana setiap objek bisa saja memiliki properti name (yang bersifat wajib). Isi dari properti ini akan digabungkan dengan opsi yang dihasilkan kebijakan DNS yang digunakan. Alamat yang duplikat akan dihapus.

Di bawah ini merupakan contoh sebuah Pod dengan pengaturan DNS kustom:

apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: dns-example
spec:
  containers:
  - name: test
    image: nginx
  dnsPolicy: "None"
  dnsConfig:
    nameservers:
    - 1.2.3.4
    searches:
    - ns1.svc.cluster-domain.example
    - my.dns.search.suffix
    options:
    - name: ndots
      value: "2"
    - name: edns0

Ketika Pod diatas dibuat, maka Container test memiliki isi berkas /etc/resolv.conf sebagai berikut:

nameserver 1.2.3.4
search ns1.svc.cluster-domain.example my.dns.search.suffix
options ndots:2 edns0

Untuk pengaturan IPv6, path pencarian dan name server harus dispesifikasikan sebagai berikut:

kubectl exec -it dns-example -- cat /etc/resolv.conf

Keluaran yang dihasilkan akan menyerupai:

nameserver fd00:79:30::a
search default.svc.cluster-domain.example svc.cluster-domain.example cluster-domain.example
options ndots:5

Keberadaan Fitur (Feature Availability)

Keberadaan Pod DNS Config dan DNS Policy "None"" diilustrasikan pada tabel di bawah ini.

versi k8s Dukungan Fitur
1.14 Stable
1.10 Beta (aktif secara default)
1.9 Alpha

Selanjutnya

Untuk petunjuk lebih lanjut mengenai administrasi konfigurasi DNS, kamu dapat membaca Cara Melakukan Konfigurasi Service DNS

Last modified July 10, 2020 at 10:24 PM PST : Replace EN links to ID links (0c799ef75)