From 19564998c99c58d9b55b1b351d36cfa841dfa9c1 Mon Sep 17 00:00:00 2001 From: Irvi Aini <7439590+irvifa@users.noreply.github.com> Date: Thu, 5 Dec 2019 11:00:32 +0700 Subject: [PATCH] Initialize DNS Pod Service for ID Localization. (#16707) Co-Authored-By: Giri Kuncoro Co-Authored-By: Tim Bannister --- .../services-networking/dns-pod-service.md | 268 ++++++++++++++++++ .../service/networking/custom-dns.yaml | 20 ++ 2 files changed, 288 insertions(+) create mode 100644 content/id/docs/concepts/services-networking/dns-pod-service.md create mode 100644 content/id/examples/service/networking/custom-dns.yaml diff --git a/content/id/docs/concepts/services-networking/dns-pod-service.md b/content/id/docs/concepts/services-networking/dns-pod-service.md new file mode 100644 index 0000000000000..79ed200caeeca --- /dev/null +++ b/content/id/docs/concepts/services-networking/dns-pod-service.md @@ -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 %}} diff --git a/content/id/examples/service/networking/custom-dns.yaml b/content/id/examples/service/networking/custom-dns.yaml new file mode 100644 index 0000000000000..4216df6382710 --- /dev/null +++ b/content/id/examples/service/networking/custom-dns.yaml @@ -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