Namespace menyediakan mekanisme untuk mengisolasi grup sumber daya di dalam satu cluster fisik. Bayangkan ini seperti “sub-cluster” virtual.
Tujuan Utama Namespace:
Scope untuk Nama: Nama dari sebuah objek (misalnya, nama Pod) hanya perlu unik di dalam satu namespace, bukan di seluruh cluster.
Organisasi Multi-tenancy: Memungkinkan beberapa tim atau proyek untuk berbagi satu cluster tanpa saling mengganggu. Tim A bisa bekerja di namespace-a dan Tim B di namespace-b.
Kontrol Akses: Kebijakan keamanan (RBAC - Role-Based Access Control) dapat diterapkan per namespace.
Manajemen Sumber Daya: Kuota sumber daya (CPU, memori) dapat ditetapkan per namespace.
Penting: Tidak semua objek berada dalam namespace. Objek lingkup cluster seperti Node dan PersistentVolume tidak termasuk dalam namespace manapun.
Namespaces dan DNS:
Ketika sebuah Service dibuat, Kubernetes secara otomatis membuat entri DNS. Formatnya adalah: <service-name>.<namespace-name>.svc.cluster.local.
Dari dalam namespace yang sama, sebuah Pod dapat memanggil layanan lain hanya dengan namanya (<service-name>).
Untuk memanggil layanan di namespace yang berbeda, Pod harus menggunakan alamat lengkapnya (<service-name>.<namespace-name>).
Label dan Selector: Mengelompokkan dan Memilih
Label adalah pasangan kunci-nilai (key-value pairs) yang ditempelkan pada objek, seperti Pod dan Service. Label bersifat bebas dan dirancang untuk digunakan dalam proses identifikasi.
Selector adalah mekanisme untuk memilih objek berdasarkan labelnya.
Contoh Selector: Sebuah Service mungkin memiliki selectorapp: webserver. Artinya, layanan ini akan mencari dan mengarahkan lalu lintas ke semua Pod yang memiliki label app: webserver.
Kombinasi Label dan Selector adalah mekanisme penghubung inti di Kubernetes. Inilah cara Deployment mengetahui Pod mana yang harus dikelolanya, dan cara Service mengetahui Pod mana yang harus menerima lalu lintas. Ini adalah hubungan yang loosely coupled.
Annotation: Metadata Tambahan
Annotation juga merupakan pasangan kunci-nilai yang ditempelkan pada objek. Perbedaan utamanya dengan Label adalah:
Tujuan: Annotation tidak digunakan untuk identifikasi atau pemilihan objek. Mereka digunakan untuk melampirkan metadata arbitrer yang bersifat non-identifikasi, yang sering kali digunakan oleh tools atau library lain.
Contoh:
Deskripsi panjang tentang objek.
Informasi kontak orang yang bertanggung jawab.
Konfigurasi spesifik untuk tool eksternal (misalnya, nginx.ingress.kubernetes.io/rewrite-target: / untuk sebuah Ingress Controller).
Singkatnya: Gunakan Label untuk pengelompokan dan pemilihan. Gunakan Annotation untuk semua hal lain yang ingin Anda “catat” pada sebuah objek.
Finalizer: Mengontrol Penghapusan Objek
Finalizer adalah sebuah mekanisme yang memberitahu Kubernetes untuk menunggu sampai kondisi tertentu terpenuhi sebelum ia benar-benar menghapus sebuah objek yang telah diminta untuk dihapus.
Cara Kerja: Ketika Anda meminta untuk menghapus objek yang memiliki finalizer, Kubernetes hanya menandai objek tersebut untuk dihapus (deletion timestamp) tetapi tidak langsung menghapusnya. Controller yang bertanggung jawab untuk finalizer tersebut akan melakukan tugas pembersihan (cleanup). Setelah tugas selesai, controller akan menghapus nama finalizer dari daftar di objek tersebut. Barulah setelah itu Kubernetes akan benar-benar menghapus objeknya.
Contoh Penggunaan: Memastikan bahwa storage volume eksternal atau load balancer di cloud telah dihapus dengan benar sebelum objek PersistentVolume atau Service di Kubernetes dihapus.
Summary
Kubernetes menyediakan mekanisme metadata yang kuat untuk mengorganisir dan mengelola sumber daya. Namespace digunakan untuk menciptakan isolasi virtual antar tim atau aplikasi, sementara Label dan Selector membentuk sistem penghubung inti yang longgar untuk mengelompokkan dan memilih objek. Annotation digunakan untuk melampirkan data non-identifikasi yang sering kali dibaca oleh tools lain, dan Finalizer memastikan proses pembersihan yang aman sebelum sebuah objek benar-benar dihapus dari cluster.
Additional Information
Kasus Penggunaan Lanjutan untuk Label
Kekuatan label terletak pada kemampuannya untuk mendeskripsikan objek dari berbagai dimensi. Sebuah Pod bisa memiliki beberapa label sekaligus, misalnya:
labels: app: my-app tier: backend release: canary customer: a
Ini memungkinkan operasi yang sangat fleksibel. Anda bisa memilih:
Semua Pod dari aplikasi ini: app=my-app
Hanya Pod backend di rilis canary: tier=backend,release=canary
Semua Pod milik pelanggan A: customer=a
Kemampuan ini sangat penting untuk strategi deployment yang canggih (seperti Canary Release atau A/B Testing) dan untuk pemantauan yang terperinci.
Contoh Praktis Annotation
Bayangkan Anda menggunakan Prometheus (sebuah tool monitoring) yang secara otomatis mencari target untuk di-scrape metriknya. Anda bisa memberitahu Prometheus untuk men-scrape sebuah Pod dengan menambahkan annotation berikut ke Pod tersebut:
Kubernetes sendiri tidak peduli dengan annotation ini. Namun, controller Prometheus akan memindai cluster, menemukan Pod dengan annotation ini, dan secara otomatis menambahkannya sebagai target monitoring. Ini menunjukkan bagaimana annotation berfungsi sebagai jembatan antara Kubernetes dan tools lain dalam ekosistemnya.