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.

Catatan
Untuk kalian yang ingin membaca episode sebelumnya, bisa click thumbnail episode 7 di bawah ini
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.
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:
Karakteristik kunci dari Namespace:
Kalian mungkin bertanya kenapa kita butuh Namespace ketika kita sudah punya Label untuk mengorganisir resource. Perbedaan kuncinya adalah:
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.
Saat kalian membuat Kubernetes cluster, cluster tersebut datang dengan beberapa 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.
# Ini query default Namespace
sudo kubectl get podsNamespace 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.
# Lihat system component
sudo kubectl get pods -n kube-systemWarning
Hati-hati saat bekerja dengan resource di Namespace kube-system. Menghapus atau memodifikasi resource ini bisa merusak cluster kalian.
Namespace kube-public bisa dibaca oleh semua user (termasuk unauthenticated user). Namespace ini biasanya digunakan untuk resource yang harus publicly accessible di seluruh cluster.
# Lihat public resource
sudo kubectl get all -n kube-publicNamespace kube-node-lease menyimpan lease object yang terkait dengan setiap node. Node lease memungkinkan kubelet mengirim heartbeat sehingga control plane bisa mendeteksi node failure.
# Lihat node lease
sudo kubectl get leases -n kube-node-leaseMari kita belajar cara melihat Namespace di cluster kalian:
Untuk melihat semua Namespace di cluster kalian:
sudo kubectl get namespacesAtau gunakan shorthand:
sudo kubectl get nsOutput nya akan terlihat seperti ini:
NAME STATUS AGE
default Active 45d
kube-node-lease Active 45d
kube-public Active 45d
kube-system Active 45dUntuk melihat informasi detail tentang Namespace tertentu:
sudo kubectl describe namespace defaultOutput akan menampilkan:
Name: default
Labels: kubernetes.io/metadata.name=default
Annotations: <none>
Status: Active
No resource quota.
No LimitRange resource.Untuk melihat resource di Namespace tertentu, gunakan flag -n atau --namespace:
# Lihat Pod di Namespace kube-system
sudo kubectl get pods -n kube-system
# Lihat semua resource di Namespace
sudo kubectl get all -n kube-systemUntuk melihat resource di semua Namespace, gunakan flag --all-namespaces atau -A:
# Lihat semua Pod di semua Namespace
sudo kubectl get pods --all-namespaces
# Atau gunakan shorthand
sudo kubectl get pods -AAda dua cara utama untuk membuat Namespace:
Cara tercepat untuk membuat Namespace adalah menggunakan perintah kubectl create namespace:
sudo kubectl create namespace developmentAtau gunakan shorthand:
sudo kubectl create ns stagingKalian juga bisa membuat Namespace menggunakan file konfigurasi YAML:
apiVersion: v1
kind: Namespace
metadata:
name: production
labels:
environment: production
team: platformApply konfigurasi:
sudo kubectl apply -f namespace.ymlKalian bisa menambahkan Label dan Annotation ke Namespace untuk organisasi yang lebih baik:
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"Saat membuat resource, kalian bisa specify Namespace dengan dua cara:
Cara 1: Di konfigurasi YAML
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: development
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80Cara 2: Menggunakan flag kubectl
sudo kubectl apply -f pod.yml -n developmentDaripada specify Namespace setiap kali, kalian bisa set default Namespace untuk kubectl context kalian:
# Set default Namespace ke development
sudo kubectl config set-context --current --namespace=developmentSekarang semua perintah kubectl akan menggunakan Namespace development secara default:
# Ini akan query Namespace development
sudo kubectl get podsUntuk switch kembali ke default Namespace:
sudo kubectl config set-context --current --namespace=defaultUntuk melihat Namespace mana yang saat ini di-set sebagai default:
sudo kubectl config view --minify | grep namespace:Mari kita buat contoh praktis dimana kita setup multiple Namespace untuk environment yang berbeda:
Buat file bernama environments.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:
sudo kubectl apply -f environments.ymlBuat file bernama app-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: 80Apply konfigurasi:
sudo kubectl apply -f app-deployments.ymlSekarang kita punya Pod dengan nama yang sama (web-app) di tiga Namespace berbeda:
# 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-appOutput akan menampilkan:
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 2mTip
Perhatikan bagaimana kita bisa memiliki resource dengan nama yang sama di Namespace berbeda. Ini adalah salah satu benefit kunci dari menggunakan Namespace.
Kubernetes DNS secara otomatis membuat DNS record untuk Service. Nama DNS include Namespace, memungkinkan Service untuk berkomunikasi antar Namespace.
Service mendapatkan nama DNS dalam format ini:
<service-name>.<namespace>.svc.cluster.localSebagai contoh:
web-service.development.svc.cluster.localweb-service.production.svc.cluster.localDalam 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:
sudo kubectl exec -it web-app -n development -- bashSetelah itu bisa install network tools seperti dnsutils, iputils-ping, dan curl
apt update
apt install dnsutils iputils-ping curl -yMaka hasilnya ketika http request menggunakan curl adalah mengembalikan isian html dari nginx page nya
# Cara 1
curl http://web-service
# Cara 2
curl http://web-service.production
# Cara 3
curl http://web-service.production.svc.cluster.localcurl http://web-serviceAntar Namespace, kalian perlu gunakan full DNS name:
curl http://web-service.production.svc.cluster.localBuat Service di Namespace berbeda:
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: 80Sekarang Pod di Namespace development bisa mengakses Service di Namespace production:
# Dari Pod di Namespace development
curl http://web-service.production.svc.cluster.localSalah satu fitur paling powerful dari Namespace adalah kemampuan untuk set resource quota. Ini mencegah single Namespace mengkonsumsi semua resource cluster.
Buat file bernama resource-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:
Apply quota:
sudo kubectl apply -f resource-quota.ymlUntuk melihat resource quota di Namespace:
sudo kubectl get resourcequota -n developmentUntuk informasi detail:
sudo kubectl describe resourcequota compute-quota -n developmentOutput akan menampilkan:
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 8GiSaat kalian mencoba membuat Pod yang melebihi quota, akan ditolak:
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: 20GiApply ini akan gagal:
sudo kubectl apply -f large-pod.ymlError message:
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=8GiLimitRange memungkinkan kalian untuk set default resource limit untuk container di Namespace. Ini berguna saat developer lupa specify resource limit.
Buat file bernama limit-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: ContainerLimitRange ini set:
Apply LimitRange:
sudo kubectl apply -f limit-range.ymlSekarang Pod apapun yang dibuat di Namespace development tanpa spesifikasi resource akan otomatis mendapatkan default ini.
Untuk menghapus Namespace:
sudo kubectl delete namespace developmentWarning
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:
sudo kubectl delete -f namespace.ymlSaat kalian delete Namespace:
TerminatingKalian bisa cek status:
sudo kubectl get namespace developmentOutput selama deletion:
NAME STATUS AGE
development Terminating 5mLupa 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.
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.
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.
Tanpa resource quota, satu Namespace bisa mengkonsumsi semua resource cluster.
Solusi: Selalu set ResourceQuota untuk production 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.
Buat Namespace terpisah untuk environment berbeda:
sudo kubectl create namespace dev
sudo kubectl create namespace staging
sudo kubectl create namespace prodBuat Namespace terpisah untuk team berbeda:
sudo kubectl create namespace team-backend
sudo kubectl create namespace team-frontend
sudo kubectl create namespace team-dataSet resource quota untuk setiap Namespace untuk mencegah resource exhaustion:
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"Tambahkan Label ke Namespace untuk organisasi yang lebih baik:
apiVersion: v1
kind: Namespace
metadata:
name: production
labels:
environment: production
team: platform
cost-center: engineering
compliance: pci-dssGunakan Annotation untuk mendokumentasikan tujuan setiap Namespace:
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"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)Gunakan Role-Based Access Control (RBAC) untuk mengontrol siapa yang bisa mengakses setiap Namespace:
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"]Sementara Namespace berguna, ada kasus dimana kalian tidak harus menggunakan Namespace:
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:
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