|
| 1 | +--- |
| 2 | +title: EndpointSlice |
| 3 | +feature: |
| 4 | + title: EndpointSlice |
| 5 | + description: > |
| 6 | + Pelacakan _endpoint_ jaringan yang dapat diskalakan pada klaster Kubernetes. |
| 7 | +
|
| 8 | +content_template: templates/concept |
| 9 | +weight: 15 |
| 10 | +--- |
| 11 | + |
| 12 | + |
| 13 | +{{% capture overview %}} |
| 14 | + |
| 15 | +{{< feature-state for_k8s_version="v1.17" state="beta" >}} |
| 16 | + |
| 17 | +EndpointSlice menyediakan sebuah cara yang mudah untuk melacak _endpoint_ jaringan dalam sebuah |
| 18 | +klaster Kubernetes. EndpointSlice memberikan alternatif yang lebih _scalable_ dan lebih dapat diperluas dibandingkan dengan Endpoints. |
| 19 | + |
| 20 | +{{% /capture %}} |
| 21 | + |
| 22 | +{{% capture body %}} |
| 23 | + |
| 24 | +## Motivasi |
| 25 | + |
| 26 | +Endpoints API telah menyediakan sebuah cara yang mudah dan sederhana untuk |
| 27 | +melacak _endpoint_ jaringan pada Kubernetes. Sayangnya, seiring dengan besarnya klaster Kubernetes |
| 28 | +dan Service, batasan-batasan yang dimiliki API tersebut semakin terlihat. |
| 29 | +Terutama, hal tersebut termasuk kendala-kendala mengenai proses _scaling_ _endpoint_ jaringan |
| 30 | +dalam jumlah yang besar. |
| 31 | + |
| 32 | +Karena semua _endpoint_ jaringan untuk sebuah Service disimpan dalam satu sumber daya |
| 33 | +Endpoints, sumber daya tersebut dapat menjadi cukup besar. Hal itu dapat mempengaruhi kinerja |
| 34 | +dari komponen-komponen Kubernetes (terutama _master control plane_) dan menyebabkan |
| 35 | +lalu lintas jaringan dan pemrosesan yang cukup besar ketika Endpoints berubah. |
| 36 | +EndpointSlice membantu kamu menghindari masalah-masalah tersebut dan juga menyediakan platform |
| 37 | +yang dapat diperluas untuk fitur-fitur tambahan seperti _topological routing_. |
| 38 | + |
| 39 | +## Sumber daya EndpointSlice |
| 40 | + |
| 41 | +Pada Kubernetes, sebuah EndpointSlice memiliki referensi-referensi terhadap sekumpulan _endpoint_ |
| 42 | +jaringan. _Controller_ EndpointSlice secara otomatis membuat EndpointSlice |
| 43 | +untuk sebuah Service Kubernetes ketika sebuah {{< glossary_tooltip text="selektor" |
| 44 | +term_id="selector" >}} dituliskan. EndpointSlice tersebut akan memiliki |
| 45 | +referensi-referensi menuju Pod manapun yang cocok dengan selektor pada Service tersebut. EndpointSlice mengelompokkan |
| 46 | +_endpoint_ jaringan berdasarkan kombinasi Service dan Port yang unik. |
| 47 | +Nama dari sebuah objek EndpointSlice haruslah berupa |
| 48 | +[nama subdomain DNS](/docs/concepts/overview/working-with-objects/names#dns-subdomain-names) yang sah. |
| 49 | + |
| 50 | +Sebagai contoh, berikut merupakan sampel sumber daya EndpointSlice untuk sebuah Service Kubernetes |
| 51 | +yang bernama `example`. |
| 52 | + |
| 53 | +```yaml |
| 54 | +apiVersion: discovery.k8s.io/v1beta1 |
| 55 | +kind: EndpointSlice |
| 56 | +metadata: |
| 57 | + name: example-abc |
| 58 | + labels: |
| 59 | + kubernetes.io/service-name: example |
| 60 | +addressType: IPv4 |
| 61 | +ports: |
| 62 | + - name: http |
| 63 | + protocol: TCP |
| 64 | + port: 80 |
| 65 | +endpoints: |
| 66 | + - addresses: |
| 67 | + - "10.1.2.3" |
| 68 | + conditions: |
| 69 | + ready: true |
| 70 | + hostname: pod-1 |
| 71 | + topology: |
| 72 | + kubernetes.io/hostname: node-1 |
| 73 | + topology.kubernetes.io/zone: us-west2-a |
| 74 | +``` |
| 75 | +
|
| 76 | +Secara bawaan, setiap EndpointSlice yang dikelola oleh _controller_ EndpointSlice tidak akan memiliki |
| 77 | +lebih dari 100 _endpoint_. Di bawah skala tersebut, EndpointSlice akan memetakan 1:1 |
| 78 | +dengan Endpoints dan Service dan akan memiliki kinerja yang sama. |
| 79 | +
|
| 80 | +EndpointSlice dapat bertindak sebagai sumber kebenaran untuk kube-proxy sebagai acuan mengenai |
| 81 | +bagaimana cara untuk merutekan lalu lintas jaringan internal. Ketika diaktifkan, EndpointSlice semestinya memberikan peningkatan |
| 82 | +kinerja untuk Service yang memiliki Endpoints dalam jumlah besar. |
| 83 | +
|
| 84 | +### Tipe-tipe Alamat |
| 85 | +
|
| 86 | +EndpointSlice mendukung tiga tipe alamat: |
| 87 | +
|
| 88 | +* IPv4 |
| 89 | +* IPv6 |
| 90 | +* FQDN (_Fully Qualified Domain Name_) |
| 91 | +
|
| 92 | +### Topologi |
| 93 | +
|
| 94 | +Setiap _endpoint_ pada EndpointSlice dapat memiliki informasi topologi yang relevan. |
| 95 | +Hal ini digunakan untuk mengindikasikan di mana _endpoint_ berada, berisi informasi mengenai |
| 96 | +Node yang bersangkutan, zona, dan wilayah. Ketika nilai-nilai tersebut tersedia, |
| 97 | +label-label Topology berikut akan ditambahkan oleh _controller_ EndpointSlice: |
| 98 | +
|
| 99 | +* `kubernetes.io/hostname` - Nama dari Node tempat _endpoint_ berada. |
| 100 | +* `topology.kubernetes.io/zone` - Zona tempat _endpoint_ berada. |
| 101 | +* `topology.kubernetes.io/region` - Region tempat _endpoint_ berada. |
| 102 | + |
| 103 | +Nilai-nilai dari label-label berikut berasal dari sumber daya yang diasosiasikan dengan tiap |
| 104 | +_endpoint_ pada sebuah _slice_. Label _hostname_ merepresentasikan nilai dari kolom NodeName |
| 105 | + pada Pod yang bersangkutan. Label zona dan wilayah merepresentasikan nilai |
| 106 | +dari label-label dengan nama yang sama pada Node yang bersangkutan. |
| 107 | + |
| 108 | +### Pengelolaan |
| 109 | + |
| 110 | +Secara bawaan, EndpointSlice dibuat dan dikelola oleh _controller_ |
| 111 | +EndpointSlice. Ada berbagai macam kasus lain untuk EndpointSlice, seperti |
| 112 | +implementasi _service mesh_, yang memungkinkan adanya entitas atau _controller_ lain |
| 113 | +yang dapat mengelola beberapa EndpointSlice sekaligus. Untuk memastikan beberapa entitas dapat |
| 114 | +mengelola EndpointSlice tanpa mengganggu satu sama lain, sebuah |
| 115 | +label `endpointslice.kubernetes.io/managed-by` digunakan untuk mengindikasikan entitas |
| 116 | +yang mengelola sebuah EndpointSlice. _Controller_ EndpointSlice akan menambahkan |
| 117 | +`endpointslice-controller.k8s.io` sebagai nilai dari label tersebut pada seluruh |
| 118 | +EndpointSlice yang dikelolanya. Entitas lain yang mengelola EndpointSlice juga diharuskan untuk |
| 119 | +menambahkan nilai yang unik untuk label tersebut. |
| 120 | + |
| 121 | +### Kepemilikan |
| 122 | + |
| 123 | +Pada kebanyakan kasus, EndpointSlice akan dimiliki oleh Service yang diikutinya. Hal ini diindikasikan dengan referensi pemilik pada tiap EndpointSlice dan |
| 124 | +juga label `kubernetes.io/service-name` yang memudahkan pencarian seluruh |
| 125 | +EndpointSlice yang dimiliki oleh sebuah Service. |
| 126 | + |
| 127 | +## _Controller_ EndpointSlice |
| 128 | + |
| 129 | +_Controller_ EndpointSlice mengamati Service dan Pod untuk memastikan EndpointSlice |
| 130 | +yang bersangkutan berada dalam kondisi terkini. _Controller_ EndpointSlice akan mengelola EndpointSlice untuk |
| 131 | +setiap Service yang memiliki selektor. Ini akan merepresentasikan IP dari Pod |
| 132 | +yang cocok dengan selektor dari Service tersebut. |
| 133 | + |
| 134 | +### Ukuran EndpointSlice |
| 135 | + |
| 136 | +Secara bawaan, jumlah _endpoint_ yang dapat dimiliki tiap EndpointSlice dibatasi sebanyak 100 _endpoint_. Kamu dapat |
| 137 | +mengaturnya melalui opsi `--max-endpoints-per-slice` {{< glossary_tooltip |
| 138 | +text="kube-controller-manager" term_id="kube-controller-manager" >}} sampai dengan |
| 139 | +jumlah maksimum sebanyak 1000 _endpoint_. |
| 140 | + |
| 141 | +### Distribusi EndpointSlice |
| 142 | + |
| 143 | +Tiap EndpointSlice memiliki sekumpulan _port_ yang berlaku untuk seluruh _endpoint_ dalam sebuah sumber daya. Ketika nama _port_ digunakan untuk sebuah Service, Pod mungkin mendapatkan |
| 144 | +nomor target _port_ yang berbeda-beda untuk nama _port_ yang sama, sehingga membutuhkan |
| 145 | +EndpointSlice yang berbeda. Hal ini mirip dengan logika mengenai bagaimana _subset_ dikelompokkan |
| 146 | +dengan Endpoints. |
| 147 | + |
| 148 | +_Controller EndpointSlice_ akan mencoba untuk mengisi EndpointSlice sebanyak mungkin, tetapi tidak |
| 149 | +secara aktif melakukan _rebalance_ terhadap EndpointSlice tersebut. Logika dari _controller_ cukup sederhana: |
| 150 | + |
| 151 | +1. Melakukan iterasi terhadap EndpointSlice yang sudah ada, menghapus _endpoint_ yang sudah tidak lagi |
| 152 | + dibutuhkan dan memperbarui _endpoint_ yang sesuai yang mungkin telah berubah. |
| 153 | +2. Melakukan iterasi terhadap EndpointSlice yang sudah dimodifikasi pada langkah pertama dan |
| 154 | + mengisinya dengan _endpoint_ baru yang dibutuhkan. |
| 155 | +3. Jika masih tersisa _endpoint_ baru untuk ditambahkan, mencoba untuk menambahkannya pada |
| 156 | + _slice_ yang tidak berubah sebelumnya dan/atau membuat _slice_ yang baru. |
| 157 | + |
| 158 | +Terlebih penting, langkah ketiga memprioritaskan untuk membatasi pembaruan EndpointSlice terhadap |
| 159 | +distribusi dari EndpointSlice yang benar-benar penuh. Sebagai contoh, jika ada 10 |
| 160 | +_endpoint_ baru untuk ditambahkan dan ada 2 EndpointSlice yang masing-masing memiliki ruang untuk 5 _endpoint_ baru, |
| 161 | +pendekatan ini akan membuat sebuah EndpointSlice baru daripada mengisi 2 |
| 162 | +EndpointSlice yang sudah ada. Dengan kata lain, pembuatan sebuah EndpointSlice |
| 163 | +lebih diutamakan daripada pembaruan beberapa EndpointSlice. |
| 164 | + |
| 165 | +Dengan kube-proxy yang berjalan pada tiap Node dan mengamati EndpointSlice, setiap perubahan |
| 166 | +pada sebuah EndpointSlice menjadi sangat mahal karena hal tersebut akan dikirimkan ke |
| 167 | +setiap Node dalam klaster. Pendekatan ini ditujukan untuk membatasi jumlah |
| 168 | +perubahan yang perlu dikirimkan ke setiap Node, meskipun hal tersebut berdampak pada banyaknya |
| 169 | +EndpointSlice yang tidak penuh. |
| 170 | + |
| 171 | +Pada praktiknya, distribusi yang kurang ideal seperti ini akan jarang ditemukan. Kebanyakan perubahan yang diproses oleh _controller_ EndpointSlice akan cukup kecil untuk dapat masuk pada |
| 172 | +EndpointSlice yang sudah ada, dan jika tidak, cepat atau lambat sebuah EndpointSlice baru |
| 173 | +akan segera dibutuhkan. Pembaruan bertahap (_rolling update_) dari Deployment juga menyediakan sebuah proses |
| 174 | +pengemasan ulang EndpointSlice yang natural seiring dengan digantikannya seluruh Pod dan _endpoint_ yang |
| 175 | +bersangkutan. |
| 176 | + |
| 177 | +{{% /capture %}} |
| 178 | + |
| 179 | +{{% capture whatsnext %}} |
| 180 | + |
| 181 | +* [Mengaktifkan EndpointSlice](/docs/tasks/administer-cluster/enabling-endpointslices) |
| 182 | +* Baca [Menghubungkan Aplikasi dengan Service](/docs/concepts/services-networking/connect-applications-service/) |
| 183 | + |
| 184 | +{{% /capture %}} |
0 commit comments