Skip to content

Commit

Permalink
Initialize DNS Pod Service for ID Localization. (kubernetes#16707)
Browse files Browse the repository at this point in the history
Co-Authored-By: Giri Kuncoro <[email protected]>
Co-Authored-By: Tim Bannister <[email protected]>
  • Loading branch information
3 people authored and zacharysarah committed Dec 5, 2019
1 parent 2a75e3e commit 1956499
Show file tree
Hide file tree
Showing 2 changed files with 288 additions and 0 deletions.
268 changes: 268 additions & 0 deletions content/id/docs/concepts/services-networking/dns-pod-service.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,268 @@
---
title: DNS untuk Service dan Pod
content_template: templates/concept
weight: 20
---
{{% capture overview %}}
Laman ini menyediakan ikhtisar dari dukungan DNS oleh Kubernetes.
{{% /capture %}}

{{% capture body %}}

## Pendahuluan

Kubernetes DNS melakukan _scheduling_ DNS Pod dan Service yang ada pada kluster, 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 kluster (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_ kluster. 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](https://github.com/kubernetes/dns/blob/master/docs/specification.md).

## 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 kluster dari Service tersebut.

Service "Headless" (tanpa IP kluster) 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](/docs/concepts/services-networking/service/#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:

```yaml
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 kluster 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.

{{< note >}}
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.
{{< /note >}}

### 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](/docs/tasks/administer-cluster/dns-custom-nameservers/#inheriting-dns-from-the-node)
untuk detailnya.
- "`ClusterFirst`": _Query_ DNS apa pun yang tidak sesuai dengan sufiks domain kluster yang sudah dikonfigurasi
misalnya "`www.kubernetes.io`", akan di-_forward_ ke _nameserver_ _upstream_ yang diwarisi dari Node.
Administrator kluster bisa saja memiliki _stub-domain_ atau DNS _usptream_ lain yang sudah dikonfigurasi.
Silakan lihat [diskusi terkait](/docs/tasks/administer-cluster/dns-custom-nameservers/#impacts-on-pods)
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](#konfigurasi-dns-pod) di bawah.

{{< note >}}
"Default" bukan merupakan nilai _default_ kebijakan DNS.
Jika `dnsPolicy` tidak secara eksplisit dispesifikasikan, maka “ClusterFirst” akan digunakan.
{{< /note >}}


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

```yaml
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:

{{< codenew file="service/networking/custom-dns.yaml" >}}

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:

```shell
kubectl exec -it dns-example -- cat /etc/resolv.conf
```
Keluaran yang dihasilkan akan menyerupai:
```shell
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-fitur}

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 |

{{% /capture %}}

{{% capture whatsnext %}}

Untuk petunjuk lebih lanjut mengenai administrasi konfigurasi DNS, kamu dapat membaca
[Cara Melakukan Konfigurasi Service DNS](/docs/tasks/administer-cluster/dns-custom-nameservers/)

{{% /capture %}}
20 changes: 20 additions & 0 deletions content/id/examples/service/networking/custom-dns.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
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

0 comments on commit 1956499

Please sign in to comment.