Manifest adalah berkas YAML yang mengirimkan deklarasi objek kepada API server, dan setiap manifest dibangun dari struktur yang sama. Topik ini membedah empat kunci tingkat atas beserta isinya, alasan apiVersion berbeda antarjenis objek, aturan penulisan metadata, serta disiplin penulisan YAML yang membuat manifest sah. Pembacaan struktur dilakukan secara terprogram, sehingga setiap kunci dapat diverifikasi dari keluaran parser.
Empat kunci tingkat atas#
Setiap manifest Kubernetes, tanpa memandang jenis objeknya, selalu dibangun dari empat kunci tingkat atas. Kunci apiVersion menyatakan versi skema API yang menangani objek, kind menyebut jenis objeknya, metadata mengidentifikasinya, dan spec mendeklarasikan keadaan yang diinginkan. Urutan penulisan keempat kunci tidak wajib, tetapi urutan apiVersion, kind, metadata, spec menjadi konvensi yang membuat manifest mudah dibaca.
| Kunci | Isi |
|---|---|
| apiVersion | Versi API yang menangani objek, misalnya v1 atau apps/v1 |
| kind | Jenis objek yang dideklarasikan, misalnya Pod atau Deployment |
| metadata | Nama, namespace, label, dan anotasi objek |
| spec | Keadaan akhir yang diinginkan untuk objek tersebut |
API server memvalidasi manifest terhadap skema yang ditunjuk oleh apiVersion dan kind. Field yang tidak dikenal membuat penerapan ditolak, sehingga kesalahan penulisan kunci terdeteksi sebelum objek dibuat. Selain keempat kunci tersebut, objek yang sudah berjalan juga memuat kunci status yang diisi oleh sistem, dan kunci itu tidak ditulis pada manifest yang dikirim. Apabila kunci status ikut ditulis, nilainya diabaikan kemudian ditimpa oleh sistem.
apiVersion dan hubungannya dengan kind#
Nilai apiVersion terdiri atas nama grup dan versi yang dipisahkan garis miring. Objek paling mendasar seperti Pod, Service, Namespace, dan ConfigMap berada pada grup inti yang ditulis v1 tanpa nama grup. Controller beban kerja seperti Deployment, ReplicaSet, StatefulSet, dan DaemonSet berada pada grup apps dengan versi v1, sehingga pasangan yang benar adalah apps/v1. Grup lain mengikuti pola yang sama, misalnya networking.k8s.io/v1 untuk Ingress.
Pemisahan grup memungkinkan skema satu keluarga objek berkembang tanpa mengganggu keluarga lain. Angka versinya bergerak dari alpha menuju beta dan stabil, sehingga perubahan besar selalu disertai kenaikan versi. Pasangan apiVersion dan kind wajib cocok dengan yang didukung kluster, karena API server menolak manifest yang pasangannya tidak dikenal dengan pesan error no matches for kind.
Perintah kubectl api-resources menampilkan seluruh pasangan apiVersion dan kind yang didukung kluster tempat perintah dijalankan. Daftarnya panjang, sehingga opsi –api-group digunakan untuk menyaring keluaran berdasarkan grup tertentu. Keluaran berikut memperlihatkan bagian yang relevan bagi topik ini.
# tidak-dijalankan
# menampilkan daftar jenis objek beserta grup API-nya
kubectl api-resourcesNAME SHORTNAMES APIVERSION NAMESPACED KIND
configmaps cm v1 true ConfigMap
pods po v1 true Pod
services svc v1 true Service
deployments deploy apps/v1 true Deployment
replicasets rs apps/v1 true ReplicaSetmetadata: nama dan label#
Kunci metadata menampung data yang mengidentifikasi objek tanpa menyentuh perilakunya. Field utamanya adalah name, namespace, labels, dan annotations. Field name berlaku unik untuk satu jenis objek di dalam satu namespace, sehingga dua Pod bernama sama tidak dapat hidup berdampingan, sedangkan dua Pod bernama sama pada namespace yang berbeda tidak bertentangan.
Penamaan mengikuti format DNS. Karakter yang diizinkan adalah huruf kecil, angka, tanda hubung, dan titik, dengan batas panjang umum 253 karakter dan sebagian jenis objek menggunakan batas 63 karakter. Field name wajib diisi, kecuali generateName yang meminta API server menambahkan akhiran acak secara otomatis. Field namespace bersifat opsional, dan bila dikosongkan objek ditempatkan pada namespace default.
Labels dan annotations sama-sama menyimpan metadata bebas, tetapi tujuannya berbeda. Label dimaksudkan untuk dipilih oleh selector, sedangkan annotation menyimpan data non-identifikasi yang ukurannya dapat lebih besar, misalnya catatan pemilik atau rujukan alat lain. Pembagian peran ini menjaga label tetap ramping karena selector menyeleksi objek berdasarkan label, bukan berdasarkan annotation.
spec dan aturan penulisan YAML#
Kunci spec berisi keadaan akhir yang diinginkan. Isinya berbeda untuk setiap kind, misalnya spec Pod berisi daftar containers, sedangkan spec Deployment berisi replicas, selector, dan template Pod. Perbedaan itu menegaskan bahwa skema spec selalu mengikuti kind yang dideklarasikan. Manifest berikut memperlihatkan keempat kunci tingkat atas pada satu berkas Deployment yang lengkap.
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
labels:
app: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:1.27
ports:
- containerPort: 80Skrip Python berikut mem-parse deployment.yaml menggunakan PyYAML, kemudian mencetak nilai dari keempat kunci tersebut untuk mengonfirmasi struktur berkasnya.
"""Membaca deployment.yaml dan menampilkan empat kunci tingkat atas."""
import yaml
with open("deployment.yaml") as berkas:
manifest = yaml.safe_load(berkas)
print(f"apiVersion : {manifest['apiVersion']}")
print(f"kind : {manifest['kind']}")
print(f"nama : {manifest['metadata']['name']}")
print(f"label : {manifest['metadata']['labels']}")
print(f"replicas : {manifest['spec']['replicas']}")
container = manifest["spec"]["template"]["spec"]["containers"][0]
print(f"container : {container['name']} (image {container['image']})")apiVersion : apps/v1
kind : Deployment
nama : web-deployment
label : {'app': 'web'}
replicas : 3
container : web (image nginx:1.27)Manifest Kubernetes ditulis dalam YAML, sehingga aturan indentasinya berlaku penuh. Dua spasi menjadi lebar indentasi yang lazim, elemen daftar ditandai tanda hubung, dan pasangan key dengan value dipisahkan titik dua. Perubahan indentasi mengubah makna struktur, dan pergeseran yang keliru dapat mengubah kunci anak menjadi kunci lain atau membuat YAML gagal di-parse. Manifest yang sudah ditulis sebaiknya diuji dengan parser YAML terlebih dahulu sebelum diterapkan ke kluster.
import yaml
# teks YAML dengan indentasi kunci labels yang bergeser lebih dalam
teks = """
apiVersion: v1
kind: Pod
metadata:
name: web-statis
labels:
app: web
"""
try:
yaml.safe_load(teks)
except yaml.YAMLError as error:
print("YAML ditolak dengan pesan error:")
print(error)YAML ditolak dengan pesan error:
mapping values are not allowed here
in "<unicode string>", line 6, column 10:
labels:
^Pesan error PyYAML menunjuk baris keenam dan kolom kunci labels yang bergeser lebih dalam dari kunci name di atasnya. Pergeseran satu spasi semacam ini sulit terlihat pada layar, tetapi parser menandainya sebagai struktur yang tidak sah. Apabila manifest seperti ini diterapkan tanpa pemeriksaan, API server menolaknya dengan error serupa, sehingga pemeriksaan lokal menghemat siklus uji coba sebelum menyentuh kluster.
Ringkasan#
- Setiap manifest terdiri atas apiVersion, kind, metadata, dan spec, dengan kunci status dikelola sistem dan tidak ditulis pada manifest.
- Nilai apiVersion menyatakan grup dan versi skema yang wajib cocok dengan kind, misalnya v1 untuk Pod dan apps/v1 untuk Deployment.
- metadata.name harus unik untuk satu jenis objek di dalam satu namespace, sedangkan label pada metadata menyediakan metadata yang dipilih selector.
- Struktur YAML manifest bergantung penuh pada indentasi, sehingga manifest diuji dengan parser sebelum diterapkan ke kluster.
Referensi#
- Working with Objects — Kubernetes Docs — Struktur manifest objek, pengelolaan deklaratif, dan field yang menyusunnya.
- Pod v1 — Kubernetes API Reference — Skema lengkap Pod pada API v1 sebagai contoh struktur spec.
- kubectl Cheat Sheet — Kubernetes Docs — Rujukan perintah kubectl, termasuk api-resources untuk melihat pasangan grup API dan kind.