diff --git a/content/id/docs/concepts/extend-kubernetes/api-extension/custom-resources.md b/content/id/docs/concepts/extend-kubernetes/api-extension/custom-resources.md new file mode 100644 index 0000000000..7599fecef7 --- /dev/null +++ b/content/id/docs/concepts/extend-kubernetes/api-extension/custom-resources.md @@ -0,0 +1,222 @@ +--- +title: Custom Resource +content_template: templates/concept +weight: 20 +--- + +{{% capture overview %}} + +_Custom Resource_ adalah ekstensi dari Kubernetes API. Laman ini mendiskusikan kapan kamu melakukan penambahan sebuah _Custom Resource_ ke klaster Kubernetes dan kapan kamu menggunakan sebuah layanan mandiri. Laman ini mendeskripsikan dua metode untuk menambahkan _Custom Resource_ dan bagaimana cara memilihnya. + +{{% /capture %}} + +{{% capture body %}} + +## _Custom Resource_ + +Sebuah sumber daya adalah sebuah *endpoint* pada [Kubernetes API](/docs/reference/using-api/api-overview/) yang menyimpan sebuah koleksi [objek API](/docs/concepts/overview/working-with-objects/kubernetes-objects/) dari sebuah jenis tertentu. Sebagai contoh, sumber daya bawaan Pod mengandung sebuah koleksi objek-objek Pod. + +Sebuah _Custom Resource_ adalah sebuah ekstensi dari Kubernetes API yang tidak seharusnya tersedia pada pemasangan default Kubernetes. Namun, banyak fungsi-fungsi inti Kubernetes yang sekarang dibangun menggunakan _Custom Resource_, membuat Kubernetes lebih modular. + +_Custom Resource_ bisa muncul dan menghilang dalam sebuah klaster yang berjalan melalui registrasi dinamis (_dynamic registration_), dan admin-admin klaster bisa memperbaharui _Custom Resource_ secara independen dari klaster itu sendiri. Ketika sebuah _Custom Resource_ +dipasang, pengguna dapat membuat dan mengakses objek-objek _Custom Resource_ menggunakan [kubectl](/docs/user-guide/kubectl-overview/), seperti yang mereka lakukan untuk sumber daya bawaan seperti Pod. + +## _Controller_ Khusus + +Dengan sendirinya, _Custom Resource_ memungkinkan kamu untuk menyimpan dan mengambil data terstruktur. Ketika kamu menggabungkan sebuah _Custom Resource_ dengan _controller_ khusus, _Custom Resource_ akan memberikan sebuah API deklaratif yang sebenarnya. + +Sebuah [API deklaratif](/docs/concepts/overview/working-with-objects/kubernetes-objects/#memahami-konsep-objek-objek-yang-ada-pada-kubernetes) +memungkinkan kamu untuk mendeklarasikan atau menspesifikasikan keadaan dari sumber daya kamu dan mencoba untuk menjaga agar keadaan saat itu tersinkronisasi dengan keadaan yang diinginkan. *Controller* menginterpretasikan data terstruktur sebagai sebuah rekaman dari keadaan yang diinginkan pengguna, dan secara kontinu menjaga keadaan ini. + +Kamu bisa men-_deploy_ dan memperbaharui sebuah _controller_ khusus pada sebuah klaster yang berjalan, secara independen dari siklus hidup klaster itu sendiri. _Controller_ khusus dapat berfungsi dengan sumber daya jenis apapun, tetapi mereka sangat efektif ketika dikombinasikan dengan _Custom Resource_. [_Operator pattern_](https://coreos.com/blog/introducing-operators.html) mengkombinasikan _Custom Resource_ dan _controller_ khusus. Kamu bisa menggunakan _controller_ khusus untuk menyandi pengetahuan domain untuk aplikasi spesifik menjadi sebuah ekstensi dari Kubernetes API. + +## Haruskah _Custom Resource_ ditambahkan ke dalam klaster Kubernetes saya? + +Ketika membuat sebuah API baru, pikirkan apakah kamu ingin [mengagregasikan API kamu dengan API klaster Kubernetes](/docs/concepts/api-extension/apiserver-aggregation/) atau membiarkan API kamu berdiri sendiri. + +| Pilih agregasi API jika: | Pilih sebuah API yang berdiri sendiri jika: | +| ---------------------------- | ---------------------------- | +| API kamu bersifat [Deklaratif](#api-deklaratif). | API kamu tidak cocok dengan model [Deklaratif](#api-deklaratif). | +| Kamu mau tipe baru yang dapat dibaca dan ditulis dengan `kubectl`.| Dukungan `kubectl` tidak diperlukan | +| Kamu mau melihat tipe baru pada sebuah Kubernetes UI, seperti dasbor, bersama dengan tipe-tipe bawaan. | Dukungan Kubernetes UI tidak diperlukan. | +| Kamu mengembangkan sebuah API baru. | Kamu memiliki sebuah program yang melayani API kamu dan dapat berkerja dengan baik. | +| Kamu bersedia menerima pembatasan format yang Kubernetes terapkan pada jalur sumber daya API (Lihat [Ikhtisar API](/docs/concepts/overview/kubernetes-api/).) | Kamu perlu memiliki jalur REST spesifik agar menjadi cocok dengan REST API yang telah didefinisikan. | +| Sumber daya kamu secara alami mencakup hingga sebuah klaster atau sebuah *namespace* dari sebuah klaster. | Sumber daya yang mencakup klaster atau *namespace* adalah sebuah ketidakcocokan; kamu perlu mengendalikan jalur sumber daya spesifik. | +| Kamu ingin menggunakan kembali [dukungan fitur Kubernetes API](#fitur-umum). | Kamu tidak membutuhkan fitur tersebut. | + +### API Deklaratif + +Dalam sebuah API Deklaratif, biasanya: + +- API kamu terdiri dari sejumlah kecil dari objek yang berukuran relatif kecil (sumber daya). +- Objek-objek mendefinisikan pengaturan dari aplikasi atau infrastruktur. +- Objek-objek relatif tidak sering diperbaharui. +- Manusia sering diperlukan untuk membaca dan menulis objek-objek tersebut. +- Operasi utama terhadap objek bersifat CRUD (*creating, reading, updating,* dan *deleting*). +- Transaksi antar objek tidak dibutuhkan; API merepresentasikan sebuah keadaan yang diinginkan, bukan keadaan yang eksak. + +API imperatif bersifat tidak deklaratif. +Tanda-tanda apabila API kamu tidak deklaratif termasuk: +- klien berkata "lakukan ini", dan kemudian mendapat sebuah respon serempak ketika selesai. +- klien berkata "lakukan ini", dan kemudian mendapat sebuah ID operasi kembali, dan harus melakukan sebuah cek terhadap objek _Operation_ terpisah untuk menentukan selesainya sebuah permintaan. +- Kamu berbicara tentang _Remote Procedure Call_ (RPC). +- Menyimpan secara langsung sejumlah data (mis. > beberapa kB per objek, atau >1000-an objek). +- Membutuhkan akses dengan _bandwidth_ tinggi (10-an permintaan per detik dapat ditopang). +- Menyimpan data pengguna (seperti gambar, PII, dll) atau data berskala besar yang diproses oleh aplikasi. +- Operasi-operasi natural terhadap objek yang tidak bersifat CRUD. +- API yang tidak mudah dimodelkan dengan objek. +- Kamu memilih untuk merepresentasikan operasi tertunda dengan sebuah ID operasi atau sebuah objek operasi. + +## Apakah saya harus menggunakan sebuah ConfigMap atau sebuah _Custom Resource_? + +Gunakan ConfigMap jika salah satu hal berikut berlaku: +* Terdapat sebuah format berkas pengaturan yang sudah ada, yang terdokumentasi dengan baik seperti sebuah `mysql.cnf` atau `pom.xml`. +* Kamu ingin menaruh seluruh berkas pengaturan kedalam sebuah *key* dari sebuah ConfigMap. +* Kegunaan utama dari berkas pengaturan adalah untuk dikonsumsi sebuah program yang berjalan di dalam sebuah Pod di dalam klaster kamu untuk mengatur dirinya sendiri. +* Konsumen dari berkas lebih suka untuk mengkonsumsi lewat berkas dalam sebuah Pod atau variabel lingkungan dalam sebuah Pod, dibandingkan melalui Kubernetes API. +* Kamu ingin melakukan pembaharuan bergulir lewat Deployment, dll, ketika berkas diperbaharui. + +{{< note >}} +Gunakan sebuah [Secret](/docs/concepts/configuration/secret/) untuk data sensitif, yang serupa dengan ConfigMap tetapi lebih aman. +{{< /note >}} + +Gunakan sebuah _Custom Resource_ (CRD atau _Aggregated API_) jika kebanyakan dari hal berikut berlaku: + +* Kamu ingin menggunakan pustaka klien Kubernetes dan CLI untuk membuat dan memperbaharui sumber daya baru. +* Kamu ingin dukungan tingkat tinggi dari kubectl (sebagai contoh: `kubectl get my-object object-name`). +* Kamu ingin membangun sebuah otomasi baru yang mengawasi pembaharuan terhadap objek baru, dan kemudian melakukan CRUD terhadap objek lainnya, atau sebaliknya. +* Kamu ingin menulis otomasi yang menangani pembaharuan untuk objek. +* Kamu ingin menggunakan kesepakatan API Kubernetes seperti `.spec`, `.status`, dan `.metadata`. +* Kamu ingin objek tersebut untuk menjadi sebuah abstraksi terhadap sebuah kumpulan dari sumber daya terkontrol, atau peringkasan dari sumber daya lainnya. + +## Menambahkan _Custom Resource_ + +Kubernetes menyediakan dua cara untuk menambahkan sumber daya ke klaster kamu: +- CRD cukup sederhana dan bisa diciptakan tanpa pemrograman apapun. +- [Agregasi API](/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/) membutuhkan pemrograman, tetapi memungkinkan kendali lebih terhadap perilaku API seperti bagaimana data disimpan dan perubahan antar versi API. + +Kubernetes menyediakan kedua opsi tersebut untuk memenuhi kebutuhan pengguna berbeda, jadi tidak ada kemudahan penggunaan atau fleksibilitas yang dikompromikan. + +_Aggregated API_ adalah bawahan dari APIServer yang duduk dibelakang API server utama, yang bertindak sebagai sebuah _proxy_. Pengaturan ini disebut [Agregasi API](/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/) (AA). Untuk pengguna, yang terlihat adalah Kubernetes API yang diperluas. + +CRD memungkinkan pengguna untuk membuat tipe baru sumber daya tanpa menambahkan APIserver lain. Kamu tidak perlu mengerti Agregasi API untuk menggunakan CRD. + +Terlepas dari bagaimana cara mereka dipasang, sumber daya baru disebut sebagai _Custom Resource_ untuk memisahkan mereka dari sumber daya bawaan Kubernetes (seperti Pod). + +## CustomResourceDefinition + +Sumber daya API [CustomResourceDefinition](/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/) memungkinkan kamu untuk medefinisikan _Custom Resource_. Mendefinisikan sebuah objek CRD akan membuat sebuah _Custom Resource_ dengan sebuah nama dan skema yang kamu spesifikasikan. Kubernetes API melayani dan menangani penyimpanan dari _Custom Resource_ kamu. + +Ini membebaskan kamu dari menulis server API kamu sendiri untuk menangani _Custom Resource_, tetapi sifat dasar dari implementasi menyebabkan kamu memiliki fleksibilitas yang berkurang dibanding [agregasi server API](#agregasi-server-api)). + +Lihat [contoh *controller* khusus](https://github.com/kubernetes/sample-controller) sebagai sebuah contoh dari bagaimana cara untuk mendaftarkan sebuah _Custom Resource_, bekerja dengan instans dari tipe baru sumber daya kamu, dan menggunakan sebuah *controller* untuk menangani *event*. + +## Agregasi server API + +Biasanya, tiap sumber daya di API Kubernetes membutuhkan kode yang menangani permintaan REST dan mengatur peyimpanan tetap dari objek-objek. Server Kubernetes API utama menangani sumber daya bawaan seperti Pod dan Service, dan juga menangani _Custom Resource_ dalam sebuah cara yang umum melalui [CRD](#customresourcedefinition). + +[Lapisan agregasi](/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/) memungkinkan kamu untuk menyediakan implementasi khusus untuk _Custom Resource_ dengan menulis dan men-_deploy_ API server kamu yang berdiri sendiri. API server utama menlimpahkan permintaan kepada kamu untuk _Custom Resource_ yang kamu tangani, membuat mereka tersedia untuk semua kliennya. + +## Memilih sebuah metode untuk menambahkan _Custom Resource_ + +CRD lebih mudah digunakan. _Aggregated API_ lebih fleksibel. Pilih metode yang paling baik untuk kebutuhan kamu. + +Biasanya, CRD cocok jika: + +* Kamu memiliki *field* yang banyak +* Kamu menggunakan sumber daya dalam perusahaan kamu, atau sebagai bagian dari proyek *open-source* kecil (berlawanan dengan sebuah produk komersil) + +### Membandingkan kemudahan penggunaan + +CRD lebih mudah dibuat dibandingkan dengan _Aggregated API_. + +| CRD | Aggregated API | +| --------------------------- | -------------- | +| Tidak membutuhkan pemrograman. Pengguna dapat memilih bahasa apapun untuk sebuah *controller* CRD. | Membutuhkan pemrograman dalam Go dan membangun *binary* dan *image*. Pengguna dapat memilih bahasa apapun untuk sebuah CRD *controller*. | +| Tidak ada servis tambahan yang dijalankan; CR ditangani oleh server API. | Sebuah servis tambahan untuk menciptakan dan dapat gagal. | +| Todal ada dukungan berjalan ketika CRD dibuat. Perbaikan *bug* apapun akan dianggap sebagai bagian dari peningkatan Kubernetes Master normal. | Mungkin dibutuhkan untuk secara berkala mengambil perbaikan *bug* dari sumber dan membangun ulang dan memeperbaharui APIserver teragregasi. | +| Tidak butuh untuk menangani banyak versi dari API kamu. Sebagai contoh: ketika kamu mengendalikan klien untuk sumber daya ini, kamu bisa meningkatkannya selaras dengan API. | Kamu perlu menangani banyak versi dari API kamu, sebagai contoh: ketika mengembangkan sebuah ekstensi untuk dibagikan kepada dunia. | + +### Fitur lanjutan dan fleksibilitas + +_Aggregated API_ menawarkan fitur API lebih lanjut dan kustomisasi dari fitur lain, sebagai contoh: lapisan penyimpanan. + +| Fitur | Deskripsi | CRD | Aggregated API | +| ------- | ----------- | ---- | -------------- | +| Validation | Membantu pengguna-pengguna mencegah error dan memungkinkan kamu untuk mengembangkan API kamu secara independen dari klien-klien kamu. Fitur ini sangan berguna ketika ada banyak klien yang tidak semua bisa memperbaharui secara bersamaan pada waktu yang sama. | Ya. Sebagian besar validasi dapat dipesifikasikan di dalam CRD [OpenAPI v3.0 _validation_](/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/#validation). Validasi bentuk lainnya didukung dengan penambahan sebuah [_Validating Webhook_](/docs/reference/access-authn-authz/admission-controllers/#validatingadmissionwebhook-alpha-in-1-8-beta-in-1-9). | Ya, cek validasi secara arbitrer | +| Defaulting | Lihat diatas | Ya, baik melalui [OpenAPI v3.0 _validation_](/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/#defaulting) `default` keyword (GA in 1.17), maupun melalui sebuah [_Mutating Webhook_](/docs/reference/access-authn-authz/admission-controllers/#mutatingadmissionwebhook) (meskipun tidak akan dijalankan ketika membaca dari etcd untuk objek-objek lama) | Ya | +| Multi-versioning | Memungkinkan menyajikan objek yang sama lwat dua versi API. Bisa membantu memudahkan perubahan API seperti menamai ulang *field-field*. Tidak terlalu penting jika kamu mengendalikan versi-versi klien kamu. | [Ya](/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definition-versioning) | Ya | +| Custom Storage | Jika kamu membutuhkan penyimpanan dengan sebuah mode performa (sebagai contoh, basis data *time-series* dibanding penyimpanan *key-value*) atau isolasi untuk keamanan (sebagau contoh, rahasia penyandian atau berkas berbeda) | Tidak | Ya | +| Custom Business Logic | Melakukan cek arbitrer atau tindakan-tindakan ketika membuat, membaca, atau memperbaharui sebuah objek | Ya, menggunakan [_Webhooks_](/docs/reference/access-authn-authz/extensible-admission-controllers/#admission-webhooks). | Ya | +| Scale Subresource | Memungkinkan sistem-sistem seperti HorizontalPodAutoscaler dan PodDisruptionBudget untuk berinteraksi dengan sumber daya baru | [Ya](/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/#scale-subresource) | Ya | +| Status Subresource |