Belajar Kubernetes - Episode 6 - Pengenalan dan Penjelasan Object Label

Belajar Kubernetes - Episode 6 - Pengenalan dan Penjelasan Object Label

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.

Arman Dwi Pangestu
Arman Dwi PangestuFebruary 28, 2026
0 views
9 min read

Pendahuluan

Catatan

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

Episode 5Episode 5

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.

Apa Itu Label?

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:

  • Mengidentifikasi object - Mengetahui Pod mana yang milik aplikasi mana
  • Mengorganisir object - Mengelompokkan Pod berdasarkan environment (production, staging, development)
  • Memilih object - Menggunakan label selector untuk query dan mengelola object tertentu
  • Mengelola object - Menerapkan operasi ke banyak object yang berbagi label yang sama

Format Label

Label terdiri dari dua bagian:

  • Key - Identifier untuk label (contoh: app, environment, version)
  • Value - Nilai yang diberikan ke key tersebut (contoh: nginx, production, v1.0)

Sebagai contoh:

Kubernetesyml
app: nginx
environment: production
version: v1.0

Aturan Penamaan Label

Saat membuat Label, kalian perlu mengikuti konvensi penamaan berikut:

  • Key maksimal 63 karakter
  • Key harus dimulai dan diakhiri dengan karakter alphanumeric
  • Key bisa mengandung hyphen (-), underscore (_), dan dot (.)
  • Value maksimal 63 karakter
  • Value harus dimulai dan diakhiri dengan karakter alphanumeric
  • Value bisa mengandung hyphen (-), underscore (_), dan dot (.)

Contoh yang valid:

KubernetesContoh Label yang Valid
app: nginx
tier: backend
version: v1.0
environment: prod-us-east

Contoh yang tidak valid:

KubernetesContoh Label 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 hyphen

Kenapa Kita Butuh Label?

Kalian 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:

  • Service discovery - Service menggunakan label selector untuk menemukan Pod untuk routing traffic
  • Deployment management - Deployment menggunakan label selector untuk mengelola Pod mereka
  • Resource management - Kalian bisa menerapkan operasi ke banyak object yang match dengan label selector

Pola Label Umum

Di environment Kubernetes production, ada pola labeling umum yang digunakan tim:

Application Labels

Label ini mengidentifikasi aplikasi apa yang dimiliki resource:

Kubernetesyml
app: nginx
app.kubernetes.io/name: nginx
app.kubernetes.io/instance: nginx-prod

Environment Labels

Label ini mengidentifikasi environment:

Kubernetesyml
environment: production
environment: staging
environment: development

Version Labels

Label ini melacak versi aplikasi:

Kubernetesyml
version: v1.0
version: v2.0
app.kubernetes.io/version: 1.0.0

Component Labels

Label ini mengidentifikasi component atau tier:

Kubernetesyml
tier: frontend
tier: backend
tier: database
component: api
component: worker

Owner Labels

Label ini mengidentifikasi siapa yang memiliki atau mengelola resource:

Kubernetesyml
owner: platform-team
team: backend
managed-by: terraform

Menambahkan Label ke Object

Sekarang kita akan belajar cara menambahkan Label ke object Kubernetes. Ada dua cara utama untuk menambahkan Label:

Cara 1: Menambahkan Label di Konfigurasi YAML

Cara paling umum adalah menambahkan Label langsung di file konfigurasi YAML di bawah section metadata:

Kubernetespod-with-labels.yml
apiVersion: v1
kind: Pod
metadata:
    name: nginx-pod
    labels:
        app: nginx
        environment: production
        tier: frontend
spec:
    containers:
        - name: nginx
          image: nginx
          ports:
              - containerPort: 80

Dalam contoh ini, kita sudah menambahkan tiga label ke Pod:

  • app: nginx - Mengidentifikasi ini sebagai aplikasi Nginx
  • environment: production - Menunjukkan ini berjalan di production
  • tier: frontend - Menunjukkan ini adalah component frontend

Cara 2: Menambahkan Label dengan Perintah kubectl

Kalian juga bisa menambahkan Label ke object yang sudah ada menggunakan perintah kubectl label:

Kubernetesbash
sudo kubectl label pod <nama_pod> <key>=<value>

Sebagai contoh, untuk menambahkan label ke Pod yang sudah ada:

Kubernetesbash
sudo kubectl label pod nginx-pod app=nginx

Untuk menambahkan banyak label sekaligus:

Kubernetesbash
sudo kubectl label pod nginx-pod app=nginx environment=production tier=frontend

Untuk overwrite label yang sudah ada, gunakan flag --overwrite:

Kubernetesbash
sudo kubectl label pod nginx-pod environment=staging --overwrite

Melihat Label

Setelah menambahkan Label ke object, kalian bisa melihatnya menggunakan berbagai perintah kubectl:

Melihat Label dengan kubectl get

Untuk melihat label dari object, gunakan perintah kubectl get dengan flag -L atau --label-columns:

Kubernetesbash
sudo kubectl get pod -L app,environment,tier

Output nya akan terlihat seperti ini:

Kubernetesbash
NAME        READY   STATUS    RESTARTS   AGE     APP     ENVIRONMENT   TIER
nginx-pod   1/1     Running   0          5m      nginx   production    frontend

Melihat Semua Label

Untuk melihat semua label pada object, gunakan perintah kubectl describe:

Kubernetesbash
sudo kubectl describe pod nginx-pod

Output akan include section labels:

Kubernetesbash
Name:             nginx-pod
Namespace:        default
Priority:         0
Service Account:  default
Node:             devnull/10.10.10.4
Start Time:       Sat, 28 Feb 2026 13:08:25 +0700
Labels:           app=nginx
                  environment=staging
                  tier=frontend
Annotations:      <none>
Status:           Running
IP:               10.42.0.25
IPs:
  IP:  10.42.0.25
Containers:
  nginx:
    Container ID:   containerd://aa4f41008b45cfa4831de099b63dab0191b61f7daa5928ff7729cffd32fbeb6a
    Image:          nginx
    Image ID:       docker.io/library/nginx@sha256:0236ee02dcbce00b9bd83e0f5fbc51069e7e1161bd59d99885b3ae1734f3392e
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Sat, 28 Feb 2026 13:08:53 +0700
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-rd8mn (ro)
Conditions:
  Type                        Status
  PodReadyToStartContainers   True 
  Initialized                 True 
  Ready                       True 
  ContainersReady             True 
  PodScheduled                True 
Volumes:
  kube-api-access-rd8mn:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    Optional:                false
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age    From               Message
  ----    ------     ----   ----               -------
  Normal  Scheduled  3m17s  default-scheduler  Successfully assigned default/nginx-pod to devnull
  Normal  Pulling    3m11s  kubelet            Pulling image "nginx"
  Normal  Pulled     2m49s  kubelet            Successfully pulled image "nginx" in 21.235s (21.235s including waiting). Image size: 62944796 bytes.
  Normal  Created    2m49s  kubelet            Created container: nginx
  Normal  Started    2m49s  kubelet            Started container nginx

Label Selector

Label Selector adalah query yang memungkinkan kalian untuk memilih object berdasarkan label mereka. Ada dua tipe label selector:

Equality-Based Selector

Equality-based selector menggunakan operator =, ==, atau !=:

Kubernetesbash
# 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!=production

Set-Based Selector

Set-based selector menggunakan operator in, notin, dan exists:

Kubernetesbash
# 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"

Menggabungkan Multiple Selector

Kalian bisa menggabungkan multiple selector dengan comma (AND logic):

Kubernetesbash
# 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=frontend

Contoh Praktis: Membuat dan Mengelola Pod dengan Label

Mari kita buat contoh praktis dimana kita membuat banyak Pod dengan label berbeda dan kemudian query mereka:

Step 1: Membuat Banyak Pod dengan Label

Buat file bernama labeled-pods.yml:

Kuberneteslabeled-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: 5432

Step 2: Apply Konfigurasi

Kubernetesbash
sudo kubectl apply -f labeled-pods.yml

Step 3: Query Pod Berdasarkan Label

Sekarang mari kita query Pod menggunakan berbagai label selector:

Kubernetesbash
# Dapatkan semua Pod dengan app=nginx
sudo kubectl get pod -l app=nginx

Output:

Kubernetesbash
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
Kubernetesbash
# Dapatkan semua Pod di environment production
sudo kubectl get pod -l environment=production

Output:

Note

Jika pod postgres-prod terdapat error bisa kita abaikan terlebih dahulu, karena di episode ini fokus membahas mengenai object Label.

Kubernetesbash
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
Kubernetesbash
# Dapatkan semua Pod frontend
sudo kubectl get pod -l tier=frontend

Output:

Kubernetesbash
NAME                    READY   STATUS    RESTARTS   AGE
nginx-prod-frontend     1/1     Running   0          2m
nginx-dev-frontend      1/1     Running   0          2m
Kubernetesbash
# Dapatkan semua Pod dengan app=nginx AND environment=production
sudo kubectl get pod -l app=nginx,environment=production

Output:

Kubernetesbash
NAME                    READY   STATUS    RESTARTS   AGE
nginx-prod-frontend     1/1     Running   0          2m
nginx-prod-backend      1/1     Running   0          2m

Tip

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

Kubernetesbash
sudo kubectl delete -f labeled-pods.yml

Label di Object Kubernetes Lainnya

Label tidak hanya digunakan untuk Pod. Kalian bisa menambahkan Label ke object Kubernetes apapun. Berikut adalah beberapa use case umum:

Label di Deployment

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.

Kubernetesdeployment-with-labels.yml
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: 80

Setelah berhasil dibuat, kita bisa cek Pod yang dijalankan menggunakan Deployment tersebut menggunakan perintah berikut ini

Kubernetesbash
sudo kubectl get pod -l version=v1

Output nya akan terlihat seperti ini

Kubernetesbash
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          2m12s

Label di Service

Service menggunakan label selector untuk menemukan Pod untuk routing traffic:

Kubernetesservice-with-labels.yml
apiVersion: v1
kind: Service
metadata:
    name: nginx-service
    labels:
        app: nginx
spec:
    selector:
        app: nginx
    ports:
        - protocol: TCP
          port: 80
          targetPort: 80
    type: ClusterIP

Kesalahan Umum dan Pitfall

Kesalahan 1: Tidak Menggunakan Nama Label yang Konsisten

Kesalahan 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.

Kesalahan 2: Menggunakan Terlalu Banyak Label

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.

Kesalahan 3: Memasukkan Terlalu Banyak Informasi di Label Value

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).

Kesalahan 4: Lupa Update Label

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.

Best Practice untuk Menggunakan Label

Kubernetes merekomendasikan menggunakan set label standard. Label ini di-prefix dengan app.kubernetes.io/:

Kubernetesrecommended-labels.yml
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: nginx

Gunakan Label untuk Resource Management

Gunakan label untuk mengorganisir resource berdasarkan team, project, atau cost center:

Kuberneteslabels-for-management.yml
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: nginx

Dokumentasikan Strategi Labeling Kalian

Buat dokumentasi untuk tim kalian tentang label apa yang harus digunakan dan kapan. Ini memastikan consistency di seluruh cluster kalian.

Gunakan Label dengan Node Selector

Kalian bisa menggunakan label untuk schedule Pod di node tertentu:

Kubernetespod-with-node-selector.yml
apiVersion: v1
kind: Pod
metadata:
    name: nginx-pod
    labels:
        app: nginx
spec:
    nodeSelector:
        disk: ssd
        zone: us-east-1a
    containers:
        - name: nginx
          image: nginx

Kapan TIDAK Menggunakan Label

Sementara label powerful, ada kasus dimana kalian tidak harus menggunakan label:

  • Informasi sensitif - Jangan pernah memasukkan password, API key, atau data sensitif lainnya di label
  • Jumlah data besar - Label tidak dirancang untuk menyimpan jumlah data besar. Gunakan ConfigMap atau Secret sebagai gantinya
  • Data yang sering berubah - Jika data berubah frequently, label mungkin bukan pilihan terbaik. Pertimbangkan menggunakan annotation sebagai gantinya

Penutup

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!


Related Posts