Di episode ini kita akan coba bahas berbagai metode untuk menghapus Pod di Kubernetes. Kita akan mempelajari cara menghapus Pod berdasarkan nama, label selector, namespace, dan teknik advanced lainnya.

Catatan
Untuk kalian yang ingin membaca episode sebelumnya, bisa click thumbnail episode 8 di bawah ini
Di episode sebelumnya kita sudah mengetahui lebih dalam terkait object Namespace dalam konteks Kubernetes. Selanjutnya di episode 9 kali ini, kita akan coba bahas task operasional yang penting yaitu Menghapus Pod di Kubernetes.
Catatan: Disini saya akan menggunakan Kubernetes Cluster yang di install melalui K3s.
Sementara kita sudah belajar cara membuat dan mengelola Pod di episode 5, mengetahui cara menghapus Pod dengan benar sama pentingnya. Di environment production, kalian akan sering perlu menghapus Pod untuk berbagai alasan: membersihkan resource, troubleshooting issue, melakukan maintenance, atau mengelola deployment. Memahami berbagai metode deletion dan implikasinya sangat penting untuk cluster management yang efektif.
Sebelum masuk ke cara, mari kita pahami kenapa kalian mungkin perlu menghapus Pod:
Saat kalian menghapus Pod di Kubernetes, beberapa hal terjadi:
Selama deletion, Pod melewati state ini:
Kalian bisa melihat state Terminating saat menjalankan kubectl get pods selama deletion:
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Terminating 0 5mMari kita explore berbagai metode untuk menghapus Pod:
Cara paling straightforward untuk menghapus Pod adalah dengan specify nama nya:
sudo kubectl delete pod <nama-pod>Sebagai contoh:
sudo kubectl delete pod nginx-podOutput:
pod "nginx-pod" deletedUntuk menghapus Pod di Namespace tertentu, gunakan flag -n atau --namespace:
sudo kubectl delete pod <nama-pod> -n <namespace>Sebagai contoh:
sudo kubectl delete pod nginx-pod -n developmentKalian bisa menghapus multiple Pod sekaligus dengan list nama mereka:
sudo kubectl delete pod <nama-pod-1> <nama-pod-2> <nama-pod-3>Sebagai contoh:
sudo kubectl delete pod nginx-pod-1 nginx-pod-2 nginx-pod-3Jika kalian membuat Pod menggunakan file YAML, kalian bisa menghapusnya menggunakan file yang sama:
sudo kubectl delete -f pod.ymlIni berguna karena:
Salah satu fitur paling powerful adalah menghapus Pod berdasarkan label mereka. Ini sangat berguna saat kalian punya banyak Pod dengan karakteristik serupa.
Untuk menghapus semua Pod dengan label tertentu:
sudo kubectl delete pod -l <key>=<value>Sebagai contoh, hapus semua Pod dengan app=nginx:
sudo kubectl delete pod -l app=nginxKalian bisa gunakan multiple label selector dengan comma separation (AND logic):
sudo kubectl delete pod -l app=nginx,environment=developmentIni menghapus semua Pod yang punya label app=nginx DAN environment=development.
Kalian bisa gunakan selector yang lebih advanced:
# Hapus Pod dimana environment adalah development atau staging
sudo kubectl delete pod -l "environment in (development,staging)"
# Hapus Pod dimana environment BUKAN production
sudo kubectl delete pod -l "environment notin (production)"
# Hapus Pod yang punya label tier
sudo kubectl delete pod -l tier
# Hapus Pod yang tidak punya label tier
sudo kubectl delete pod -l "!tier"Mari kita buat multiple Pod dan hapus mereka menggunakan label:
Step 1: Buat Pod dengan label
apiVersion: v1
kind: Pod
metadata:
name: nginx-dev-1
labels:
app: nginx
environment: development
tier: frontend
spec:
containers:
- name: nginx
image: nginx
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-dev-2
labels:
app: nginx
environment: development
tier: backend
spec:
containers:
- name: nginx
image: nginx
---
apiVersion: v1
kind: Pod
metadata:
name: nginx-prod-1
labels:
app: nginx
environment: production
tier: frontend
spec:
containers:
- name: nginx
image: nginxApply konfigurasi:
sudo kubectl apply -f labeled-pods.ymlStep 2: Verifikasi Pod berjalan
sudo kubectl get pods -L app,environment,tierOutput:
NAME READY STATUS RESTARTS AGE APP ENVIRONMENT TIER
nginx-dev-1 1/1 Running 0 30s nginx development frontend
nginx-dev-2 1/1 Running 0 30s nginx development backend
nginx-prod-1 1/1 Running 0 30s nginx production frontendStep 3: Hapus hanya development Pod
sudo kubectl delete pod -l environment=developmentOutput:
pod "nginx-dev-1" deleted
pod "nginx-dev-2" deletedStep 4: Verifikasi hanya production Pod yang tersisa
sudo kubectl get podsOutput:
NAME READY STATUS RESTARTS AGE
nginx-prod-1 1/1 Running 0 2mUntuk menghapus semua Pod di Namespace tertentu:
sudo kubectl delete pods --all -n <namespace>Sebagai contoh:
sudo kubectl delete pods --all -n developmentWarning
Hati-hati dengan command ini! Ini akan menghapus SEMUA Pod di Namespace yang di-specify. Selalu double-check Namespace sebelum menjalankan command ini.
Untuk menghapus semua Pod di default Namespace:
sudo kubectl delete pods --allKadang Pod stuck di state Terminating dan tidak akan terhapus secara normal. Dalam kasus ini, kalian bisa force delete mereka.
Untuk force delete Pod secara immediate:
sudo kubectl delete pod <nama-pod> --grace-period=0 --forceSebagai contoh:
sudo kubectl delete pod nginx-pod --grace-period=0 --forceWarning
Force delete Pod harus digunakan sebagai last resort. Ini tidak memberi container waktu untuk shutdown secara graceful, yang bisa menyebabkan data loss atau corruption. Hanya gunakan ini saat Pod stuck dan tidak akan terhapus secara normal.
Grace period adalah waktu yang Kubernetes berikan ke container untuk shutdown secara graceful:
Contoh dengan custom grace period:
# Berikan 60 detik untuk graceful shutdown
sudo kubectl delete pod nginx-pod --grace-period=60Kalian bisa kombinasikan command kubectl dengan tool lain untuk menghapus Pod berdasarkan status mereka.
Untuk menghapus semua Pod dengan status Failed:
sudo kubectl delete pod --field-selector=status.phase=FailedUntuk menghapus semua Pod dengan status Succeeded (completed job):
sudo kubectl delete pod --field-selector=status.phase=SucceededKalian bisa gunakan field selector untuk target Pod di phase tertentu:
# Hapus Pod di state Pending
sudo kubectl delete pod --field-selector=status.phase=Pending
# Hapus Pod di state Unknown
sudo kubectl delete pod --field-selector=status.phase=UnknownMari kita buat skenario dengan failed Pod dan bersihkan mereka:
Step 1: Buat Pod yang akan fail
apiVersion: v1
kind: Pod
metadata:
name: failing-pod
spec:
containers:
- name: failing-container
image: busybox
command: ["sh", "-c", "exit 1"]
restartPolicy: NeverApply konfigurasi:
sudo kubectl apply -f failing-pod.ymlStep 2: Tunggu Pod fail
sudo kubectl get podsOutput:
NAME READY STATUS RESTARTS AGE
failing-pod 0/1 Error 0 10sStep 3: Hapus semua failed Pod
sudo kubectl delete pod --field-selector=status.phase=FailedKalian bisa kombinasikan berbagai metode untuk deletion yang lebih presisi:
sudo kubectl delete pod -l app=nginx -n developmentsudo kubectl delete pod -l app=nginx --grace-period=60Kalian bisa menghapus multiple resource type sekaligus:
# Hapus Pod dan Service dengan label tertentu
sudo kubectl delete pod,service -l app=nginxSaat Pod dikelola oleh controller (Deployment, ReplicaSet, StatefulSet, DaemonSet), menghapus Pod secara langsung akan menyebabkan controller membuat ulang Pod tersebut.
Jika kalian menghapus Pod yang dikelola Deployment:
sudo kubectl delete pod nginx-deployment-abc123Deployment akan segera membuat Pod baru untuk maintain desired replica count.
Untuk menghapus Pod yang dikelola controller secara permanen, kalian perlu menghapus controller itu sendiri:
Hapus Deployment (dan Pod nya)
sudo kubectl delete deployment nginx-deploymentHapus ReplicaSet (dan Pod nya)
sudo kubectl delete replicaset nginx-replicasetHapus StatefulSet (dan Pod nya)
sudo kubectl delete statefulset nginx-statefulsetHapus DaemonSet (dan Pod nya)
sudo kubectl delete daemonset nginx-daemonsetKadang kalian ingin temporarily stop Pod tanpa menghapus controller:
# Scale Deployment ke 0 replica
sudo kubectl scale deployment nginx-deployment --replicas=0Ini menghentikan semua Pod tapi tetap menjaga konfigurasi Deployment. Kalian bisa scale back up nanti:
# Scale kembali ke 3 replica
sudo kubectl scale deployment nginx-deployment --replicas=3Mari kita explore beberapa skenario real-world untuk menghapus Pod:
Kalian sudah testing di Namespace testing dan ingin clean up:
# Hapus semua Pod di Namespace testing
sudo kubectl delete pods --all -n testing
# Atau hapus seluruh Namespace (termasuk semua resource)
sudo kubectl delete namespace testingKalian sudah deploy versi baru dan ingin menghapus Pod versi lama:
# Hapus Pod dengan label versi lama
sudo kubectl delete pod -l version=v1.0
# Jaga Pod dengan versi baru
# (Pod dengan version=v2.0 tetap tidak tersentuh)Setelah menjalankan batch job, bersihkan completed dan failed Pod:
# Hapus semua succeeded Pod
sudo kubectl delete pod --field-selector=status.phase=Succeeded
# Hapus semua failed Pod
sudo kubectl delete pod --field-selector=status.phase=FailedPod mengkonsumsi terlalu banyak resource dan perlu immediate removal:
# Force delete immediately
sudo kubectl delete pod resource-hog-pod --grace-period=0 --forceTeam berbeda menggunakan cluster yang sama dengan organisasi berbasis label:
# Backend team membersihkan development Pod mereka
sudo kubectl delete pod -l team=backend,environment=development
# Frontend team membersihkan staging Pod mereka
sudo kubectl delete pod -l team=frontend,environment=stagingSetelah menghapus Pod, penting untuk verifikasi deletion berhasil:
sudo kubectl get podssudo kubectl get pods -Asudo kubectl get pods -n developmentKalian bisa watch Pod yang dihapus secara real-time:
sudo kubectl get pods -wIni akan continuously update output saat Pod berubah state. Tekan Ctrl+C untuk stop watching.
Menghapus Pod di Namespace yang salah bisa menyebabkan production issue.
Problem: Kalian bermaksud menghapus test Pod tapi menghapus production Pod.
Solusi: Selalu verifikasi Namespace sebelum deletion:
# Cek current Namespace
sudo kubectl config view --minify | grep namespace:
# Selalu specify Namespace secara eksplisit
sudo kubectl delete pod nginx-pod -n developmentForce delete Pod bisa menyebabkan data loss atau corruption.
Problem: Force delete database Pod menyebabkan data corruption.
Solusi: Hanya gunakan force delete sebagai last resort. Coba normal deletion dulu dan investigasi kenapa Pod tidak terminate.
Menghapus Pod yang dikelola controller tidak mencapai hasil yang diinginkan.
Problem: Kalian menghapus Pod, tapi Pod langsung kembali.
Solusi: Hapus controller (Deployment, ReplicaSet, dll) atau scale ke zero.
Menghapus Pod satu per satu secara manual tidak efisien.
Problem: Kalian punya 50 test Pod untuk dihapus dan menghapus mereka satu per satu.
Solusi: Gunakan label selector untuk menghapus multiple Pod sekaligus:
sudo kubectl delete pod -l environment=testMenghapus semua Pod tanpa punya cara untuk membuat ulang mereka.
Problem: Kalian menghapus semua Pod dan menyadari tidak punya konfigurasi YAML.
Solusi: Selalu simpan konfigurasi YAML di version control (Git) sebelum menghapus resource.
Selalu label Pod kalian dengan tepat sehingga kalian bisa menghapus mereka secara selektif:
metadata:
labels:
app: myapp
environment: development
version: v1.0
team: backendSelalu verifikasi apa yang akan kalian hapus:
# List Pod yang akan dihapus
sudo kubectl get pod -l app=nginx
# Kemudian hapus mereka
sudo kubectl delete pod -l app=nginxGunakan flag --dry-run untuk melihat apa yang akan dihapus tanpa benar-benar menghapus:
sudo kubectl delete pod -l app=nginx --dry-run=clientSaat menghapus Pod di production, dokumentasikan alasannya:
# Tambahkan comment di terminal history atau runbook kalian
# Alasan: Membersihkan versi lama setelah successful v2.0 deployment
sudo kubectl delete pod -l version=v1.0Jaga environment berbeda di Namespace terpisah untuk mencegah accidental deletion:
# Development Pod
sudo kubectl delete pod -l app=nginx -n development
# Production Pod aman di Namespace berbedaUntuk regular cleanup task, gunakan Kubernetes CronJob:
apiVersion: batch/v1
kind: CronJob
metadata:
name: cleanup-failed-pods
spec:
schedule: "0 2 * * *" # Jalankan jam 2 pagi setiap hari
jobTemplate:
spec:
template:
spec:
serviceAccountName: pod-cleaner
containers:
- name: kubectl
image: bitnami/kubectl:latest
command:
- /bin/sh
- -c
- kubectl delete pod --field-selector=status.phase=Failed
restartPolicy: OnFailureSelalu simpan konfigurasi Pod kalian di version control:
# Kalian selalu bisa membuat ulang Pod dari YAML
sudo kubectl apply -f pod.yml
# Aman untuk menghapus karena kalian punya konfigurasi
sudo kubectl delete -f pod.ymlMenggunakan kubectl dengan jq untuk menghapus Pod lama:
# Hapus Pod lebih tua dari 7 hari (memerlukan jq)
sudo kubectl get pods -o json | jq -r '.items[] | select(.metadata.creationTimestamp | fromdateiso8601 < (now - 604800)) | .metadata.name' | xargs sudo kubectl delete podKalian bisa script deletion berdasarkan resource usage:
# Dapatkan Pod dengan high memory usage dan hapus mereka
# (Ini contoh - adjust threshold sesuai kebutuhan)
sudo kubectl top pods | awk '$3 > 1000 {print $1}' | xargs sudo kubectl delete podBuat script untuk safer batch deletion:
#!/bin/bash
PODS=$(sudo kubectl get pod -l app=nginx -o name)
echo "Pod berikut akan dihapus:"
echo "$PODS"
read -p "Apakah kalian yakin? (yes/no): " CONFIRM
if [ "$CONFIRM" = "yes" ]; then
echo "$PODS" | xargs sudo kubectl delete
else
echo "Deletion dibatalkan"
fiPada episode 9 ini, kita telah membahas berbagai metode untuk menghapus Pod di Kubernetes. Kita sudah belajar cara menghapus Pod berdasarkan nama, label selector, Namespace, status, dan menggunakan teknik advanced.
Key takeaway:
kubectl delete pod dengan berbagai option untuk skenario deletion berbedaMemahami cara menghapus Pod dengan benar sangat essential untuk cluster maintenance, troubleshooting, dan resource management. Dengan menguasai teknik ini, kalian bisa efficiently mengelola Kubernetes workload kalian dan maintain cluster yang clean dan well-organized.
Bagaimana, makin jelas kan tentang Pod deletion di Kubernetes? Di episode 10 berikutnya, kita akan membahas konsep Kubernetes penting lainnya: Probe. Probe digunakan untuk memeriksa kesehatan Pod dan me-restart Pod jika tidak sehat.
Catatan
Untuk kalian yang ingin melanjutkan membaca, bisa click thumbnail episode 10 di bawah ini