Cara Mengakses API Cluster Kubernetes Anda Dari Dalam Pod Anda

  • Post author:
  • Post category:Tutorial

Kubernetes API adalah rute Anda untuk memeriksa dan mengelola operasi cluster Anda. Anda dapat menggunakan API menggunakan Kubectl CLI, alat seperti curl, atau perpustakaan integrasi resmi untuk bahasa pemrograman populer.

API juga tersedia untuk aplikasi dalam cluster Anda. Pod Kubernetes secara otomatis diberikan akses ke API dan dapat diautentikasi menggunakan akun layanan yang disediakan. Anda melakukan interaksi dengan menggunakan variabel lingkungan yang disuntikkan dan file sertifikat untuk membuat koneksi dari klien pilihan Anda.

Mengapa Mengakses API Kubernetes Dalam Pods?

Ada beberapa kasus penggunaan untuk akses API dalam-Pod. Teknik ini memungkinkan aplikasi untuk memeriksa lingkungannya secara dinamis, menerapkan perubahan Kubernetes, dan mengumpulkan metrik bidang kontrol yang memberikan wawasan kinerja.

Beberapa organisasi mengembangkan alat mereka sendiri di sekitar Kubernetes. Mereka mungkin menyebarkan aplikasi dalam kluster khusus yang menggunakan API untuk mengekspos fungsionalitas tambahan. Beroperasi dari dalam cluster bisa lebih aman daripada melakukan panggilan API dari skrip eksternal karena Anda tidak perlu membuka lingkungan Anda atau berbagi akun layanan dan token autentikasi.

Menggunakan Perpustakaan Klien API

Metode termudah dan direkomendasikan untuk mengakses API Kubernetes dari sebuah Pod adalah menggunakan pustaka klien. Opsi yang didukung penuh tersedia untuk C, .NET, Go, Haskell, Java, JavaScript, Perl, Python, dan Ruby. Ada solusi yang dikelola komunitas yang setara untuk sebagian besar bahasa pemrograman populer lainnya.

Library klien memiliki dukungan bawaan untuk menemukan lingkungan cluster yang mereka jalankan. Setiap implementasi menyediakan fungsi yang dapat Anda panggil yang akan mengonfigurasi library untuk terhubung ke benar API server.

Berikut adalah contoh cara membuat daftar Pod di cluster Anda dalam aplikasi Python:

from kubernetes import client, config   config.load_incluster_config()   api = client.CoreV1Api()   # Lakukan interaksi API yang diperlukan# pods = api.list_pod_for_all_namespaces ()

Pendekatan ini mudah digunakan dan tidak memerlukan konfigurasi manual. Terkadang Anda tidak akan dapat menggunakan pustaka klien. Dalam kasus tersebut, masih mungkin untuk mengakses API secara manual menggunakan akun layanan yang disediakan Kubernetes.

Melakukan Interaksi API Manual

Untuk memanggil API, Anda perlu mengetahui dua hal: nama host dalam kluster yang menampilkannya, dan token akun layanan yang akan mengautentikasi Pod.

Anda Nama host API selalu kubernetes.default.svc. Penyedia DNS Kubernetes akan menyelesaikan nama ini ke server API bidang kontrol. Atau, Anda dapat menggunakan variabel lingkungan $KUBERNETES_SERVICE_HOST untuk menemukan alamat IP server API:

$ echo $KUBERNETES_SERVICE_HOST 10.96.0.1

API hanya tersedia melalui HTTPS. Anda dapat menemukan file otoritas sertifikat untuk cluster Anda di /var/run/secrets/kubernetes.io/serviceaccount/ca.crt di dalam Pod Anda. Kubernetes menyimpan ini ke dalam sistem file setiap kali wadah baru dibuat.

Anda harus mengautentikasi untuk mencapai sesuatu yang berguna dengan API. Kubernetes membuat akun layanan baru untuk setiap Pod dan menyediakan tokennya di /var/run/secrets/kubernetes.io/serviceaccount/token. Ini harus disertakan dengan setiap permintaan HTTP sebagai token pembawa di header Otorisasi.

Menggabungkan semuanya, berikut adalah contoh membuat permintaan API Kubernetes dalam Pod dasar menggunakan curl:

$ curl –cacert /var/run/secrets /kubernetes.io/serviceaccount/ca.crt -H “Otorisasi: Pembawa $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)” https://kubernetes.default.svc/api { “kind “: “APIVersions”, “versions”: [ “v1” ], “serverAddressByClientCIDRs”: [ { “clientCIDR”: “0.0.0.0/0”, “serverAddress”: “192.168.49.2:8443” } ]

Server Kubernetes telah merespons dengan versi API yang tersedia. Ini mengonfirmasi bahwa koneksi yang berhasil telah dibuat menggunakan nama host kubernetes.default.svc dan akun layanan yang disediakan.

Handling RBAC

Meskipun permintaan API telah berhasil dibuat, sebagian besar lainnya akan terlarang jika RBAC diaktifkan untuk cluster Anda. Akun layanan yang baru dibuat tidak secara otomatis menerima peran sehingga Pod Anda tidak akan dapat meminta titik akhir API yang dilindungi.

Anda dapat mengatasinya dengan membuat objek Role Anda sendiri dan mengikatnya ke akun layanan yang disediakan untuk Pod Anda. Pertama buat Role baru:

apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: default name: demo-role rules: – apiGroups: [“”] resources: [“pods”] verbs: [” get”, “list”]

Terapkan ke cluster Anda dengan Kubectl:

$ kubectl apply -f role.yaml

Next ikat peran ke akun layanan:

apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: namespace: nama default: subjek pengikatan-demo: – jenis: Nama Akun Layanan: apiGroup default: “” roleRef: jenis: Nama peran: demo-peran apiGroup: “”

Akun layanan default dipilih sebagai subjek pengikatan peran. Pod selalu disertakan dengan akun layanan ini, dicakup ke namespace tempat mereka dibuat. Dalam contoh ini, namespace default digunakan, tetapi ini harus diubah pada objek Role dan RoleBinding jika Pod Anda ada di namespace yang berbeda.

Tambahkan RoleBinding ke cluster Anda:

$ kubectl apply -f role-binding.yaml

Sekarang Pod Anda akan diizinkan untuk mendapatkan dan mencantumkan objek Pod lain di namespace default. Anda dapat memverifikasi ini dengan membuat permintaan API ke endpoint Pods dengan namespaced:

$ curl –cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt -H “Authorization: Bearer $(cat /var /run/secrets/kubernetes.io/serviceaccount/token)” https://kubernetes.default.svc/api/v1/namespaces/default/pods { “kind”: “PodList”, “apiVersion”: “v1” . .. }

Pods dapat mengidentifikasi namespace mereka sendiri dengan membaca file /var/run/secrets/kubernetes.io/serviceaccount/namespace:

$ cat /var/run/secrets/kubernetes.io/serviceaccount/namespace default

Ini menyediakan metode yang mudah digunakan untuk menginterpolasi namespace aktif ke dalam URL endpoint:

$ curl –cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt -H “Otorisasi: Bearer $(cat /var/run/secrets/kubernetes .io/serviceaccount/token)” https://kubernetes.default.svc/api/v1/namespaces/$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)/pods { “kind”: ” PodList”, “apiVersion”: “v1” … }Memilih Akun Layanan Lain
n bspKubernetes secara otomatis memberikan Pod dengan akun layanan default di dalam namespace mereka. Sebagai gantinya, Anda dapat menginjeksi akun layanan yang berbeda dengan menyetel bidang spec.serviceAccountName pada Pod Anda:

apiVersion: v1 kind: Pod metadata: name: demo spec: serviceAccountName: demo-sa

Dalam contoh ini Pod akan diautentikasi sebagai token demo-sa . Anda dapat membuat akun layanan ini secara manual dan mengikatnya dengan peran yang Anda perlukan.

$ kubernetes membuat akun layanan demo-sa

Akun layanan harus ada di namespace yang sama dengan Pod.

Pemasangan Akun Memilih Keluar Layanan

Injeksi akun layanan otomatis tidak selalu diinginkan. Ini bisa menjadi bahaya keamanan karena kompromi Pod yang berhasil menawarkan akses langsung ke API cluster Kubernetes Anda. Anda dapat menonaktifkan pemasangan token akun layanan dengan bidang manifes Pod spec.automountServiceAccountToken:

apiVersion: v1 kind: Pod metadata: name: demo spec: automountServiceAccountToken: false

Kubernetes tidak akan menyuntikkan /var/run/secrets/kubernetes.io/serviceaccount/ berkas tanda. Ini akan mencegah Pod mengautentikasi ke Kubernetes API kecuali jika Anda memberikan kredensial secara manual menggunakan metode yang berbeda. Bidang ini juga didukung pada objek akun layanan, membuatnya tidak memenuhi syarat untuk dipasang secara otomatis ke dalam Pod mana pun.

Jika Anda menggunakan pemasangan akun layanan, tetapkan kebijakan RBAC yang sesuai untuk membatasi token pada kasus penggunaan yang Anda maksudkan. Menghindari akses yang sangat istimewa akan mengurangi risiko kerusakan jika penyerang mendapatkan akses ke Pod.

Anda Mengakses server Kubernetes API dari dalam cluster Anda memungkinkan aplikasi yang sedang berjalan memeriksa dan memodifikasi beban kerja di sekitarnya. Anda dapat menambahkan fungsionalitas ekstra tanpa membuka klaster Anda ke akses API eksternal.

Library klien resmi memudahkan untuk memulai dan menjalankannya, jika cocok untuk kasus penggunaan Anda. Dalam situasi lain, Anda harus membuat permintaan secara manual ke https://kubernetes.default.svc, dengan menyediakan file otoritas sertifikat dan token akun layanan yang disuntikkan Kubernetes ke dalam wadah Pod Anda. Terlepas dari pendekatan yang Anda gunakan, akun layanan harus dikonfigurasi dengan benar dengan pengikatan peran RBAC sehingga Pod memiliki izin untuk melakukan tindakan yang diinginkan.

Itulah berita seputar Cara Mengakses API Cluster Kubernetes Anda Dari Dalam Pod Anda, semoga bermanfaat. Disadur dari HowToGeek.com.