kubectl Tips #

kubectl adalah interface utama untuk berinteraksi dengan Kubernetes cluster. Mayoritas engineer hanya menggunakan sebagian kecil dari kemampuannya. Artikel ini mengumpulkan tips dan trik yang meningkatkan produktivitas secara signifikan — dari shortcut sederhana sampai teknik debugging yang jarang diketahui.

Shortcut Resource Names #

# Resource shortnames yang perlu dihapal
kubectl get po          # pods
kubectl get deploy      # deployments
kubectl get svc         # services
kubectl get ns          # namespaces
kubectl get cm          # configmaps
kubectl get pvc         # persistentvolumeclaims
kubectl get ing         # ingresses
kubectl get sa          # serviceaccounts
kubectl get ep          # endpoints
kubectl get no          # nodes
kubectl get hpa         # horizontalpodautoscalers
kubectl get crd         # customresourcedefinitions

# Lihat semua shortnames yang tersedia
kubectl api-resources

Output Formatting yang Powerful #

# Format wide: tampilkan kolom tambahan (IP, node, dll)
kubectl get pods -o wide

# YAML/JSON output
kubectl get deployment api -o yaml
kubectl get deployment api -o json

# JSONPath: extract field spesifik
kubectl get pods -o jsonpath='{.items[*].metadata.name}'
kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.capacity.cpu}{"\n"}{end}'

# Custom columns
kubectl get pods \
  -o custom-columns=\
"NAME:.metadata.name,\
STATUS:.status.phase,\
IP:.status.podIP,\
NODE:.spec.nodeName,\
RESTARTS:.status.containerStatuses[0].restartCount"

# Filter dengan jq (piped output)
kubectl get pods -o json | jq '.items[] | {name: .metadata.name, phase: .status.phase}'

# Sort by field
kubectl get pods --sort-by=.metadata.creationTimestamp
kubectl get pods --sort-by='.status.containerStatuses[0].restartCount'

# Tampilkan labels
kubectl get pods --show-labels
kubectl get pods -l app=api                    # filter by label
kubectl get pods -l 'app in (api, worker)'     # filter set
kubectl get pods -l 'env!=staging'             # negasi

Debugging dengan exec dan port-forward #

# Masuk ke shell container
kubectl exec -it <pod-name> -- bash
kubectl exec -it <pod-name> -- sh        # jika tidak ada bash

# Exec di container tertentu (Pod dengan multiple container)
kubectl exec -it <pod-name> -c <container-name> -- bash

# Jalankan perintah tanpa interactive shell
kubectl exec <pod-name> -- env | sort
kubectl exec <pod-name> -- cat /etc/config/app.yaml
kubectl exec <pod-name> -- ls -la /var/log

# Ephemeral debug container (tidak perlu restart Pod)
kubectl debug -it <pod-name> --image=nicolaka/netshoot --target=<container>

# Port-forward ke Pod
kubectl port-forward pod/<pod-name> 8080:8080
kubectl port-forward deployment/api 8080:8080
kubectl port-forward service/api-service 8080:80

# Port-forward dengan binding ke semua interface (akses dari luar localhost)
kubectl port-forward service/api-service 8080:80 --address=0.0.0.0

Watch dan Events #

# Watch perubahan resource secara real-time
kubectl get pods -w
kubectl get pods -w -l app=api

# Lihat events (sangat berguna saat debugging Pod tidak start)
kubectl get events -n production --sort-by=.lastTimestamp

# Events hanya untuk satu resource
kubectl describe pod <pod-name> -n production | tail -20

# Watch events secara real-time
kubectl get events -w -n production

# Events lintas semua namespace
kubectl get events -A --sort-by=.lastTimestamp | tail -30

Rollout dan Scaling #

# Rolling restart (tanpa ubah konfigurasi apapun)
kubectl rollout restart deployment/api -n production

# Scale manual
kubectl scale deployment api --replicas=10 -n production

# Autoscale
kubectl autoscale deployment api --min=2 --max=10 --cpu-percent=70

# Lihat status rollout
kubectl rollout status deployment/api -n production

# Pause dan resume rollout
kubectl rollout pause deployment/api -n production
kubectl rollout resume deployment/api -n production

# Rollback
kubectl rollout undo deployment/api -n production
kubectl rollout undo deployment/api --to-revision=3 -n production

Multi-Cluster dengan kubeconfig #

# Lihat semua context yang tersedia
kubectl config get-contexts

# Switch context
kubectl config use-context production-cluster
kubectl config use-context staging-cluster

# Jalankan command di context tertentu tanpa switch permanen
kubectl get pods --context=staging-cluster -n production

# Set namespace default untuk context saat ini
kubectl config set-context --current --namespace=production

# Merge beberapa kubeconfig
KUBECONFIG=~/.kube/config:~/.kube/config-staging kubectl config view --merge --flatten > ~/.kube/merged-config

# Tool yang lebih user-friendly untuk multi-cluster
# kubectx: switch context dengan mudah
# kubens: switch namespace dengan mudah
brew install kubectx  # atau apt install kubectx
kubectx production
kubens production

Plugin kubectl via Krew #

Krew adalah plugin manager untuk kubectl:

# Install Krew
(
  set -x; cd "$(mktemp -d)" &&
  OS="$(uname | tr '[:upper:]' '[:lower:]')" &&
  ARCH="$(uname -m | sed -e 's/x86_64/amd64/' -e 's/arm64/arm64/')" &&
  curl -fsSLO "https://github.com/kubernetes-sigs/krew/releases/latest/download/krew-${OS}_${ARCH}.tar.gz" &&
  tar zxvf "krew-${OS}_${ARCH}.tar.gz" &&
  KREW=./krew-"${OS}_${ARCH}" &&
  "$KREW" install krew
)

# Plugin yang paling berguna
kubectl krew install ctx          # kubectx — switch cluster context
kubectl krew install ns           # kubens — switch namespace
kubectl krew install neat         # bersihkan output yaml (hapus managed fields)
kubectl krew install tree         # tampilkan resource hierarchy
kubectl krew install whoami       # tampilkan user/serviceaccount saat ini
kubectl krew install ktop         # top untuk pods dengan lebih banyak info
kubectl krew install images       # list semua images yang digunakan
kubectl krew install outdated     # cari pods dengan image yang outdated

Alias yang Berguna #

# Tambahkan ke ~/.bashrc atau ~/.zshrc
alias k='kubectl'
alias kg='kubectl get'
alias kd='kubectl describe'
alias kl='kubectl logs'
alias kx='kubectl exec -it'
alias kns='kubectl config set-context --current --namespace'

# Dengan namespace default
alias kprod='kubectl --namespace production'
alias kdev='kubectl --namespace development'

# Yang lebih advanced: fungsi
klog() {
  kubectl logs -f -l app=$1 --max-log-requests=10 -n ${2:-production}
}
# klog api
# klog worker staging

# Shell completion (sangat membantu untuk autocomplete)
source <(kubectl completion bash)  # bash
source <(kubectl completion zsh)   # zsh

Ringkasan #

  • kubectl api-resources — tampilkan semua resource types dan shortnames; berguna saat lupa singkatan atau ingin tahu resource CRD yang tersedia.
  • -o custom-columns dan JSONPath — format output sesuai kebutuhan spesifik; lebih efisien dari parse manual; gabungkan dengan --sort-by untuk informasi yang terurut.
  • kubectl debug --image=nicolaka/netshoot — inject debug container ke Pod yang bermasalah tanpa restart; toolkit networking lengkap untuk troubleshooting.
  • kubectl get events --sort-by=.lastTimestamp — events adalah sumber informasi pertama saat Pod tidak start; selalu cek ini sebelum masuk ke log yang lebih detail.
  • kubectx dan kubens — switch cluster dan namespace dengan satu kata; wajib untuk engineer yang bekerja di multi-cluster atau multi-namespace.
  • Shell completionsource <(kubectl completion zsh) membuat autocomplete resource name, Pod name, dan flag; menghemat banyak waktu mengetik.

← Sebelumnya: Kustomize   Berikutnya: Local Development Tools →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact