|
| 1 | +--- |
| 2 | +title: Garbage Collection |
| 3 | +content_template: templates/concept |
| 4 | +weight: 60 |
| 5 | +--- |
| 6 | + |
| 7 | +{{% capture overview %}} |
| 8 | + |
| 9 | +Peran dari _garbage collector_ Kubernetes adalah untuk menghapus objek tertentu yang sebelumnya mempunyai pemilik, tetapi tidak lagi mempunyai pemilik. |
| 10 | + |
| 11 | +{{% /capture %}} |
| 12 | + |
| 13 | +{{% capture body %}} |
| 14 | + |
| 15 | +## Pemilik dan dependen |
| 16 | + |
| 17 | +Beberapa objek Kubernetes adalah pemilik dari objek lainnya. Sebagai contoh, sebuah ReplicaSet adalah pemilik dari sekumpulan Pod. Objek-objek yang dimiliki disebut *dependen* dari objek pemilik. Setiap objek dependen memiliki sebuah kolom `metadata.ownerReferences` yang menunjuk ke objek pemilik. |
| 18 | + |
| 19 | +Terkadang, Kubernetes menentukan nilai dari `ownerReference` secara otomatis. Sebagai contoh, ketika kamu membuat sebuah ReplicaSet, Kubernetes secara otomatis akan menentukan tiap kolom `ownerReference` dari tiap Pod di dalam ReplicaSet. Pada versi 1.8, Kubernetes secara otomatis menentukan nilai dari `ownerReference` untuk objek yang diciptakan atau diadopsi oleh ReplicationController, ReplicaSet, StatefulSet, DaemonSet, Deployment, Job dan CronJob. |
| 20 | + |
| 21 | +Kamu juga bisa menspesifikasikan hubungan antara pemilik dan dependen dengan cara menentukan kolom `ownerReference` secara manual. |
| 22 | + |
| 23 | +Berikut adalah berkas untuk sebuah ReplicaSet yang memiliki tiga Pod: |
| 24 | + |
| 25 | +{{< codenew file="controllers/replicaset.yaml" >}} |
| 26 | + |
| 27 | +Jika anda membuat ReplicaSet tersebut dan kemudian melihat metadata Pod, kamu akan melihat kolom OwnerReferences: |
| 28 | + |
| 29 | +```shell |
| 30 | +kubectl apply -f https://k8s.io/examples/controllers/replicaset.yaml |
| 31 | +kubectl get pods --output=yaml |
| 32 | +``` |
| 33 | + |
| 34 | +Keluaran menunjukkan bahwa pemilik Pod adalah sebuah ReplicaSet bernama `my-repset`: |
| 35 | + |
| 36 | +```shell |
| 37 | +apiVersion: v1 |
| 38 | +kind: Pod |
| 39 | +metadata: |
| 40 | + ... |
| 41 | + ownerReferences: |
| 42 | + - apiVersion: apps/v1 |
| 43 | + controller: true |
| 44 | + blockOwnerDeletion: true |
| 45 | + kind: ReplicaSet |
| 46 | + name: my-repset |
| 47 | + uid: d9607e19-f88f-11e6-a518-42010a800195 |
| 48 | + ... |
| 49 | +``` |
| 50 | +{{< note >}} |
| 51 | +Referensi pemilik lintas _namespace_ tidak diperbolehkan oleh desain. Artinya: |
| 52 | +1) Dependen dengan cakupan _namespace_ hanya bisa menspesifikasikan pemilik jika berada di _namespace_ yang sama, dan pemilik memiliki cakupan kluster. |
| 53 | +2) Dependen dengan cakupan kluster hanya bisa menspesifikasikan pemilik yang memiliki cakupan kluster, tetapi tidak berlaku untuk pemilik yang memiliki cakupan kluster. |
| 54 | +{{< /note >}} |
| 55 | + |
| 56 | +## Mengontrol bagaimana _garbage collector_ menghapus dependen |
| 57 | + |
| 58 | +Ketika kamu menghapus sebuah objek, kamu bisa menspesifikasi apakah dependen objek tersebut juga dihapus secara otomatis. Menghapus dependen secara otomatis disebut _cascading deletion_. _Cascading deletion_ memiliki dua mode: _background_ dan _foreground_. |
| 59 | + |
| 60 | + |
| 61 | + |
| 62 | +### Foreground cascading deletion |
| 63 | + |
| 64 | +Pada *foreground cascading deletion*, pertama objek utama akan memasuki keadaan "_deletion in progress_". Pada saat keadaan "_deletion in progress_", kondisi-kondisi berikut bernilai benar: |
| 65 | + |
| 66 | + * Objek masih terlihat via REST API |
| 67 | + * `deletionTimestamp` objek telah ditentukan |
| 68 | + * `metadata.finalizers` objek memiliki nilai `foregroundDeletion`. |
| 69 | + |
| 70 | + Ketika dalam keadaan "_deletion in progress_", _garbage collector_ menghapus dependen dari objek. Ketika _garbage collector_ telah menghapus semua "_blocking_" dependen (objek dengan `ownerReference.blockOwnerDeleteion=true`), _garbage collector_ menghapus objek pemilik. |
| 71 | + |
| 72 | + Jika kolom `ownerReferences` sebuah objek ditentukan oleh sebuah _controller_ (seperti Deployment atau Replicaset), `blockOwnerDeletion` akan ditentukan secara otomatis dan kamu tidak perlu memodifikasi kolom ini secara manual. |
| 73 | + |
| 74 | +### Background cascading deletion |
| 75 | + |
| 76 | + Pada *background cascading deletion*, Kubernetes segera menghapus objek pemilik dan _garbage collector_ kemudian menghapus dependen pada _background_. |
| 77 | + |
| 78 | +### Mengatur kebijakan _cascading deletion_ |
| 79 | + |
| 80 | + Untuk mengatur kebijakan _cascading deletion_, tambahkan kolom `propagationPolicy` pada argumen `deleteOptions` ketika menghapus sebuah Object. Nilai yang dapat digunakan adalah "Orphan", "Foreground", atau "Background". |
| 81 | + |
| 82 | + Sebelum Kubernetes 1.9, kebijakan _default_ dari _garbage collection_ untuk banyak _resource controller_ adalah **orphan**. Ini meliputi ReplicationController, ReplicaSet, StatefulSet, DaemonSet, dan Deployment. Untuk jenis pada kelompok versi `extensions/v1beta1`, `apps/v1beta1`, dan `apps/v1beta2`, kecuali kamu menspesifikasikan dengan cara lain, objek dependen adalah _orphan_ secara _default_. Pada Kubernetes 1.9, untuk semua jenis pada kelompok versi `apps/v1`, objek dependen dihapus secara _default_. |
| 83 | + |
| 84 | + Berikut sebuah contoh yang menghapus dependen di _background_: |
| 85 | + |
| 86 | +```shell |
| 87 | +kubectl proxy --port=8080 |
| 88 | +curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/replicasets/my-repset \ |
| 89 | +-d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Background"}' \ |
| 90 | +-H "Content-Type: application/json" |
| 91 | +``` |
| 92 | + |
| 93 | +Berikut adalah sebuah contoh yang mengapus dependen di _foreground_: |
| 94 | + |
| 95 | +```shell |
| 96 | +kubectl proxy --port=8080 |
| 97 | +curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/replicasets/my-repset \ |
| 98 | +-d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Foreground"}' \ |
| 99 | +-H "Content-Type: application/json" |
| 100 | +``` |
| 101 | + |
| 102 | +Berikut adalah contoh _orphan_ yang dependen: |
| 103 | + |
| 104 | +```shell |
| 105 | +kubectl proxy --port=8080 |
| 106 | +curl -X DELETE localhost:8080/apis/apps/v1/namespaces/default/replicasets/my-repset \ |
| 107 | +-d '{"kind":"DeleteOptions","apiVersion":"v1","propagationPolicy":"Orphan"}' \ |
| 108 | +-H "Content-Type: application/json" |
| 109 | +``` |
| 110 | + |
| 111 | +kubectl juga mendukung _cascading deletion_. Untuk menghapus dependen secara otomatis dengan menggunakan kubectl, Ubah nilai `--cascade` menjadi _true_. Untuk _orphan_ yang dependen, ubah nilai `--cascade` menjadi _false_. Nilai _default_ untuk `--cascade` adalah _true_. |
| 112 | + |
| 113 | +Berikut adalah contoh yang membuat dependen ReplicaSet menjadi _orphan_: |
| 114 | + |
| 115 | +```shell |
| 116 | +kubectl delete replicaset my-repset --cascade=false |
| 117 | +``` |
| 118 | + |
| 119 | +### Catatan tambahan untuk Deployment |
| 120 | + |
| 121 | +Sebelum versi 1.7, ketika menggunakan _cascading delete_ dengan Deployment, kamu *harus* menggunakan `propagationPolicy: Foreground` untuk menghapus tidak hanya ReplicaSet yang telah diciptakan, tetapi juga Pod yang mereka miliki. Jika tipe _propagationPolicy_ tidak digunakan, hanya ReplicaSet yag akan dihapus, dan Pod akan menjadi _orphan_. Lihat [kubeadm/#149](https://github.com/kubernetes/kubeadm/issues/149#issuecomment-284766613) untuk informasi lebih lanjut. |
| 122 | + |
| 123 | +## Isu yang diketahui |
| 124 | + |
| 125 | +Ditemukan pada [#26120](https://github.com/kubernetes/kubernetes/issues/26120) |
| 126 | + |
| 127 | +{{% /capture %}} |
| 128 | + |
| 129 | +{{% capture whatsnext %}} |
| 130 | + |
| 131 | +[Dokumen Desain 1](https://git.k8s.io/community/contributors/design-proposals/api-machinery/garbage-collection.md) |
| 132 | + |
| 133 | +[Dokumen Desain 2](https://git.k8s.io/community/contributors/design-proposals/api-machinery/synchronous-garbage-collection.md) |
| 134 | + |
| 135 | +{{% /capture %}} |
0 commit comments