Di episode ini kita akan coba bahas salah satu konsep paling penting di Kubernetes yaitu Label. Kita akan mempelajari cara menggunakan Label untuk mengorganisir, mengidentifikasi, dan mengelola object Kubernetes secara efektif.

Catatan
Untuk kalian yang ingin membaca episode sebelumnya, bisa click thumbnail episode 5 di bawah ini
Di episode sebelumnya kita sudah mengetahui lebih dalam terkait object Pod dalam konteks Kubernetes. Selanjutnya di episode 6 kali ini, kita akan coba bahas salah satu konsep paling penting di Kubernetes yaitu Label.
Catatan: Disini saya akan menggunakan Kubernetes Cluster yang di install melalui K3s.
Label adalah konsep fundamental di Kubernetes yang akan kalian gunakan secara terus-menerus saat bekerja dengan cluster. Memahami Label sangat penting karena digunakan untuk mengorganisir, mengidentifikasi, dan mengelola object Kubernetes. Tanpa Label, mengelola banyak object di dalam cluster akan menjadi sangat sulit.
Label adalah pasangan key-value yang kalian attach ke object Kubernetes untuk mengidentifikasi dan mengorganisir mereka. Bayangkan Label seperti tag atau stiker yang kalian tempel pada object untuk mengkategorikan mereka. Sebagai contoh, dalam skenario dunia nyata, kalian mungkin memiliki banyak Pod yang menjalankan aplikasi berbeda. Tanpa Label, akan sulit untuk mengidentifikasi Pod mana yang milik aplikasi mana atau environment mana.
Label membantu kalian untuk:
Label terdiri dari dua bagian:
app, environment, version)nginx, production, v1.0)Sebagai contoh:
app: nginx
environment: production
version: v1.0Saat membuat Label, kalian perlu mengikuti konvensi penamaan berikut:
-), underscore (_), dan dot (.)-), underscore (_), dan dot (.)Contoh yang valid:
app: nginx
tier: backend
version: v1.0
environment: prod-us-eastContoh yang tidak valid:
-app: nginx # Key dimulai dengan hyphen
app-: nginx # Key diakhiri dengan hyphen
app: -nginx # Value dimulai dengan hyphen
app: nginx- # Value diakhiri dengan hyphenKalian mungkin bertanya kenapa kita butuh Label ketika kita sudah punya nama object. Perbedaan kuncinya adalah nama adalah identifier unik untuk object individual, sementara Label digunakan untuk mengelompokkan dan mengorganisir banyak object.
Pertimbangkan skenario ini: Kalian punya 10 Pod yang berjalan di cluster. Beberapa menjalankan Nginx, beberapa menjalankan PostgreSQL, dan beberapa menjalankan Redis. Tanpa Label, kalian harus secara manual melacak Pod mana yang apa. Dengan Label, kalian bisa langsung query semua Pod dengan app: nginx dan dapatkan semua Pod Nginx secara instant.
Use case penting lainnya adalah Label Selector. Label Selector memungkinkan kalian untuk memilih sekelompok object berdasarkan label mereka. Ini digunakan secara ekstensif di Kubernetes untuk:
Di environment Kubernetes production, ada pola labeling umum yang digunakan tim:
Label ini mengidentifikasi aplikasi apa yang dimiliki resource:
app: nginx
app.kubernetes.io/name: nginx
app.kubernetes.io/instance: nginx-prodLabel ini mengidentifikasi environment:
environment: production
environment: staging
environment: developmentLabel ini melacak versi aplikasi:
version: v1.0
version: v2.0
app.kubernetes.io/version: 1.0.0Label ini mengidentifikasi component atau tier:
tier: frontend
tier: backend
tier: database
component: api
component: workerLabel ini mengidentifikasi siapa yang memiliki atau mengelola resource:
owner: platform-team
team: backend
managed-by: terraformSekarang kita akan belajar cara menambahkan Label ke object Kubernetes. Ada dua cara utama untuk menambahkan Label:
Cara paling umum adalah menambahkan Label langsung di file konfigurasi YAML di bawah section metadata:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
environment: production
tier: frontend
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80Dalam contoh ini, kita sudah menambahkan tiga label ke Pod:
app: nginx - Mengidentifikasi ini sebagai aplikasi Nginxenvironment: production - Menunjukkan ini berjalan di productiontier: frontend - Menunjukkan ini adalah component frontendKalian juga bisa menambahkan Label ke object yang sudah ada menggunakan perintah kubectl label:
sudo kubectl label pod <nama_pod> <key>=<value>Sebagai contoh, untuk menambahkan label ke Pod yang sudah ada:
sudo kubectl label pod nginx-pod app=nginxUntuk menambahkan banyak label sekaligus:
sudo kubectl label pod nginx-pod app=nginx environment=production tier=frontendUntuk overwrite label yang sudah ada, gunakan flag --overwrite:
sudo kubectl label pod nginx-pod environment=staging --overwriteSetelah menambahkan Label ke object, kalian bisa melihatnya menggunakan berbagai perintah kubectl:
Untuk melihat label dari object, gunakan perintah kubectl get dengan flag -L atau --label-columns:
sudo kubectl get pod -L app,environment,tierOutput nya akan terlihat seperti ini:
NAME READY STATUS RESTARTS AGE APP ENVIRONMENT TIER
nginx-pod 1/1 Running 0 5m nginx production frontendUntuk melihat semua label pada object, gunakan perintah kubectl describe:
sudo kubectl describe pod nginx-podOutput akan include section labels:
Label Selector adalah query yang memungkinkan kalian untuk memilih object berdasarkan label mereka. Ada dua tipe label selector:
Equality-based selector menggunakan operator =, ==, atau !=:
# Pilih semua Pod dengan app=nginx
sudo kubectl get pod -l app=nginx
# Pilih semua Pod dengan environment=production
sudo kubectl get pod -l environment=production
# Pilih semua Pod yang BUKAN di production
sudo kubectl get pod -l environment!=productionSet-based selector menggunakan operator in, notin, dan exists:
# Pilih Pod dimana environment adalah production atau staging
sudo kubectl get pod -l "environment in (production,staging)"
# Pilih Pod dimana environment BUKAN development
sudo kubectl get pod -l "environment notin (development)"
# Pilih Pod yang punya label tier (regardless of value) atau disebut opeartor exists
sudo kubectl get pod -l tier
# Pilih Pod yang tidak punya label tier atau disebut opeartor not exists
sudo kubectl get pod -l "!tier"Kalian bisa menggabungkan multiple selector dengan comma (AND logic):
# Pilih Pod dengan app=nginx AND environment=production
sudo kubectl get pod -l app=nginx,environment=production
# Pilih Pod dengan app=nginx AND tier=frontend
sudo kubectl get pod -l app=nginx,tier=frontendMari kita buat contoh praktis dimana kita membuat banyak Pod dengan label berbeda dan kemudian query mereka:
Buat file bernama labeled-pods.yml:
apiVersion: v1
kind: Pod
metadata:
name: nginx-prod-frontend
labels:
app: nginx
environment: production
tier: frontend
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-prod-backend
labels:
app: nginx
environment: production
tier: backend
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-dev-frontend
labels:
app: nginx
environment: development
tier: frontend
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Pod
metadata:
name: postgres-prod
labels:
app: postgres
environment: production
tier: database
spec:
containers:
- name: postgres
image: postgres:15
ports:
- containerPort: 5432sudo kubectl apply -f labeled-pods.ymlSekarang mari kita query Pod menggunakan berbagai label selector:
# Dapatkan semua Pod dengan app=nginx
sudo kubectl get pod -l app=nginxOutput:
NAME READY STATUS RESTARTS AGE
nginx-prod-frontend 1/1 Running 0 2m
nginx-prod-backend 1/1 Running 0 2m
nginx-dev-frontend 1/1 Running 0 2m# Dapatkan semua Pod di environment production
sudo kubectl get pod -l environment=productionOutput:
Note
Jika pod postgres-prod terdapat error bisa kita abaikan terlebih dahulu, karena di episode ini fokus membahas mengenai object Label.
NAME READY STATUS RESTARTS AGE
nginx-prod-frontend 1/1 Running 0 2m
nginx-prod-backend 1/1 Running 0 2m
postgres-prod 1/1 Running 0 2m# Dapatkan semua Pod frontend
sudo kubectl get pod -l tier=frontendOutput:
NAME READY STATUS RESTARTS AGE
nginx-prod-frontend 1/1 Running 0 2m
nginx-dev-frontend 1/1 Running 0 2m# Dapatkan semua Pod dengan app=nginx AND environment=production
sudo kubectl get pod -l app=nginx,environment=productionOutput:
NAME READY STATUS RESTARTS AGE
nginx-prod-frontend 1/1 Running 0 2m
nginx-prod-backend 1/1 Running 0 2mTip
Jangan lupa biasakan untuk menghapus resource seperti Pod yang sudah tidak dipakai agar komputer kita bisa menjalankan Pod lainnya tanpa terkendala. Unutk menghapus nya bisa menjalankan command berikut
sudo kubectl delete -f labeled-pods.ymlLabel tidak hanya digunakan untuk Pod. Kalian bisa menambahkan Label ke object Kubernetes apapun. Berikut adalah beberapa use case umum:
Saat kalian membuat Deployment, dia secara otomatis membuat Pod dengan label. Deployment menggunakan label selector untuk mengelola Pod nya:
Important
Pada object Deployment terdapat 2 metadata, metadata paling atas adalah untuk object Deployment nya itu sendiri, sedangkan metadata yang ada di template itu adalah untuk object Pod nya, sehingga semua Pod akan mempunyai metadata yang sama berdasarkan yang ada di template. Metadata di template tersebut juga digunakan sebagai identifikasi selector pada matchLabels nya.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
version: v1
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
version: v1
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80Setelah berhasil dibuat, kita bisa cek Pod yang dijalankan menggunakan Deployment tersebut menggunakan perintah berikut ini
sudo kubectl get pod -l version=v1Output nya akan terlihat seperti ini
NAME READY STATUS RESTARTS AGE
nginx-deployment-58fc95c95c-ctzzf 1/1 Running 0 2m12s
nginx-deployment-58fc95c95c-sxskq 1/1 Running 0 2m12s
nginx-deployment-58fc95c95c-w8xw8 1/1 Running 0 2m12sService menggunakan label selector untuk menemukan Pod untuk routing traffic:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIPKesalahan umum adalah menggunakan nama label yang tidak konsisten di berbagai object. Sebagai contoh, menggunakan app di satu Pod dan application di Pod lain. Ini membuat sulit untuk query object secara konsisten.
Solusi: Tetapkan konvensi labeling untuk tim kalian dan patuhi itu. Gunakan nama label yang standardized seperti app, environment, tier, dll.
Sementara label berguna, menambahkan terlalu banyak label ke object bisa membuat mereka sulit untuk dikelola dan dipahami.
Solusi: Gunakan hanya label yang kalian butuhkan. Biasanya, 3-5 label per object sudah cukup.
Label value harus concise dan meaningful. Hindari memasukkan deskripsi panjang atau informasi kompleks di label value.
Solusi: Jaga label value tetap singkat dan simple. Gunakan hyphen untuk memisahkan kata jika diperlukan (contoh: prod-us-east daripada production-united-states-east).
Saat kalian update konfigurasi object, kalian mungkin lupa untuk update label nya. Ini bisa menyebabkan inconsistency.
Solusi: Selalu review dan update label saat membuat perubahan ke object.
Kubernetes merekomendasikan menggunakan set label standard. Label ini di-prefix dengan app.kubernetes.io/:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app.kubernetes.io/name: nginx
app.kubernetes.io/instance: nginx-prod
app.kubernetes.io/version: "1.0"
app.kubernetes.io/component: web-server
app.kubernetes.io/part-of: web-application
app.kubernetes.io/managed-by: helm
spec:
containers:
- name: nginx
image: nginxGunakan label untuk mengorganisir resource berdasarkan team, project, atau cost center:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
team: platform
project: web-app
cost-center: engineering
owner: john-doe
spec:
containers:
- name: nginx
image: nginxBuat dokumentasi untuk tim kalian tentang label apa yang harus digunakan dan kapan. Ini memastikan consistency di seluruh cluster kalian.
Kalian bisa menggunakan label untuk schedule Pod di node tertentu:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
nodeSelector:
disk: ssd
zone: us-east-1a
containers:
- name: nginx
image: nginxSementara label powerful, ada kasus dimana kalian tidak harus menggunakan label:
Pada episode 6 ini, kita telah membahas konsep Label di Kubernetes secara mendalam. Kita sudah belajar apa itu label, kenapa penting, cara menambahkan ke object, dan cara menggunakan label selector untuk query dan mengelola object.
Label adalah fundamental untuk bekerja secara efektif dengan Kubernetes. Mereka memungkinkan kalian untuk mengorganisir, mengidentifikasi, dan mengelola resource cluster kalian pada skala besar. Dengan mengikuti best practice dan menetapkan konvensi labeling yang konsisten, kalian bisa membuat cluster Kubernetes kalian jauh lebih mudah untuk dikelola dan dipahami.
Memahami label sangat crucial sebelum pindah ke konsep Kubernetes yang lebih advanced seperti Service, Deployment, dan StatefulSet, yang semuanya sangat bergantung pada label untuk operasi mereka.
Bagaimana, makin jelas kan tentang Label di Kubernetes? Di episode 7 berikutnya, kita akan membahas konsep Kubernetes penting lainnya yang melengkapi label: Annotation. Sementara label digunakan untuk identifikasi dan selection, annotation digunakan untuk attach arbitrary metadata ke object. Jadi, pastikan tetap semangat belajar dan nantikan episode selanjutnya!