Skip to content

Commit 68e4a70

Browse files
ID translation for access cluster
ID translation direct rest API ID translation with & without kubectl proxy ID translation client libraries ID translation api access from pod ID translation access running service on cluster ID translation requesting redirect Fixing link reference related to access-cluster page Translating browser -> peramban, layanan -> servis Update content/id/docs/tasks/access-application-cluster/access-cluster.md Co-Authored-By: Yudi A Phanama <[email protected]> Apply suggestions from code review Co-Authored-By: Yudi A Phanama <[email protected]> Use _ to italic word instead of * Change port -> porta Make it consistent of "hubung" Use proper service-related word Apply suggestions from code review Co-authored-by: Giri Kuncoro <[email protected]>
1 parent 9c7a63c commit 68e4a70

File tree

1 file changed

+343
-0
lines changed

1 file changed

+343
-0
lines changed
Lines changed: 343 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,343 @@
1+
---
2+
title: Mengakses Klaster
3+
weight: 20
4+
content_template: templates/concept
5+
---
6+
7+
{{% capture overview %}}
8+
9+
Topik ini membahas tentang berbagai cara untuk berinteraksi dengan klaster.
10+
11+
{{% /capture %}}
12+
13+
14+
{{% capture body %}}
15+
16+
## Mengakses untuk pertama kalinya dengan kubectl
17+
18+
Saat mengakses API Kubernetes untuk pertama kalinya, kami sarankan untuk menggunakan
19+
CLI Kubernetes, `kubectl`.
20+
21+
Untuk mengakses sebuah klaster, kamu perlu mengetahui lokasi klaster dan mempunyai kredensial untuk mengaksesnya.
22+
Biasanya, ini secara otomatis diatur saat kamu mengikuti [Panduan persiapan](/docs/setup/),
23+
atau orang lain yang mengatur klaster dan memberikan kredensial dan lokasi kepadamu.
24+
25+
Periksa lokasi dan kredensial yang ada pada konfigurasi kubectl-mu melalui perintah ini:
26+
27+
```shell
28+
kubectl config view
29+
```
30+
31+
Beragam [contoh](/docs/user-guide/kubectl-cheatsheet) menyediakan pengantar penggunaan kubectl, dan dokumentasi lengkap dapat ditemukan di [kubectl manual](/docs/user-guide/kubectl-overview).
32+
33+
## Mengakses REST API secara langsung
34+
35+
Kubectl menangani pencarian dan autentikasi ke apiserver.
36+
Jika kamu ingin secara langsung mengakses REST API dengan klien HTTP seperti curl atau wget, atau peramban, ada beberapa cara untuk pencarian dan autentikasi:
37+
38+
- Jalankan kubectl dalam mode proksi.
39+
- Pendekatan yang disarankan.
40+
- Menggunakan lokasi apiserver yang tersimpan.
41+
- Melakukan verifikasi identitas apiserver menggunakan sertifikat elektronik yang ditandatangani sendiri. Tidak memungkinkan adanya MITM.
42+
- Melakukan autentikasi ke apiserver.
43+
- Di masa depan, dimungkinkan dapat melakukan _load-balancing_ dan _failover_ yang cerdas dari sisi klien.
44+
- Penyediaan lokasi dan kredensial langsung ke klien http.
45+
- Pendekatan alternatif.
46+
- Bekerja dengan beberapa jenis kode klien dengan menggunakan proksi.
47+
- Perlu mengimpor sertifikat elektronik _root_ ke peramban kamu untuk melindungi dari MITM.
48+
49+
### Menggunakan kubectl proxy
50+
51+
Perintah berikut akan menjalankan kubectl dalam mode di mana ia bertindak sebagai proksi terbalik (_reverse proxy_).
52+
Hal ini menangani pencarian dan autentikasi apiserver.
53+
Jalankan seperti ini:
54+
55+
```shell
56+
kubectl proxy --port=8080
57+
```
58+
59+
Lihat [kubectl proxy](/docs/reference/generated/kubectl/kubectl-commands/#proxy) untuk lebih jelasnya.
60+
61+
Kemudian kamu dapat menjelajahi API-nya dengan curl, wget, atau peramban, ganti localhost dengan [::1] untuk IPv6, seperti ini:
62+
63+
```shell
64+
curl http://localhost:8080/api/
65+
```
66+
67+
Hasil keluarannya seperti ini:
68+
69+
```json
70+
{
71+
"kind": "APIVersions",
72+
"versions": [
73+
"v1"
74+
],
75+
"serverAddressByClientCIDRs": [
76+
{
77+
"clientCIDR": "0.0.0.0/0",
78+
"serverAddress": "10.0.1.149:443"
79+
}
80+
]
81+
}
82+
```
83+
84+
85+
### Tanpa menggunakan kubectl proxy
86+
87+
Gunakan `kubectl describe secret...` untuk mendapatkan token untuk akun servis (_service account_) `default` dengan grep/cut:
88+
89+
```shell
90+
APISERVER=$(kubectl config view --minify | grep server | cut -f 2- -d ":" | tr -d " ")
91+
SECRET_NAME=$(kubectl get secrets | grep ^default | cut -f1 -d ' ')
92+
TOKEN=$(kubectl describe secret $SECRET_NAME | grep -E '^token' | cut -f2 -d':' | tr -d " ")
93+
94+
curl $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure
95+
```
96+
97+
Hasil keluarannya seperti ini:
98+
99+
```json
100+
{
101+
"kind": "APIVersions",
102+
"versions": [
103+
"v1"
104+
],
105+
"serverAddressByClientCIDRs": [
106+
{
107+
"clientCIDR": "0.0.0.0/0",
108+
"serverAddress": "10.0.1.149:443"
109+
}
110+
]
111+
}
112+
```
113+
114+
Menggunakan `jsonpath`:
115+
116+
```shell
117+
APISERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')
118+
SECRET_NAME=$(kubectl get serviceaccount default -o jsonpath='{.secrets[0].name}')
119+
TOKEN=$(kubectl get secret $SECRET_NAME -o jsonpath='{.data.token}' | base64 --decode)
120+
121+
curl $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure
122+
```
123+
124+
Hasil keluarannya seperti ini:
125+
126+
```json
127+
{
128+
"kind": "APIVersions",
129+
"versions": [
130+
"v1"
131+
],
132+
"serverAddressByClientCIDRs": [
133+
{
134+
"clientCIDR": "0.0.0.0/0",
135+
"serverAddress": "10.0.1.149:443"
136+
}
137+
]
138+
}
139+
```
140+
141+
Contoh di atas menggunakan _flag_ `--insecure`. Hal ini membuatnya rentan terhadap serangan MITM.
142+
Ketika kubectl mengakses klaster, kubectl menggunakan sertifikat elektronik _root_ yang tersimpan dan sertifikat elektronik klien untuk mengakses server.
143+
(Sertifikat-sertifikat elektronik tersebut diinstal di direktori `~/.kube`). Karena sertifikat elektronik klaster biasanya ditandatangani sendiri,
144+
mungkin diperlukan konfigurasi khusus untuk membuat klien HTTP kamu menggunakan sertifikat elektronik root.
145+
146+
Pada beberapa klaster, apiserver tidak memerlukan autentikasi; mungkin apiserver tersebut meladen (_serve_) di localhost, atau dilindungi oleh sebuah dinding api (_firewall_).
147+
Tidak ada standar untuk ini. [Mengonfigurasi Akses ke API](/docs/reference/access-authn-authz/controlling-access/) menjelaskan bagaimana admin klaster dapat mengonfigurasi hal ini.
148+
Pendekatan semacam itu dapat bertentangan dengan dukungan ketersediaan tinggi (_high-availability_) pada masa depan.
149+
150+
## Akses terprogram ke API
151+
152+
Kubernetes secara resmi mendukung pustaka (_library_) klien [Go](#klien-go) dan [Python](#klien-python).
153+
154+
### Klien Go
155+
156+
* Untuk mendapatkan pustakanya, jalankan perintah berikut: `go get k8s.io/client-go@kubernetes-<kubernetes-version-number>`, lihat [INSTALL.md](https://github.com/kubernetes/client-go/blob/master/INSTALL.md#for-the-casual-user) untuk instruksi instalasi yang lebih detail. Lihat [https://github.com/kubernetes/client-go](https://github.com/kubernetes/client-go#compatibility-matrix) untuk melihat versi yang didukung.
157+
* Tulis aplikasi dengan menggunakan klien client-go. Perhatikan bahwa client-go mendefinisikan objek APInya sendiri, jadi jika perlu, silakan impor definisi API dari client-go daripada dari repositori utama, misalnya, `import "k8s.io/client-go/kubernetes"`.
158+
159+
Klien Go dapat menggunakan [berkas kubeconfig](/docs/concepts/cluster-administration/authenticate-across-clusters-kubeconfig/) yang sama dengan yang digunakan oleh CLI kubectl untuk mencari dan mengautentikasi ke apiserver. Lihat [contoh ini](https://git.k8s.io/client-go/examples/out-of-cluster-client-configuration/main.go).
160+
161+
Jika aplikasi ini digunakan sebagai Pod di klaster, silakan lihat [bagian selanjutnya](#mengakses-api-dari-pod).
162+
163+
### Klien Python
164+
165+
Untuk menggunakan [klien Python](https://github.com/kubernetes-client/python), jalankan perintah berikut: `pip install kubernetes`. Lihat [halaman Pustaka Klien Python](https://github.com/kubernetes-client/python) untuk opsi instalasi lainnya.
166+
167+
Klien Python dapat menggunakan [berkas kubeconfig](/docs/concepts/cluster-administration/authenticate-across-clusters-kubeconfig/) yang sama dengan yang digunakan oleh CLI kubectl untuk mencari dan mengautentikasi ke apiserver. Lihat [contoh](https://github.com/kubernetes-client/python/tree/master/examples).
168+
169+
### Bahasa lainnya
170+
171+
Ada [pustaka klien](/docs/reference/using-api/client-libraries/) untuk mengakses API dari bahasa lain.
172+
Lihat dokumentasi pustaka lain untuk melihat bagaimana mereka melakukan autentikasi.
173+
174+
## Mengakses API dari Pod
175+
176+
Saat mengakses API dari Pod, pencarian dan autentikasi ke apiserver agak berbeda.
177+
178+
Cara yang disarankan untuk menemukan apiserver di dalam Pod adalah dengan nama DNS `kubernetes.default.svc`,
179+
yang akan mengubah kedalam bentuk Service IP yang pada gilirannya akan dialihkan ke apiserver.
180+
181+
Cara yang disarankan untuk mengautentikasi ke apiserver adalah dengan kredensial [akun servis](/docs/tasks/configure-pod-container/configure-service-account/).
182+
Oleh kube-system, Pod dikaitkan dengan sebuah akun servis (_service account_), dan sebuah kredensial (token) untuk akun servis (_service account_) tersebut ditempatkan ke pohon sistem berkas (_file system tree_) dari setiap Container di dalam Pod tersebut,
183+
di `/var/run/secrets/kubernetes.io/serviceaccount/token`.
184+
185+
Jika tersedia, bundel sertifikat elektronik ditempatkan ke pohon sistem berkas dari setiap Container di `/var/run/secrets/kubernetes.io/serviceaccount/ca.crt`,
186+
dan itu akan digunakan untuk memverifikasi sertifikat elektronik yang digunakan apiserver untuk meladen.
187+
188+
Terakhir, Namespace `default` yang akan digunakan untuk operasi API _namespaced_ ditempatkan di dalam berkas `/var/run/secrets/kubernetes.io/serviceaccount/namespace` di dalam setiap Container.
189+
190+
Dari dalam Pod, cara yang disarankan untuk menghubungi API adalah:
191+
192+
- Jalankan `kubectl proxy` pada Container _sidecar_ di dalam Pod, atau sebagai proses _background_ di dalam Container.
193+
Perintah tersebut memproksi API Kubernetes pada antarmuka localhost Pod tersebut, sehingga proses lain dalam Container apa pun milik Pod dapat mengaksesnya.
194+
- Gunakan pustaka klien Go, dan buatlah sebuah klien menggunakan fungsi `rest.InClusterConfig()` dan `kubernetes.NewForConfig()`.
195+
Mereka menangani pencarian dan autentikasi ke apiserver. [contoh](https://git.k8s.io/client-go/examples/in-cluster-client-configuration/main.go)
196+
197+
Pada setiap kasus, kredensial Pod digunakan untuk berkomunikasi secara aman dengan apiserver.
198+
199+
## Mengakses servis yang berjalan di klaster
200+
201+
Bagian sebelumnya menjelaskan tentang menghubungi server API Kubernetes. Bagian ini menjelaskan tentang menghubungi servis lain yang berjalan di klaster Kubernetes.
202+
Di Kubernetes, semua [Node](/docs/admin/node), [Pod](/docs/user-guide/pods), dan [Service](/docs/user-guide/services) memiliki IP sendiri.
203+
Dalam banyak kasus, IP Node, IP Pod, dan beberapa IP Service pada sebuah klaster tidak dapat dirutekan, sehingga mereka tidak terjangkau dari mesin di luar klaster, seperti mesin desktop kamu.
204+
205+
### Cara untuk terhubung
206+
207+
Kamu memiliki beberapa opsi untuk menghubungi Node, Pod, dan Service dari luar klaster:
208+
209+
- Mengakses Service melalui IP publik.
210+
- Gunakan Service dengan tipe `NodePort` atau` LoadBalancer` untuk membuat Service dapat dijangkau di luar klaster. Lihat dokumentasi [Service](/docs/user-guide/services) dan perintah [kubectl expose](/docs/reference/generated/kubectl/kubectl-commands/#expose).
211+
- Bergantung pada lingkungan klaster kamu, hal ini mungkin hanya mengekspos Service ke jaringan perusahaan kamu, atau mungkin mengeksposnya ke internet. Pikirkan apakah Service yang diekspos aman atau tidak. Apakah layanan di balik Service tersebut melakukan autentikasinya sendiri?
212+
- Tempatkan Pod di belakang Service. Untuk mengakses satu Pod tertentu dari sekumpulan replika, misalnya untuk pengawakutuan (_debugging_), letakkan label unik di Pod dan buat Service baru yang memilih label ini.
213+
- Pada kebanyakan kasus, pengembang aplikasi tidak perlu langsung mengakses Node melalui IP Node mereka.
214+
- Akses Service, Node, atau Pod menggunakan _Verb_ Proxy.
215+
- Apakah autentikasi dan otorisasi apiserver dilakukan sebelum mengakses Service jarak jauh. Gunakan ini jika Service tersebut tidak cukup aman untuk diekspos ke internet, atau untuk mendapatkan akses ke porta (_port_) pada IP Node, atau untuk pengawakutuan.
216+
- Proksi dapat menyebabkan masalah untuk beberapa aplikasi web.
217+
- Hanya bekerja pada HTTP/HTTPS.
218+
- Dijelaskan [di sini](#url-proxy-apiserver-secara-manual).
219+
- Akses dari Node atau Pod di klaster.
220+
- Jalankan Pod, kemudian hubungkan ke sebuah _shell_ di dalamnya menggunakan [kubectl exec](/docs/reference/generated/kubectl/kubectl-commands/#exec). Hubungi Node, Pod, dan Service lain dari _shell_ itu.
221+
- Beberapa klaster memungkinkan kamu untuk melakukan SSH ke sebuah Node di dalam klaster. Dari sana, kamu mungkin dapat mengakses Service-Service klaster. Hal ini merupakan metode yang tidak standar, dan akan bekerja pada beberapa klaster tetapi tidak pada yang lain. Peramban dan perkakas lain mungkin diinstal atau tidak. DNS Klaster mungkin tidak berfungsi.
222+
223+
### Menemukan Service bawaan (_builtin_)
224+
225+
Biasanya, ada beberapa Service yang dimulai pada sebuah klaster oleh kube-system. Dapatkan daftarnya dengan perintah `kubectl cluster-info`:
226+
227+
```shell
228+
kubectl cluster-info
229+
```
230+
231+
Keluarannya mirip seperti ini:
232+
233+
```
234+
Kubernetes master is running at https://104.197.5.247
235+
elasticsearch-logging is running at https://104.197.5.247/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy
236+
kibana-logging is running at https://104.197.5.247/api/v1/namespaces/kube-system/services/kibana-logging/proxy
237+
kube-dns is running at https://104.197.5.247/api/v1/namespaces/kube-system/services/kube-dns/proxy
238+
grafana is running at https://104.197.5.247/api/v1/namespaces/kube-system/services/monitoring-grafana/proxy
239+
heapster is running at https://104.197.5.247/api/v1/namespaces/kube-system/services/monitoring-heapster/proxy
240+
```
241+
242+
Ini menunjukkan URL _proxy-verb_ untuk mengakses setiap Service.
243+
Misalnya, klaster ini mempunyai pencatatan log pada level klaster (_cluster-level logging_) yang aktif (menggunakan Elasticsearch), yang dapat dicapai di `https://104.197.5.247/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/` jika kredensial yang sesuai diberikan.
244+
Pencatatan log dapat pula dicapai dengan sebuah proksi _kubectl_, misalnya di:
245+
`http://localhost:8080/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/`.
246+
(Lihat [di atas](#mengakses-rest-api-secara-langsung) untuk panduan bagaimana cara meneruskan kredensial atau menggunakan `kubectl proxy`.)
247+
248+
#### Membuat URL proksi apiserver secara manual
249+
250+
Seperti disebutkan di atas, kamu menggunakan perintah `kubectl cluster-info` untuk mendapatkan URL proksi suatu Service.
251+
Untuk membuat URL proksi yang memuat _endpoint-endpoint_ Service, sufiks, dan parameter, kamu cukup menambahkan ke URL proksi Service:
252+
`http://`*`alamat_kubernetes_master`*`/api/v1/namespaces/`*`nama_namespace`*`/services/`*`nama_servis[:nama_porta]`*`/proxy`
253+
254+
Jika kamu belum menentukan nama untuk porta kamu, kamu tidak perlu memasukan _nama_porta_ di URL.
255+
256+
Secara bawaan, server API memproksi ke Service kamu menggunakan HTTP. Untuk menggunakan HTTPS, awali nama Service dengan `https:`:
257+
`http://`*`alamat_kubernetes_master`*`/api/v1/namespaces/`*`nama_namespace`*`/services/`*`https:nama_servis:[nama_porta]`*`/proxy`
258+
259+
Format yang didukung untuk segmen nama URL adalah:
260+
261+
* `<nama_servis>` - Memproksi ke porta bawaan atau porta tanpa nama menggunakan HTTP
262+
* `<nama_servis>:<nama_porta>` - Memproksi ke porta yang telah ditentukan menggunakan HTTP
263+
* `https:<nama_servis>:` - Memproksi ke porta bawaan atau porta tanpa nama menggunakan HTTPS (perhatikan tanda adanya titik dua)
264+
* `https:<nama_servis>:<nama_porta>` - proksi ke porta yang telah ditentukan menggunakan https
265+
266+
##### Contoh
267+
268+
* Untuk mengakses _endpoint_ Service Elasticsearch `_search?q=user:kimchy`, kamu dapat menggunakan: `http://104.197.5.247/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/_search?q=user:kimchy`
269+
* Untuk mengakses informasi kesehatan klaster Elasticsearch `_cluster/health?pretty=true`, kamu dapat menggunakan: `https://104.197.5.247/api/v1/namespaces/kube-system/services/elasticsearch-logging/proxy/_cluster/health?pretty=true`
270+
271+
```json
272+
{
273+
"cluster_name" : "kubernetes_logging",
274+
"status" : "yellow",
275+
"timed_out" : false,
276+
"number_of_nodes" : 1,
277+
"number_of_data_nodes" : 1,
278+
"active_primary_shards" : 5,
279+
"active_shards" : 5,
280+
"relocating_shards" : 0,
281+
"initializing_shards" : 0,
282+
"unassigned_shards" : 5
283+
}
284+
```
285+
286+
### Menggunakan peramban web untuk mengakses Service yang berjalan di klaster
287+
288+
Kamu mungkin dapat memasukkan URL proksi apiserver ke bilah alamat peramban. Namun:
289+
290+
- Peramban web biasanya tidak dapat menerima token, jadi kamu mungkin perlu menggunakan autentikasi dasar/_basic auth_ (kata sandi). Apiserver dapat dikonfigurasi untuk menerima autentikasi dasar, tetapi klaster kamu mungkin belum dikonfigurasi untuk menerima autentikasi dasar.
291+
- Beberapa aplikasi web mungkin tidak berfungsi, terutama yang memiliki javascript pada sisi klien yang digunakan untuk membuat URL sedemikian sehingga ia tidak mengetahui adanya prefiks jalur (_path_) proksi (`/proxy`).
292+
293+
## Meminta pengalihan
294+
295+
Kemampuan pengalihan telah usang (_deprecated_) dan dihapus. Silakan gunakan proksi (lihat di bawah) sebagai gantinya.
296+
297+
## Begitu Banyaknya Proksi
298+
299+
Ada beberapa proksi berbeda yang mungkin kamu temui saat menggunakan Kubernetes:
300+
301+
1. [Proksi kubectl](#mengakses-rest-api-secara-langsung):
302+
303+
- berjalan di desktop pengguna atau di Pod
304+
- memproksi dari sebuah alamat localhost ke apiserver Kubernetes
305+
- dari klien ke proksi menggunakan HTTP
306+
- dari proksi ke apiserver menggunakan HTTPS
307+
- menemukan apiserver-nya
308+
- menambahkan _header-header_ autentikasi
309+
310+
1. [Proksi apiserver](#menemukan-service-bawaan-builtin):
311+
312+
- merupakan sebuah _bastion_ yang dibangun ke dalam apiserver
313+
- menghubungkan pengguna di luar klaster ke IP klaster yang mungkin tidak dapat dijangkau
314+
- berjalan dalam proses apiserver
315+
- dari klien ke proksi menggunakan HTTPS (atau HTTP jika apiserver dikonfigurasi)
316+
- dari proksi ke target dapat menggunakan HTTP atau HTTPS seperti yang dipilih oleh proksi menggunakan informasi yang tersedia
317+
- dapat digunakan untuk menjangkau Node, Pod, atau Service
318+
- melakukan _load balancing_ saat digunakan untuk menjangkau sebuah Service
319+
320+
1. [kube-proxy](/docs/concepts/services-networking/service/#ips-and-vips):
321+
322+
- berjalan di setiap Node
323+
- memproksi UDP dan TCP
324+
- tidak mengerti HTTP
325+
- menyediakan _load balancing_
326+
- hanya digunakan untuk menjangkau Service
327+
328+
1. Sebuah Proksi/_Load-balancer_ di depan apiserver:
329+
330+
- keberadaan dan implementasi bervariasi dari satu klaster ke klaster lainnya (mis. nginx)
331+
- terletak di antara semua klien dan satu atau lebih apiserver
332+
- bertindak sebagai _load balancer_ jika terdapat beberapa apiserver.
333+
334+
1. _Cloud Load Balancer_ pada Service eksternal:
335+
336+
- disediakan oleh beberapa penyedia layanan _cloud_ (mis. AWS ELB, Google Cloud Load Balancer)
337+
- dibuat secara otomatis ketika Service Kubernetes memiliki tipe `LoadBalancer`
338+
- hanya menggunakan UDP/TCP
339+
- implementasi bervariasi berdasarkan penyedia layanan _cloud_.
340+
341+
Pengguna Kubernetes biasanya tidak perlu khawatir tentang apa pun selain dua jenis pertama. Admin klaster biasanya akan memastikan bahwa tipe yang terakhir telah diatur dengan benar.
342+
343+
{{% /capture %}}

0 commit comments

Comments
 (0)