Belajar Kubernetes - Episode 9 - Menghapus Pod di Kubernetes

Belajar Kubernetes - Episode 9 - Menghapus Pod di Kubernetes

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.

Arman Dwi Pangestu
Arman Dwi PangestuMarch 12, 2026
0 views
10 min read

Pendahuluan

Catatan

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

Episode 8Episode 8

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.

Kenapa Kita Perlu Menghapus Pod?

Sebelum masuk ke cara, mari kita pahami kenapa kalian mungkin perlu menghapus Pod:

  • Resource cleanup - Menghapus Pod yang tidak lagi diperlukan untuk membebaskan resource cluster
  • Troubleshooting - Menghapus dan membuat ulang Pod untuk menyelesaikan issue
  • Configuration update - Menghapus Pod lama setelah update konfigurasi
  • Testing - Membersihkan test Pod setelah eksperimen
  • Maintenance - Menghapus Pod sebelum node maintenance atau upgrade
  • Failed Pod - Membersihkan Pod yang ada di error state
  • Scaling down - Mengurangi jumlah Pod yang berjalan

Memahami Pod Deletion

Saat kalian menghapus Pod di Kubernetes, beberapa hal terjadi:

  1. Termination signal - Kubernetes mengirim TERM signal ke container di Pod
  2. Grace period - Container punya grace period (default 30 detik) untuk shutdown secara graceful
  3. Force kill - Setelah grace period, jika container masih berjalan, mereka di-kill secara paksa
  4. Resource cleanup - Resource terkait dibersihkan
  5. Pod removal - Pod dihapus dari cluster

Pod Deletion State

Selama deletion, Pod melewati state ini:

  • RunningTerminatingDeleted

Kalian bisa melihat state Terminating saat menjalankan kubectl get pods selama deletion:

Kubernetesbash
NAME        READY   STATUS        RESTARTS   AGE
nginx-pod   1/1     Terminating   0          5m

Metode Dasar Menghapus Pod

Mari kita explore berbagai metode untuk menghapus Pod:

Cara 1: Menghapus Pod Berdasarkan Nama

Cara paling straightforward untuk menghapus Pod adalah dengan specify nama nya:

Kubernetesbash
sudo kubectl delete pod <nama-pod>

Sebagai contoh:

Kubernetesbash
sudo kubectl delete pod nginx-pod

Output:

Kubernetesbash
pod "nginx-pod" deleted

Cara 2: Menghapus Pod di Namespace Tertentu

Untuk menghapus Pod di Namespace tertentu, gunakan flag -n atau --namespace:

Kubernetesbash
sudo kubectl delete pod <nama-pod> -n <namespace>

Sebagai contoh:

Kubernetesbash
sudo kubectl delete pod nginx-pod -n development

Cara 3: Menghapus Multiple Pod Berdasarkan Nama

Kalian bisa menghapus multiple Pod sekaligus dengan list nama mereka:

Kubernetesbash
sudo kubectl delete pod <nama-pod-1> <nama-pod-2> <nama-pod-3>

Sebagai contoh:

Kubernetesbash
sudo kubectl delete pod nginx-pod-1 nginx-pod-2 nginx-pod-3

Cara 4: Menghapus Pod Menggunakan File YAML

Jika kalian membuat Pod menggunakan file YAML, kalian bisa menghapusnya menggunakan file yang sama:

Kubernetesbash
sudo kubectl delete -f pod.yml

Ini berguna karena:

  • Kalian tidak perlu mengingat nama Pod
  • Menghapus semua resource yang didefinisikan di file
  • Konsisten dengan cara kalian membuat resource

Menghapus Pod Berdasarkan Label Selector

Salah satu fitur paling powerful adalah menghapus Pod berdasarkan label mereka. Ini sangat berguna saat kalian punya banyak Pod dengan karakteristik serupa.

Menghapus Pod dengan Label Tertentu

Untuk menghapus semua Pod dengan label tertentu:

Kubernetesbash
sudo kubectl delete pod -l <key>=<value>

Sebagai contoh, hapus semua Pod dengan app=nginx:

Kubernetesbash
sudo kubectl delete pod -l app=nginx

Menghapus Pod dengan Multiple Label

Kalian bisa gunakan multiple label selector dengan comma separation (AND logic):

Kubernetesbash
sudo kubectl delete pod -l app=nginx,environment=development

Ini menghapus semua Pod yang punya label app=nginx DAN environment=development.

Menghapus Pod Menggunakan Set-Based Selector

Kalian bisa gunakan selector yang lebih advanced:

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

Contoh Praktis: Label-Based Deletion

Mari kita buat multiple Pod dan hapus mereka menggunakan label:

Step 1: Buat Pod dengan label

Kuberneteslabeled-pods.yml
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: nginx

Apply konfigurasi:

Kubernetesbash
sudo kubectl apply -f labeled-pods.yml

Step 2: Verifikasi Pod berjalan

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

Output:

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

Step 3: Hapus hanya development Pod

Kubernetesbash
sudo kubectl delete pod -l environment=development

Output:

Kubernetesbash
pod "nginx-dev-1" deleted
pod "nginx-dev-2" deleted

Step 4: Verifikasi hanya production Pod yang tersisa

Kubernetesbash
sudo kubectl get pods

Output:

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

Menghapus Semua Pod di Namespace

Untuk menghapus semua Pod di Namespace tertentu:

Kubernetesbash
sudo kubectl delete pods --all -n <namespace>

Sebagai contoh:

Kubernetesbash
sudo kubectl delete pods --all -n development

Warning

Hati-hati dengan command ini! Ini akan menghapus SEMUA Pod di Namespace yang di-specify. Selalu double-check Namespace sebelum menjalankan command ini.

Menghapus Semua Pod di Default Namespace

Untuk menghapus semua Pod di default Namespace:

Kubernetesbash
sudo kubectl delete pods --all

Force Delete Pod

Kadang Pod stuck di state Terminating dan tidak akan terhapus secara normal. Dalam kasus ini, kalian bisa force delete mereka.

Force Delete dengan Grace Period 0

Untuk force delete Pod secara immediate:

Kubernetesbash
sudo kubectl delete pod <nama-pod> --grace-period=0 --force

Sebagai contoh:

Kubernetesbash
sudo kubectl delete pod nginx-pod --grace-period=0 --force

Warning

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.

Memahami Grace Period

Grace period adalah waktu yang Kubernetes berikan ke container untuk shutdown secara graceful:

  • Default grace period: 30 detik
  • Custom grace period: Kalian bisa specify nilai berbeda
  • Grace period 0: Immediate termination (force delete)

Contoh dengan custom grace period:

Kubernetesbash
# Berikan 60 detik untuk graceful shutdown
sudo kubectl delete pod nginx-pod --grace-period=60

Menghapus Pod dengan Status Tertentu

Kalian bisa kombinasikan command kubectl dengan tool lain untuk menghapus Pod berdasarkan status mereka.

Menghapus Semua Failed Pod

Untuk menghapus semua Pod dengan status Failed:

Kubernetesbash
sudo kubectl delete pod --field-selector=status.phase=Failed

Menghapus Semua Succeeded Pod

Untuk menghapus semua Pod dengan status Succeeded (completed job):

Kubernetesbash
sudo kubectl delete pod --field-selector=status.phase=Succeeded

Menghapus Pod di Phase Tertentu

Kalian bisa gunakan field selector untuk target Pod di phase tertentu:

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

Contoh Praktis: Cleanup Failed Pod

Mari kita buat skenario dengan failed Pod dan bersihkan mereka:

Step 1: Buat Pod yang akan fail

Kubernetesfailing-pod.yml
apiVersion: v1
kind: Pod
metadata:
    name: failing-pod
spec:
    containers:
        - name: failing-container
          image: busybox
          command: ["sh", "-c", "exit 1"]
    restartPolicy: Never

Apply konfigurasi:

Kubernetesbash
sudo kubectl apply -f failing-pod.yml

Step 2: Tunggu Pod fail

Kubernetesbash
sudo kubectl get pods

Output:

Kubernetesbash
NAME          READY   STATUS   RESTARTS   AGE
failing-pod   0/1     Error    0          10s

Step 3: Hapus semua failed Pod

Kubernetesbash
sudo kubectl delete pod --field-selector=status.phase=Failed

Menggabungkan Metode Deletion

Kalian bisa kombinasikan berbagai metode untuk deletion yang lebih presisi:

Menghapus Pod Berdasarkan Label di Namespace Tertentu

Kubernetesbash
sudo kubectl delete pod -l app=nginx -n development

Menghapus Pod Berdasarkan Label dengan Grace Period

Kubernetesbash
sudo kubectl delete pod -l app=nginx --grace-period=60

Menghapus Multiple Resource Sekaligus

Kalian bisa menghapus multiple resource type sekaligus:

Kubernetesbash
# Hapus Pod dan Service dengan label tertentu
sudo kubectl delete pod,service -l app=nginx

Menghapus Pod yang Dikelola Controller

Saat Pod dikelola oleh controller (Deployment, ReplicaSet, StatefulSet, DaemonSet), menghapus Pod secara langsung akan menyebabkan controller membuat ulang Pod tersebut.

Memahami Controller Behavior

Jika kalian menghapus Pod yang dikelola Deployment:

Kubernetesbash
sudo kubectl delete pod nginx-deployment-abc123

Deployment akan segera membuat Pod baru untuk maintain desired replica count.

Cara yang Benar Menghapus Controller-Managed Pod

Untuk menghapus Pod yang dikelola controller secara permanen, kalian perlu menghapus controller itu sendiri:

Hapus Deployment (dan Pod nya)

Kubernetesbash
sudo kubectl delete deployment nginx-deployment

Hapus ReplicaSet (dan Pod nya)

Kubernetesbash
sudo kubectl delete replicaset nginx-replicaset

Hapus StatefulSet (dan Pod nya)

Kubernetesbash
sudo kubectl delete statefulset nginx-statefulset

Hapus DaemonSet (dan Pod nya)

Kubernetesbash
sudo kubectl delete daemonset nginx-daemonset

Scaling ke Zero Daripada Menghapus

Kadang kalian ingin temporarily stop Pod tanpa menghapus controller:

Kubernetesbash
# Scale Deployment ke 0 replica
sudo kubectl scale deployment nginx-deployment --replicas=0

Ini menghentikan semua Pod tapi tetap menjaga konfigurasi Deployment. Kalian bisa scale back up nanti:

Kubernetesbash
# Scale kembali ke 3 replica
sudo kubectl scale deployment nginx-deployment --replicas=3

Skenario Praktis

Mari kita explore beberapa skenario real-world untuk menghapus Pod:

Skenario 1: Clean Up Test Environment

Kalian sudah testing di Namespace testing dan ingin clean up:

Kubernetesbash
# Hapus semua Pod di Namespace testing
sudo kubectl delete pods --all -n testing
 
# Atau hapus seluruh Namespace (termasuk semua resource)
sudo kubectl delete namespace testing

Skenario 2: Menghapus Pod Versi Lama

Kalian sudah deploy versi baru dan ingin menghapus Pod versi lama:

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

Skenario 3: Clean Up Failed Job

Setelah menjalankan batch job, bersihkan completed dan failed Pod:

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

Skenario 4: Emergency Cleanup

Pod mengkonsumsi terlalu banyak resource dan perlu immediate removal:

Kubernetesbash
# Force delete immediately
sudo kubectl delete pod resource-hog-pod --grace-period=0 --force

Skenario 5: Selective Cleanup by Team

Team berbeda menggunakan cluster yang sama dengan organisasi berbasis label:

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

Verifikasi Setelah Deletion

Setelah menghapus Pod, penting untuk verifikasi deletion berhasil:

Cek Status Pod

Kubernetesbash
sudo kubectl get pods

Cek Pod di Semua Namespace

Kubernetesbash
sudo kubectl get pods -A

Cek Namespace Tertentu

Kubernetesbash
sudo kubectl get pods -n development

Watch Pod Deletion Real-Time

Kalian bisa watch Pod yang dihapus secara real-time:

Kubernetesbash
sudo kubectl get pods -w

Ini akan continuously update output saat Pod berubah state. Tekan Ctrl+C untuk stop watching.

Kesalahan Umum dan Pitfall

Kesalahan 1: Menghapus Pod Tanpa Cek Namespace

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:

Kubernetesbash
# Cek current Namespace
sudo kubectl config view --minify | grep namespace:
 
# Selalu specify Namespace secara eksplisit
sudo kubectl delete pod nginx-pod -n development

Kesalahan 2: Force Delete Tanpa Memahami Impact

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

Kesalahan 3: Menghapus Controller-Managed Pod Secara Langsung

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.

Kesalahan 4: Tidak Menggunakan Label Selector Secara Efisien

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:

Kubernetesbash
sudo kubectl delete pod -l environment=test

Kesalahan 5: Menghapus Semua Pod Tanpa Backup

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

Best Practice untuk Menghapus Pod

Gunakan Label untuk Organized Deletion

Selalu label Pod kalian dengan tepat sehingga kalian bisa menghapus mereka secara selektif:

Kubernetesyml
metadata:
    labels:
        app: myapp
        environment: development
        version: v1.0
        team: backend

Verifikasi Sebelum Menghapus

Selalu verifikasi apa yang akan kalian hapus:

Kubernetesbash
# List Pod yang akan dihapus
sudo kubectl get pod -l app=nginx
 
# Kemudian hapus mereka
sudo kubectl delete pod -l app=nginx

Gunakan Dry Run

Gunakan flag --dry-run untuk melihat apa yang akan dihapus tanpa benar-benar menghapus:

Kubernetesbash
sudo kubectl delete pod -l app=nginx --dry-run=client

Dokumentasikan Alasan Deletion

Saat menghapus Pod di production, dokumentasikan alasannya:

Kubernetesbash
# Tambahkan comment di terminal history atau runbook kalian
# Alasan: Membersihkan versi lama setelah successful v2.0 deployment
sudo kubectl delete pod -l version=v1.0

Gunakan Namespace Isolation

Jaga environment berbeda di Namespace terpisah untuk mencegah accidental deletion:

Kubernetesbash
# Development Pod
sudo kubectl delete pod -l app=nginx -n development
 
# Production Pod aman di Namespace berbeda

Otomatisasi Cleanup dengan CronJob

Untuk regular cleanup task, gunakan Kubernetes CronJob:

Kubernetescleanup-cronjob.yml
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: OnFailure

Simpan Konfigurasi YAML

Selalu simpan konfigurasi Pod kalian di version control:

Kubernetesbash
# 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.yml

Teknik Deletion Advanced

Menghapus Pod Lebih Tua dari Waktu Tertentu

Menggunakan kubectl dengan jq untuk menghapus Pod lama:

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

Menghapus Pod dengan Resource Usage Tertentu

Kalian bisa script deletion berdasarkan resource usage:

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

Batch Deletion dengan Confirmation

Buat script untuk safer batch deletion:

Kubernetessafe-delete.sh
#!/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"
fi

Penutup

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

  • Gunakan kubectl delete pod dengan berbagai option untuk skenario deletion berbeda
  • Label selector menyediakan filtering powerful untuk bulk deletion
  • Field selector memungkinkan deletion berdasarkan Pod status
  • Force deletion harus digunakan sebagai last resort
  • Controller-managed Pod memerlukan deletion controller, bukan Pod secara langsung
  • Selalu verifikasi sebelum menghapus dan gunakan dry-run saat memungkinkan
  • Simpan konfigurasi YAML di version control untuk easy recreation

Memahami 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

Episode 11Episode 11

Related Posts