Di episode ini kita akan coba bahas konsep penting lainnya di Kubernetes yaitu Annotation. Kita akan mempelajari cara menggunakan Annotation untuk attach arbitrary metadata ke object Kubernetes.

Catatan
Untuk kalian yang ingin membaca episode sebelumnya, bisa click thumbnail episode 6 di bawah ini
Di episode sebelumnya kita sudah mengetahui lebih dalam terkait object Label dalam konteks Kubernetes. Selanjutnya di episode 7 kali ini, kita akan coba bahas konsep penting lainnya yang melengkapi Label yaitu Annotation.
Catatan: Disini saya akan menggunakan Kubernetes Cluster yang di install melalui K3s.
Sementara Label digunakan untuk identifikasi dan selection object, Annotation memiliki tujuan yang berbeda. Annotation dirancang untuk attach arbitrary non-identifying metadata ke object. Metadata ini bisa digunakan oleh tools, library, atau manusia untuk menyimpan informasi tambahan tentang resource tanpa mempengaruhi bagaimana Kubernetes memilih atau mengelola mereka.
Annotation adalah pasangan key-value yang kalian attach ke object Kubernetes untuk menyimpan arbitrary metadata. Berbeda dengan Label, Annotation tidak digunakan untuk mengidentifikasi dan memilih object. Sebaliknya, mereka digunakan untuk attach informasi non-identifying yang bisa berguna untuk tools, automation, dokumentasi, atau tujuan operasional.
Bayangkan Annotation seperti sticky notes yang kalian tempel pada object. Notes ini berisi informasi yang berguna untuk referensi tapi tidak mempengaruhi bagaimana object dipilih atau dikelompokkan. Sebagai contoh, kalian mungkin menambahkan annotation untuk mencatat siapa yang membuat resource, kapan terakhir di-update, atau tool apa yang digunakan untuk deploy.
Annotation membantu kalian untuk:
Annotation terdiri dari dua bagian:
description, build-version, contact)Sebagai contoh:
description: "Production web server for customer portal"
build-version: "v1.2.3-abc123"
contact: "platform-team@company.com"Annotation mengikuti aturan penamaan yang mirip dengan Label, tapi dengan beberapa perbedaan:
/)-), underscore (_), dan dot (.)Contoh yang valid:
description: "Web application server"
kubernetes.io/change-cause: "Update to version 2.0"
company.com/team: "platform-engineering"
build-info: '{"version":"1.0","commit":"abc123"}'Contoh yang tidak valid:
-description: "Invalid" # Key dimulai dengan hyphen
description-: "Invalid" # Key diakhiri dengan hyphen
kubernetes.io/-change: "Invalid" # Name part dimulai dengan hyphenKalian mungkin bertanya kenapa kita butuh Label dan Annotation. Perbedaan kuncinya adalah tujuan mereka:
Pertimbangkan skenario ini: Kalian ingin menyimpan informasi tentang siapa yang deploy Pod, dari Git commit mana, dan Jira ticket mana yang mengotorisasi deployment. Informasi ini berguna untuk auditing dan troubleshooting, tapi kalian tidak perlu memilih Pod berdasarkan informasi ini. Ini sempurna untuk Annotation.
Perbedaan penting lainnya adalah Label memiliki batasan ukuran yang ketat (63 karakter untuk value), sementara Annotation bisa menyimpan jumlah data yang jauh lebih besar. Ini membuat Annotation cocok untuk menyimpan structured data seperti konfigurasi JSON atau deskripsi yang lebih panjang.
Untuk membantu kalian memahami kapan menggunakan Label vs Annotation, berikut perbandingannya:
| Aspek | Label | Annotation |
|---|---|---|
| Tujuan | Identifikasi dan selection | Penyimpanan metadata |
| Digunakan oleh Kubernetes | Ya (untuk selector) | Tidak |
| Batasan ukuran value | 63 karakter | Tidak ada batasan praktis |
| Bisa mengandung spasi | Tidak | Ya |
| Bisa mengandung karakter spesial | Terbatas | Ya |
| Digunakan untuk grouping | Ya | Tidak |
| Digunakan untuk querying | Ya | Tidak |
| Digunakan oleh tools | Kadang | Sering |
Di environment Kubernetes production, ada pola annotation umum yang digunakan tim:
Annotation ini melacak detail build dan deployment:
build-version: "v1.2.3"
git-commit: "abc123def456"
git-branch: "main"
build-date: "2026-03-01T10:30:00Z"
deployed-by: "john.doe@company.com"
deployment-tool: "ArgoCD"Annotation ini menyediakan dokumentasi dan detail kontak:
description: "Production API server for customer portal"
documentation: "https://docs.company.com/api-server"
contact: "platform-team@company.com"
oncall: "https://oncall.company.com/platform"
runbook: "https://runbook.company.com/api-server"Annotation ini melacak informasi change management:
jira-ticket: "PROJ-1234"
change-request: "CHG0012345"
approved-by: "jane.smith@company.com"
kubernetes.io/change-cause: "Update to version 2.0 for security patch"Banyak Kubernetes tools menggunakan annotation untuk konfigurasi:
# Annotation ingress controller
nginx.ingress.kubernetes.io/rewrite-target: "/"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
# Annotation monitoring Prometheus
prometheus.io/scrape: "true"
prometheus.io/port: "9090"
prometheus.io/path: "/metrics"
# Annotation service mesh
sidecar.istio.io/inject: "true"Annotation bisa menyimpan structured configuration data:
config: '{"timeout":30,"retries":3,"backoff":"exponential"}'
feature-flags: '{"new-ui":true,"beta-api":false}'Sekarang kita akan belajar cara menambahkan Annotation ke object Kubernetes. Ada dua cara utama untuk menambahkan Annotation:
Cara paling umum adalah menambahkan Annotation langsung di file konfigurasi YAML di bawah section metadata:
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
annotations:
description: "Production web server"
build-version: "v1.2.3"
git-commit: "abc123"
contact: "platform-team@company.com"
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80Dalam contoh ini, kita sudah menambahkan empat annotation ke Pod:
description - Deskripsi yang human-readable dari Podbuild-version - Versi dari aplikasigit-commit - Git commit hash yang digunakan untuk build imagecontact - Informasi kontak untuk tim yang bertanggung jawabKalian juga bisa menambahkan Annotation ke object yang sudah ada menggunakan perintah kubectl annotate:
sudo kubectl annotate pod <nama_pod> <key>=<value>Sebagai contoh, untuk menambahkan annotation ke Pod yang sudah ada:
sudo kubectl annotate pod nginx-pod description="Production web server"Untuk menambahkan banyak annotation sekaligus:
sudo kubectl annotate pod nginx-pod build-version=v1.2.3 git-commit=abc123Untuk overwrite annotation yang sudah ada, gunakan flag --overwrite:
sudo kubectl annotate pod nginx-pod description="Updated description" --overwriteSetelah menambahkan Annotation ke object, kalian bisa melihatnya menggunakan berbagai perintah kubectl:
Cara paling umum untuk melihat annotation adalah menggunakan perintah kubectl describe:
sudo kubectl describe pod nginx-podOutput akan include section annotation:
Kalian juga bisa melihat annotation dalam format YAML atau JSON:
sudo kubectl get pod nginx-pod -o yamlOutput akan menampilkan annotation di section metadata:
Mari kita buat contoh praktis dimana kita membuat Pod dengan berbagai annotation:
Buat file bernama annotated-pod.yml:
apiVersion: v1
kind: Pod
metadata:
name: web-app
labels:
app: web
environment: production
annotations:
description: "Production web application server"
version: "2.1.0"
build-date: "2026-03-01T10:00:00Z"
git-commit: "a1b2c3d4e5f6"
git-branch: "main"
deployed-by: "john.doe@company.com"
jira-ticket: "PROJ-1234"
contact: "platform-team@company.com"
documentation: "https://docs.company.com/web-app"
kubernetes.io/change-cause: "Deploy version 2.1.0 with security fixes"
spec:
containers:
- name: web
image: nginx:1.25
ports:
- containerPort: 80sudo kubectl apply -f annotated-pod.ymlsudo kubectl describe pod web-appKalian akan melihat semua annotation yang kita tambahkan:
Mari kita update annotation version:
sudo kubectl annotate pod web-app version=2.1.1 --overwriteUntuk menghapus annotation, tambahkan tanda minus (-) setelah key:
sudo kubectl annotate pod web-app jira-ticket-Tip
Jangan lupa biasakan untuk menghapus resource seperti Pod yang sudah tidak dipakai agar komputer kita bisa menjalankan Pod lainnya tanpa terkendala. Untuk menghapus nya bisa menjalankan command berikut
sudo kubectl delete -f annotated-pod.ymlAnnotation tidak hanya digunakan untuk Pod. Kalian bisa menambahkan Annotation ke object Kubernetes apapun. Berikut adalah beberapa use case umum:
Deployment sering menggunakan annotation untuk melacak rollout history:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
annotations:
description: "Web application deployment"
version: "2.0.0"
kubernetes.io/change-cause: "Update to version 2.0"
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "8080"
prometheus.io/path: "/metrics"
spec:
containers:
- name: web
image: nginx:1.25
ports:
- containerPort: 80Service menggunakan annotation untuk konfigurasi load balancer:
apiVersion: v1
kind: Service
metadata:
name: web-service
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
service.beta.kubernetes.io/aws-load-balancer-internal: "true"
description: "Internal load balancer for web application"
spec:
selector:
app: web
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancerIngress resource sangat bergantung pada annotation untuk konfigurasi:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: "/"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
cert-manager.io/cluster-issuer: "letsencrypt-prod"
description: "Ingress for web application"
spec:
ingressClassName: nginx
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80Kesalahan umum adalah mencoba menggunakan annotation untuk memilih object. Annotation tidak bisa digunakan dengan selector.
Pendekatan yang salah:
# Ini TIDAK akan bekerja
sudo kubectl get pod -l description="Production web server"Pendekatan yang benar: Gunakan label untuk selection, annotation untuk metadata.
Jangan pernah menyimpan informasi sensitif seperti password atau API key di annotation. Mereka visible untuk siapa saja yang bisa melihat resource.
Solusi: Gunakan Kubernetes Secret untuk data sensitif.
Sementara annotation bisa menyimpan jumlah data yang besar, jangan abuse kemampuan ini. Menyimpan terlalu banyak data di annotation bisa membuat resource sulit untuk dikelola.
Solusi: Jaga annotation tetap concise dan relevan. Gunakan ConfigMap atau external storage untuk data konfigurasi yang besar.
Banyak tools mengharapkan annotation key tertentu. Menggunakan non-standard key bisa merusak integrasi tool.
Solusi: Ikuti konvensi Kubernetes dan dokumentasi tool untuk annotation key.
Saat membuat custom annotation, gunakan domain prefix untuk menghindari konflik:
apiVersion: v1
kind: Pod
metadata:
name: app-pod
annotations:
company.com/team: "platform"
company.com/cost-center: "engineering"
company.com/project: "web-app"
spec:
containers:
- name: app
image: nginxBuat dokumentasi untuk tim kalian tentang annotation apa yang harus digunakan dan kapan. Ini memastikan consistency di seluruh cluster kalian.
Lacak perubahan dan deployment menggunakan annotation:
apiVersion: v1
kind: Pod
metadata:
name: app-pod
annotations:
deployed-at: "2026-03-01T10:30:00Z"
deployed-by: "john.doe@company.com"
deployment-tool: "kubectl"
change-ticket: "CHG0012345"
approved-by: "jane.smith@company.com"
spec:
containers:
- name: app
image: nginxUntuk konfigurasi kompleks, gunakan JSON atau YAML di annotation value:
apiVersion: v1
kind: Pod
metadata:
name: app-pod
annotations:
config: '{"timeout":30,"retries":3,"backoff":"exponential"}'
feature-flags: '{"new-ui":true,"beta-api":false,"dark-mode":true}'
spec:
containers:
- name: app
image: nginxGunakan label untuk identifikasi dan selection, annotation untuk metadata:
apiVersion: v1
kind: Pod
metadata:
name: app-pod
labels:
app: web
environment: production
tier: frontend
annotations:
description: "Production web server"
version: "2.1.0"
contact: "platform-team@company.com"
spec:
containers:
- name: app
image: nginxSementara annotation berguna, ada kasus dimana kalian tidak harus menggunakan annotation:
Pada episode 7 ini, kita telah membahas konsep Annotation di Kubernetes secara mendalam. Kita sudah belajar apa itu annotation, bagaimana mereka berbeda dari label, cara menambahkan ke object, dan best practice untuk menggunakan mereka secara efektif.
Annotation adalah fitur powerful yang memungkinkan kalian untuk attach arbitrary metadata ke object Kubernetes. Mereka essential untuk menyimpan informasi build, dokumentasi, konfigurasi tool, dan audit trail. Dengan memahami perbedaan antara label dan annotation, kalian bisa menggunakan setiap fitur dengan tepat untuk membuat cluster Kubernetes kalian lebih manageable dan well-documented.
Sementara label membantu Kubernetes mengidentifikasi dan memilih object, annotation membantu manusia dan tools memahami dan mengelola object tersebut. Bersama-sama, mereka menyediakan sistem metadata yang lengkap untuk resource cluster kalian.
Bagaimana, makin jelas kan tentang Annotation di Kubernetes? Di episode 8 berikutnya, kita akan membahas konsep Kubernetes penting lainnya: Namespace. Namespace menyediakan cara untuk membagi resource cluster antara multiple user atau team. Jadi, pastikan tetap semangat belajar dan nantikan episode selanjutnya!