Nilai request dan limit yang tertulis di manifest merupakan hipotesis tentang kebutuhan aplikasi, dan metrik pemakaian adalah data yang membuktikannya. Topik ini membahas metrics-server sebagai penyedia metrik di dalam kluster, pembacaan hasilnya dengan kubectl top, serta loop umpan balik yang mengubah data pemakaian menjadi penyesuaian request dan limit. Setelah membacanya, nilai request dan limit pada manifest dapat dinilai ulang berdasarkan data pemakaian yang benar-benar terjadi.
metrics-server sebagai penyedia metrik#
metrics-server adalah komponen kluster yang mengumpulkan penggunaan CPU dan memori dari kubelet di setiap Node melalui Summary API, lalu menyajikannya melalui API agregat metrics.k8s.io. Dua konsumen utamanya adalah perintah kubectl top dan HorizontalPodAutoscaler, yang keduanya membaca metrik dari jalur yang sama. Alur datanya tersusun tiga lapis. Kubelet mengumpulkan statistik dari container di Node-nya, metrics-server menarik ringkasan tersebut dari seluruh kubelet secara berkala, dan API agregat menyajikannya kepada klien dengan bentuk yang sama seperti API kluster lainnya.
Dengan pola ini, klien tidak perlu menjangkau setiap Node sendiri dan cukup bertanya kepada API server, sementara kebijakan hak akses tetap berlaku karena pembacaan dilakukan melalui API yang sama. Penyimpanan metrics-server berada di memori prosesnya dengan jendela waktu pendek, sehingga nilai yang ditawarkan adalah potret beberapa menit terakhir, bukan riwayat berhari-hari.
Pada kluster belajar minikube, metrics-server diaktifkan sebagai addon, sedangkan kluster produksi umumnya sudah memasangnya sejak awal karena HorizontalPodAutoscaler membutuhkannya.
# tidak-dijalankan
# mengaktifkan metrics-server pada kluster minikube
minikube addons enable metrics-server
# memastikan deployment metrics-server berjalan di namespace kube-system
kubectl get deployment metrics-server -n kube-systemNAME READY UP-TO-DATE AVAILABLE AGE
metrics-server 1/1 1 1 3mMembaca pemakaian dengan kubectl top#
Perintah kubectl top nodes menampilkan pemakaian agregat per Node, sedangkan kubectl top pods menampilkan pemakaian per Pod. CPU dicetak dalam milicore dengan 1000m berarti satu core penuh, dan memori dicetak dalam MiB. Kolom persentase pada kubectl top nodes dihitung terhadap kapasitas yang dapat dialokasikan untuk Pod, bukan terhadap seluruh kapasitas fisik Node, sehingga angkanya dapat dibaca langsung sebagai pemakaian beban kerja.
# tidak-dijalankan
# menampilkan pemakaian CPU dan memori per Node
kubectl top nodesNAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
node-01 312m 16% 2048Mi 27%
node-02 148m 7% 1523Mi 20%# tidak-dijalankan
# menampilkan pemakaian per Pod diurutkan dari CPU tertinggi
kubectl top pods -n aplikasi-catatan --sort-by=cpuNAME CPU(cores) MEMORY(bytes)
catatan-api-7d9c4b6d5f-xk2qz 470m 90Mi
catatan-api-7d9c4b6d5f-wm8pb 180m 95Mi
catatan-web-6b8f4d7c9d-t5rk2 20m 28MiAngka pada keluaran top baru bermakna apabila dibandingkan dengan request yang tertulis di manifest. Pod catatan-api pertama menampilkan 470m, sedangkan request CPU-nya 250m. Artinya, pemakaian hampir mencapai dua kali request. Kondisi seperti ini tidak langsung berbahaya, tetapi menjadi sinyal bahwa hipotesis awal tentang kebutuhan aplikasi perlu dikoreksi. Untuk melihat keduanya berdampingan, angka top dibandingkan dengan request melalui perintah kubectl get pods dengan -o custom-columns, misalnya kolom nama, request CPU, dan pemakaian CPU. Perbandingan manual ini memadai untuk pemeriksaan sesaat, sedangkan perhitungan berulang lebih praktis dilakukan oleh skrip sebagaimana dipraktikkan pada bagian berikutnya.
Loop umpan balik request dan limit#
Penyesuaian request dan limit berjalan sebagai loop yang berulang. Langkahnya berbunyi: ukur pemakaian dengan kubectl top, bandingkan dengan request pada manifest, sesuaikan nilai yang menyimpang, lakukan rollout, lalu ukur lagi setelah beberapa hari. Aturan praktis yang lazim berbunyi: pemakaian CPU yang stabil di atas 80% dari request menandakan risiko pembatasan oleh kernel, memori yang mendekati limit berisiko berakhir dengan status OOMKilled, dan pemakaian yang dalam jangka panjang berada di bawah seperempat request menandakan sumber daya yang terbuang.
Berkas berikut meniru keluaran kubectl top untuk satu namespace, lengkap dengan request masing-masing Pod.
{
"namespace": "aplikasi-catatan",
"pod": [
{
"nama": "catatan-api-7d9c4b6d5f-xk2qz",
"cpu_milicore": 470,
"request_cpu_milicore": 250,
"memori_mib": 90,
"request_memori_mib": 256
},
{
"nama": "catatan-api-7d9c4b6d5f-wm8pb",
"cpu_milicore": 180,
"request_cpu_milicore": 250,
"memori_mib": 95,
"request_memori_mib": 256
},
{
"nama": "catatan-web-6b8f4d7c9d-t5rk2",
"cpu_milicore": 20,
"request_cpu_milicore": 100,
"memori_mib": 28,
"request_memori_mib": 128
}
]
}Skrip berikut menghitung persentase pemakaian terhadap request dan menandai Pod yang memerlukan penyesuaian.
import json
# membaca sampel pemakaian yang meniru keluaran kubectl top
data = json.load(open("top.json", encoding="utf-8"))
AMBANG_TINGGI = 80 # persen request
AMBANG_RENDAH = 25 # persen request
for pod in data["pod"]:
cpu_persen = pod["cpu_milicore"] / pod["request_cpu_milicore"] * 100
mem_persen = pod["memori_mib"] / pod["request_memori_mib"] * 100
# menentukan arah penyesuaian dari dua sumber daya
catatan = []
if cpu_persen > AMBANG_TINGGI:
catatan.append("CPU di atas ambang 80%, request CPU dinaikkan")
if mem_persen > AMBANG_TINGGI:
catatan.append("memori di atas ambang 80%, request memori dinaikkan")
if cpu_persen < AMBANG_RENDAH and mem_persen < AMBANG_RENDAH:
catatan.append("jauh di bawah request, nilai bisa diturunkan")
if not catatan:
catatan.append("sesuai request")
print(f"{pod['nama']}: CPU {cpu_persen:.0f}% dari request, memori {mem_persen:.0f}% dari request")
for baris in catatan:
print(f" - {baris}")catatan-api-7d9c4b6d5f-xk2qz: CPU 188% dari request, memori 35% dari request
- CPU di atas ambang 80%, request CPU dinaikkan
catatan-api-7d9c4b6d5f-wm8pb: CPU 72% dari request, memori 37% dari request
- sesuai request
catatan-web-6b8f4d7c9d-t5rk2: CPU 20% dari request, memori 22% dari request
- jauh di bawah request, nilai bisa diturunkanKeluaran di atas mendasari tiga keputusan yang berbeda. Request CPU replika pertama perlu dinaikkan, replika kedua dibiarkan, dan request catatan-web dapat diturunkan agar penjadwalan menjadi lebih efisien. Satu catatan penting menyertai keputusan ini: angka top merupakan potret sesaat, sehingga penyesuaian yang sehat didasarkan pada tren pemakaian, bukan satu sampel tunggal.
Batas metrik dan pemantauan jangka panjang#
Karena metrics-server hanya menyimpan nilai terkini, loop di atas tidak dapat berjalan hanya dengan kubectl top pada kluster produksi. Pemantauan jangka panjang menggunakan sistem terpisah, misalnya Prometheus, yang menarik metrik dari kubelet dan API server secara berkala lalu menyimpan riwayatnya untuk digambar menjadi grafik dan digunakan untuk peringatan otomatis. Arsitektur lengkapnya dijelaskan pada dokumentasi monitoring Kubernetes.
Perbedaan tujuan ini menjelaskan pembagian perannya. metrics-server melayani pertanyaan sesaat dan kebutuhan HorizontalPodAutoscaler yang hanya membaca nilai terkini, sedangkan sistem pemantauan menyimpan deret waktu yang memungkinkan tren mingguan, peringatan berbasis ambang, dan perbandingan antarhari. Tanpa sistem pemantauan, penyesuaian request berisiko mengikuti sampel sesaat, misalnya menaikkan request karena lonjakan pada satu jam sibuk lalu membiarkannya berlebihan selama sisa hari. Di samping sistem pemantauan tersebut, kubectl top tetap berguna karena cepat dan tersedia di setiap kluster yang memiliki metrics-server, sehingga kombinasi yang lazim berbunyi: kubectl top untuk pemeriksaan langsung saat kejadian, sistem pemantauan untuk tren dan peringatan, serta loop umpan balik yang sama untuk menjaga request dan limit tetap sesuai dengan perilaku aplikasi.
Ringkasan#
- metrics-server mengumpulkan penggunaan CPU dan memori dari kubelet dan menyajikannya melalui API metrics.k8s.io untuk kubectl top dan HorizontalPodAutoscaler.
- kubectl top nodes dan kubectl top pods menampilkan pemakaian dalam milicore serta MiB, dan nilainya baru bermakna apabila dibandingkan dengan request.
- Penyesuaian request dan limit berjalan sebagai loop ukur, bandingkan, ubah, dan rollout dengan ambang praktis seperti 80% dari request.
- metrics-server bukan penyimpanan riwayat, sehingga analisis tren memerlukan sistem pemantauan terpisah.
Referensi#
- metrics-server — Kubernetes SIGs — Repositori resmi metrics-server beserta penjelasan arsitektur dan penyebarannya.
- Monitoring architecture — Kubernetes — Dokumen resmi arsitektur pemantauan kluster dan cara metrik dikumpulkan.
- kubectl Cheat Sheet — Kubernetes — Daftar ringkas perintah kubectl yang sering digunakan, termasuk kubectl top.