Belajar Kubernetes - Episode 8 - Pengenalan dan Penjelasan Object Namespace

Belajar Kubernetes - Episode 8 - Pengenalan dan Penjelasan Object Namespace

Di episode ini kita akan coba bahas konsep penting di Kubernetes yaitu Namespace. Kita akan mempelajari cara menggunakan Namespace untuk membagi resource cluster antara multiple user atau team.

Arman Dwi Pangestu
Arman Dwi PangestuMarch 11, 2026
0 views
10 min read

Pendahuluan

Catatan

Untuk kalian yang ingin membaca episode sebelumnya, bisa click thumbnail episode 7 di bawah ini

Episode 7Episode 7

Di episode sebelumnya kita sudah mengetahui lebih dalam terkait object Annotation dalam konteks Kubernetes. Selanjutnya di episode 8 kali ini, kita akan coba bahas konsep fundamental lainnya di Kubernetes yaitu Namespace.

Catatan: Disini saya akan menggunakan Kubernetes Cluster yang di install melalui K3s.

Namespace adalah cara untuk membagi resource cluster antara multiple user, team, atau project. Mereka menyediakan scope untuk nama dan memungkinkan kalian untuk mengorganisir dan mengisolasi resource dalam single cluster. Memahami Namespace sangat penting untuk mengelola multi-tenant cluster dan mengorganisir resource secara efektif.

Apa Itu Namespace?

Namespace adalah virtual cluster dalam physical Kubernetes cluster. Namespace menyediakan cara untuk membagi resource cluster antara multiple user atau team. Namespace ditujukan untuk digunakan di environment dengan banyak user yang tersebar di berbagai team atau project.

Bayangkan Namespace seperti folder di komputer kalian. Sama seperti folder membantu kalian mengorganisir file ke dalam grup logis, Namespace membantu kalian mengorganisir resource Kubernetes ke dalam grup logis. Sebagai contoh, kalian mungkin memiliki Namespace terpisah untuk environment development, staging, dan production, atau Namespace terpisah untuk team atau project yang berbeda.

Namespace menyediakan:

  • Isolasi resource - Resource di satu Namespace diisolasi dari resource di Namespace lain
  • Name scoping - Nama resource harus unik dalam Namespace, tapi tidak di seluruh Namespace
  • Resource quota - Kalian bisa set limit resource per Namespace
  • Access control - Kalian bisa apply policy RBAC yang berbeda ke Namespace yang berbeda
  • Organisasi - Pengelompokan logis resource untuk management yang lebih baik

Karakteristik Namespace

Karakteristik kunci dari Namespace:

  • Nama harus unik - Setiap Namespace harus memiliki nama unik dalam cluster
  • Tidak semua object di-namespace - Beberapa resource seperti Node, PersistentVolume, dan Namespace itu sendiri adalah cluster-scoped
  • Tidak bisa nested - Kalian tidak bisa membuat Namespace di dalam Namespace lain
  • Deletion cascade - Menghapus Namespace akan menghapus semua resource di dalamnya
  • Integrasi DNS - Service mendapatkan nama DNS yang include Namespace

Kenapa Kita Butuh Namespace?

Kalian mungkin bertanya kenapa kita butuh Namespace ketika kita sudah punya Label untuk mengorganisir resource. Perbedaan kuncinya adalah:

  • Label untuk grouping dan selecting resource - mereka tidak menyediakan isolasi
  • Namespace menyediakan isolasi aktual dan scope terpisah untuk resource

Pertimbangkan skenario ini: Kalian punya development team dan production team yang keduanya deploy aplikasi ke cluster yang sama. Tanpa Namespace, mereka mungkin secara tidak sengaja overwrite resource satu sama lain jika menggunakan nama yang sama. Dengan Namespace, setiap team bisa memiliki environment terisolasi mereka sendiri dalam cluster yang sama.

Use case penting lainnya adalah resource quota. Kalian bisa set limit berapa banyak CPU, memory, dan storage yang bisa digunakan setiap Namespace. Ini mencegah satu team atau project mengkonsumsi semua resource cluster.

Default Namespace

Saat kalian membuat Kubernetes cluster, cluster tersebut datang dengan beberapa default Namespace:

default Namespace

Namespace default adalah tempat resource dibuat jika kalian tidak specify Namespace. Saat kalian menjalankan kubectl get pods tanpa specify Namespace, kalian query Namespace default.

Kubernetesbash
# Ini query default Namespace
sudo kubectl get pods

kube-system Namespace

Namespace kube-system berisi resource yang dibuat oleh Kubernetes system itu sendiri. Ini include system component seperti DNS server, metrics server, dan control plane component lainnya.

Kubernetesbash
# Lihat system component
sudo kubectl get pods -n kube-system

Warning

Hati-hati saat bekerja dengan resource di Namespace kube-system. Menghapus atau memodifikasi resource ini bisa merusak cluster kalian.

kube-public Namespace

Namespace kube-public bisa dibaca oleh semua user (termasuk unauthenticated user). Namespace ini biasanya digunakan untuk resource yang harus publicly accessible di seluruh cluster.

Kubernetesbash
# Lihat public resource
sudo kubectl get all -n kube-public

kube-node-lease Namespace

Namespace kube-node-lease menyimpan lease object yang terkait dengan setiap node. Node lease memungkinkan kubelet mengirim heartbeat sehingga control plane bisa mendeteksi node failure.

Kubernetesbash
# Lihat node lease
sudo kubectl get leases -n kube-node-lease

Melihat Namespace

Mari kita belajar cara melihat Namespace di cluster kalian:

List Semua Namespace

Untuk melihat semua Namespace di cluster kalian:

Kubernetesbash
sudo kubectl get namespaces

Atau gunakan shorthand:

Kubernetesbash
sudo kubectl get ns

Output nya akan terlihat seperti ini:

Kubernetesbash
NAME              STATUS   AGE
default           Active   45d
kube-node-lease   Active   45d
kube-public       Active   45d
kube-system       Active   45d

Melihat Detail Namespace

Untuk melihat informasi detail tentang Namespace tertentu:

Kubernetesbash
sudo kubectl describe namespace default

Output akan menampilkan:

Kubernetesbash
Name:         default
Labels:       kubernetes.io/metadata.name=default
Annotations:  <none>
Status:       Active
 
No resource quota.
 
No LimitRange resource.

Melihat Resource di Namespace

Untuk melihat resource di Namespace tertentu, gunakan flag -n atau --namespace:

Kubernetesbash
# Lihat Pod di Namespace kube-system
sudo kubectl get pods -n kube-system
 
# Lihat semua resource di Namespace
sudo kubectl get all -n kube-system

Untuk melihat resource di semua Namespace, gunakan flag --all-namespaces atau -A:

Kubernetesbash
# Lihat semua Pod di semua Namespace
sudo kubectl get pods --all-namespaces
 
# Atau gunakan shorthand
sudo kubectl get pods -A

Membuat Namespace

Ada dua cara utama untuk membuat Namespace:

Cara 1: Menggunakan Perintah kubectl

Cara tercepat untuk membuat Namespace adalah menggunakan perintah kubectl create namespace:

Kubernetesbash
sudo kubectl create namespace development

Atau gunakan shorthand:

Kubernetesbash
sudo kubectl create ns staging

Cara 2: Menggunakan Konfigurasi YAML

Kalian juga bisa membuat Namespace menggunakan file konfigurasi YAML:

Kubernetesnamespace.yml
apiVersion: v1
kind: Namespace
metadata:
    name: production
    labels:
        environment: production
        team: platform

Apply konfigurasi:

Kubernetesbash
sudo kubectl apply -f namespace.yml

Membuat Namespace dengan Label dan Annotation

Kalian bisa menambahkan Label dan Annotation ke Namespace untuk organisasi yang lebih baik:

Kubernetesnamespace-with-metadata.yml
apiVersion: v1
kind: Namespace
metadata:
    name: backend-team
    labels:
        team: backend
        environment: production
        cost-center: engineering
    annotations:
        description: "Namespace for backend team production workloads"
        contact: "backend-team@company.com"
        created-by: "platform-team"

Bekerja dengan Namespace

Membuat Resource di Namespace

Saat membuat resource, kalian bisa specify Namespace dengan dua cara:

Cara 1: Di konfigurasi YAML

Kubernetespod-in-namespace.yml
apiVersion: v1
kind: Pod
metadata:
    name: nginx-pod
    namespace: development
spec:
    containers:
        - name: nginx
          image: nginx
          ports:
              - containerPort: 80

Cara 2: Menggunakan flag kubectl

Kubernetesbash
sudo kubectl apply -f pod.yml -n development

Setting Default Namespace

Daripada specify Namespace setiap kali, kalian bisa set default Namespace untuk kubectl context kalian:

Kubernetesbash
# Set default Namespace ke development
sudo kubectl config set-context --current --namespace=development

Sekarang semua perintah kubectl akan menggunakan Namespace development secara default:

Kubernetesbash
# Ini akan query Namespace development
sudo kubectl get pods

Untuk switch kembali ke default Namespace:

Kubernetesbash
sudo kubectl config set-context --current --namespace=default

Melihat Current Namespace

Untuk melihat Namespace mana yang saat ini di-set sebagai default:

Kubernetesbash
sudo kubectl config view --minify | grep namespace:

Contoh Praktis: Multi-Environment Setup

Mari kita buat contoh praktis dimana kita setup multiple Namespace untuk environment yang berbeda:

Step 1: Membuat Namespace untuk Environment Berbeda

Buat file bernama environments.yml:

Kubernetesenvironments.yml
apiVersion: v1
kind: Namespace
metadata:
    name: development
    labels:
        environment: development
    annotations:
        description: "Development environment"
---
apiVersion: v1
kind: Namespace
metadata:
    name: staging
    labels:
        environment: staging
    annotations:
        description: "Staging environment"
---
apiVersion: v1
kind: Namespace
metadata:
    name: production
    labels:
        environment: production
    annotations:
        description: "Production environment"

Apply konfigurasi:

Kubernetesbash
sudo kubectl apply -f environments.yml

Step 2: Deploy Aplikasi ke Namespace Berbeda

Buat file bernama app-deployments.yml:

Kubernetesapp-deployments.yml
# Development deployment
apiVersion: v1
kind: Pod
metadata:
    name: web-app
    namespace: development
    labels:
        app: web
        environment: development
spec:
    containers:
        - name: nginx
          image: nginx:1.25
          ports:
              - containerPort: 80
---
# Staging deployment
apiVersion: v1
kind: Pod
metadata:
    name: web-app
    namespace: staging
    labels:
        app: web
        environment: staging
spec:
    containers:
        - name: nginx
          image: nginx:1.25
          ports:
              - containerPort: 80
---
# Production deployment
apiVersion: v1
kind: Pod
metadata:
    name: web-app
    namespace: production
    labels:
        app: web
        environment: production
spec:
    containers:
        - name: nginx
          image: nginx:1.25
          ports:
              - containerPort: 80

Apply konfigurasi:

Kubernetesbash
sudo kubectl apply -f app-deployments.yml

Step 3: Verifikasi Deployment

Sekarang kita punya Pod dengan nama yang sama (web-app) di tiga Namespace berbeda:

Kubernetesbash
# Lihat Pod di development
sudo kubectl get pods -n development
 
# Lihat Pod di staging
sudo kubectl get pods -n staging
 
# Lihat Pod di production
sudo kubectl get pods -n production
 
# Lihat semua Pod di semua Namespace
sudo kubectl get pods -A | grep web-app

Output akan menampilkan:

Kubernetesbash
NAMESPACE     NAME      READY   STATUS    RESTARTS   AGE
development   web-app   1/1     Running   0          2m
staging       web-app   1/1     Running   0          2m
production    web-app   1/1     Running   0          2m

Tip

Perhatikan bagaimana kita bisa memiliki resource dengan nama yang sama di Namespace berbeda. Ini adalah salah satu benefit kunci dari menggunakan Namespace.

DNS dan Namespace

Kubernetes DNS secara otomatis membuat DNS record untuk Service. Nama DNS include Namespace, memungkinkan Service untuk berkomunikasi antar Namespace.

Format Nama DNS

Service mendapatkan nama DNS dalam format ini:

plaintext
<service-name>.<namespace>.svc.cluster.local

Sebagai contoh:

  • web-service.development.svc.cluster.local
  • web-service.production.svc.cluster.local

Mengakses Service Antar Namespace

Dalam Namespace yang sama, kalian bisa gunakan short name:

Tip

Untuk mencoba mengakses domain tersebut, kalian bisa masuk ke dalam shell pod / container nya dengan cara menjalankan command berikut ini:

bash
sudo kubectl exec -it web-app -n development -- bash

Setelah itu bisa install network tools seperti dnsutils, iputils-ping, dan curl

bash
apt update
apt install dnsutils iputils-ping curl -y

Maka hasilnya ketika http request menggunakan curl adalah mengembalikan isian html dari nginx page nya

bash
# Cara 1
curl http://web-service
# Cara 2
curl http://web-service.production
# Cara 3
curl http://web-service.production.svc.cluster.local
bash
curl http://web-service

Antar Namespace, kalian perlu gunakan full DNS name:

bash
curl http://web-service.production.svc.cluster.local

Contoh: Cross-Namespace Communication

Buat Service di Namespace berbeda:

Kubernetesservices.yml
apiVersion: v1
kind: Service
metadata:
    name: web-service
    namespace: development
spec:
    selector:
        app: web
    ports:
        - protocol: TCP
          port: 80
          targetPort: 80
---
apiVersion: v1
kind: Service
metadata:
    name: web-service
    namespace: production
spec:
    selector:
        app: web
    ports:
        - protocol: TCP
          port: 80
          targetPort: 80

Sekarang Pod di Namespace development bisa mengakses Service di Namespace production:

Kubernetesbash
# Dari Pod di Namespace development
curl http://web-service.production.svc.cluster.local

Resource Quota dan Namespace

Salah satu fitur paling powerful dari Namespace adalah kemampuan untuk set resource quota. Ini mencegah single Namespace mengkonsumsi semua resource cluster.

Membuat ResourceQuota

Buat file bernama resource-quota.yml:

Kubernetesresource-quota.yml
apiVersion: v1
kind: ResourceQuota
metadata:
    name: compute-quota
    namespace: development
spec:
    hard:
        requests.cpu: "4"
        requests.memory: 8Gi
        limits.cpu: "8"
        limits.memory: 16Gi
        pods: "10"

Quota ini membatasi Namespace development ke:

  • Maksimal 4 CPU core yang di-request
  • Maksimal 8Gi memory yang di-request
  • Maksimal 8 CPU core limit
  • Maksimal 16Gi memory limit
  • Maksimal 10 Pod

Apply quota:

Kubernetesbash
sudo kubectl apply -f resource-quota.yml

Melihat Resource Quota

Untuk melihat resource quota di Namespace:

Kubernetesbash
sudo kubectl get resourcequota -n development

Untuk informasi detail:

Kubernetesbash
sudo kubectl describe resourcequota compute-quota -n development

Output akan menampilkan:

Kubernetesbash
Name:            compute-quota
Namespace:       development
Resource         Used  Hard
--------         ----  ----
limits.cpu       0     8
limits.memory    0     16Gi
pods             1     10
requests.cpu     0     4
requests.memory  0     8Gi

Contoh: ResourceQuota dalam Aksi

Saat kalian mencoba membuat Pod yang melebihi quota, akan ditolak:

Kuberneteslarge-pod.yml
apiVersion: v1
kind: Pod
metadata:
    name: large-pod
    namespace: development
spec:
    containers:
        - name: app
          image: nginx
          resources:
              requests:
                  cpu: "5"
                  memory: 10Gi
              limits:
                  cpu: "10"
                  memory: 20Gi

Apply ini akan gagal:

Kubernetesbash
sudo kubectl apply -f large-pod.yml

Error message:

Kubernetesbash
Error from server (Forbidden): error when creating "large-pod.yml": pods "large-pod" is forbidden: exceeded quota: compute-quota, requested: requests.cpu=5,requests.memory=10Gi, used: requests.cpu=0,requests.memory=0, limited: requests.cpu=4,requests.memory=8Gi

LimitRange dan Namespace

LimitRange memungkinkan kalian untuk set default resource limit untuk container di Namespace. Ini berguna saat developer lupa specify resource limit.

Membuat LimitRange

Buat file bernama limit-range.yml:

Kuberneteslimit-range.yml
apiVersion: v1
kind: LimitRange
metadata:
    name: resource-limits
    namespace: development
spec:
    limits:
        - default:
              cpu: "500m"
              memory: 512Mi
          defaultRequest:
              cpu: "250m"
              memory: 256Mi
          max:
              cpu: "2"
              memory: 2Gi
          min:
              cpu: "100m"
              memory: 128Mi
          type: Container

LimitRange ini set:

  • Default limit: 500m CPU, 512Mi memory
  • Default request: 250m CPU, 256Mi memory
  • Maksimum: 2 CPU, 2Gi memory
  • Minimum: 100m CPU, 128Mi memory

Apply LimitRange:

Kubernetesbash
sudo kubectl apply -f limit-range.yml

Sekarang Pod apapun yang dibuat di Namespace development tanpa spesifikasi resource akan otomatis mendapatkan default ini.

Menghapus Namespace

Untuk menghapus Namespace:

Kubernetesbash
sudo kubectl delete namespace development

Warning

Menghapus Namespace akan menghapus SEMUA resource di dalamnya. Aksi ini tidak bisa di-undo. Selalu double-check sebelum menghapus Namespace.

Kalian juga bisa delete menggunakan file YAML:

Kubernetesbash
sudo kubectl delete -f namespace.yml

Proses Deletion Namespace

Saat kalian delete Namespace:

  1. Namespace masuk ke state Terminating
  2. Kubernetes menghapus semua resource dalam Namespace
  3. Setelah semua resource dihapus, Namespace itu sendiri dihapus

Kalian bisa cek status:

Kubernetesbash
sudo kubectl get namespace development

Output selama deletion:

Kubernetesbash
NAME          STATUS        AGE
development   Terminating   5m

Kesalahan Umum dan Pitfall

Kesalahan 1: Tidak Specify Namespace

Lupa specify Namespace saat bekerja dengan resource bisa menyebabkan kebingungan.

Problem: Kalian membuat resource tapi tidak bisa menemukannya karena ada di Namespace berbeda.

Solusi: Selalu specify Namespace secara eksplisit atau set default Namespace untuk context kalian.

Kesalahan 2: Menggunakan Namespace untuk Network Isolation

Namespace menyediakan logical isolation, bukan network isolation. Pod di Namespace berbeda masih bisa berkomunikasi secara default.

Solusi: Gunakan NetworkPolicy untuk actual network isolation antar Namespace.

Kesalahan 3: Membuat Terlalu Banyak Namespace

Membuat terlalu banyak Namespace bisa membuat cluster management kompleks.

Solusi: Gunakan Namespace untuk pembagian major (team, environment) dan gunakan Label untuk organisasi yang lebih fine-grained.

Kesalahan 4: Tidak Setting Resource Quota

Tanpa resource quota, satu Namespace bisa mengkonsumsi semua resource cluster.

Solusi: Selalu set ResourceQuota untuk production Namespace.

Kesalahan 5: Hardcode Nama Namespace

Hardcode nama Namespace di application code membuat sulit untuk deploy ke environment berbeda.

Solusi: Gunakan environment variable atau configuration file untuk specify nama Namespace.

Best Practice untuk Menggunakan Namespace

Gunakan Namespace untuk Pemisahan Environment

Buat Namespace terpisah untuk environment berbeda:

Kubernetesbash
sudo kubectl create namespace dev
sudo kubectl create namespace staging
sudo kubectl create namespace prod

Gunakan Namespace untuk Pemisahan Team

Buat Namespace terpisah untuk team berbeda:

Kubernetesbash
sudo kubectl create namespace team-backend
sudo kubectl create namespace team-frontend
sudo kubectl create namespace team-data

Selalu Set Resource Quota

Set resource quota untuk setiap Namespace untuk mencegah resource exhaustion:

Kubernetesquota-template.yml
apiVersion: v1
kind: ResourceQuota
metadata:
    name: namespace-quota
    namespace: <namespace-name>
spec:
    hard:
        requests.cpu: "10"
        requests.memory: 20Gi
        limits.cpu: "20"
        limits.memory: 40Gi
        pods: "50"
        services: "20"
        persistentvolumeclaims: "10"

Gunakan Label untuk Organisasi Namespace

Tambahkan Label ke Namespace untuk organisasi yang lebih baik:

Kubernetesyml
apiVersion: v1
kind: Namespace
metadata:
    name: production
    labels:
        environment: production
        team: platform
        cost-center: engineering
        compliance: pci-dss

Dokumentasikan Tujuan Namespace

Gunakan Annotation untuk mendokumentasikan tujuan setiap Namespace:

Kubernetesyml
apiVersion: v1
kind: Namespace
metadata:
    name: production
    annotations:
        description: "Production environment for customer-facing applications"
        contact: "platform-team@company.com"
        oncall: "https://oncall.company.com/platform"
        runbook: "https://runbook.company.com/production"

Gunakan Naming Convention

Tetapkan naming convention yang konsisten untuk Namespace:

  • <team>-<environment> (contoh: backend-prod, frontend-dev)
  • <project>-<environment> (contoh: web-app-staging, api-prod)
  • <environment> (contoh: development, staging, production)

Implementasikan RBAC per Namespace

Gunakan Role-Based Access Control (RBAC) untuk mengontrol siapa yang bisa mengakses setiap Namespace:

Kubernetesnamespace-rbac.yml
apiVersion: v1
kind: Namespace
metadata:
    name: team-backend
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
    name: developer
    namespace: team-backend
rules:
    - apiGroups: ["", "apps"]
      resources: ["pods", "deployments", "services"]
      verbs: ["get", "list", "create", "update", "delete"]

Kapan TIDAK Menggunakan Namespace

Sementara Namespace berguna, ada kasus dimana kalian tidak harus menggunakan Namespace:

  • Cluster kecil - Jika kalian punya cluster kecil dengan sedikit resource, Namespace mungkin menambah kompleksitas yang tidak perlu
  • Single team - Jika hanya satu team yang menggunakan cluster, Namespace mungkin tidak diperlukan
  • Network isolation - Jangan bergantung pada Namespace untuk network security. Gunakan NetworkPolicy sebagai gantinya
  • Organisasi fine-grained - Untuk mengorganisir resource dalam team atau project, gunakan Label sebagai gantinya

Penutup

Pada episode 8 ini, kita telah membahas konsep Namespace di Kubernetes secara mendalam. Kita sudah belajar apa itu Namespace, kenapa penting, cara membuat dan mengelola mereka, dan best practice untuk menggunakan mereka secara efektif.

Namespace adalah fitur fundamental untuk mengorganisir dan mengisolasi resource di Kubernetes cluster. Mereka enable multi-tenancy, resource quota, dan logical separation dari environment. Dengan memahami Namespace, kalian bisa mengelola cluster kompleks dengan multiple team, project, dan environment lebih efektif.

Key takeaway:

  • Namespace menyediakan logical isolation dan name scoping
  • Gunakan Namespace untuk pemisahan environment dan team
  • Selalu set ResourceQuota untuk mencegah resource exhaustion
  • Kombinasikan Namespace dengan Label dan RBAC untuk complete resource management
  • Nama DNS include Namespace untuk cross-Namespace communication

Bagaimana, makin jelas kan tentang Namespace di Kubernetes? Di episode 9 berikutnya, kita akan membahas Pod Deletion.

Catatan

Untuk kalian yang ingin melanjutkan membaca, bisa click thumbnail episode 9 di bawah ini

Episode 9Episode 9

Related Posts