kubectl: Core Commands & Resource Management
kubectl is the Kubernetes command-line tool. It communicates with the cluster API server to manage workloads, inspect resources, and apply configuration. All kubectl commands follow a pattern: kubectl <verb> <resource> [name] [flags].
Getting Resources
# List resources
kubectl get pods # pods in current namespace
kubectl get pods -n kube-system # pods in specific namespace
kubectl get pods -A # all namespaces
kubectl get pods -o wide # extra info (node, IP)
kubectl get pods -o yaml # full YAML spec
kubectl get pods -o json # JSON output
kubectl get pods -l app=nginx # filter by label
kubectl get pods --field-selector status.phase=Running
# Common resource types (short names work too)
kubectl get pods / po
kubectl get deployments / deploy
kubectl get services / svc
kubectl get configmaps / cm
kubectl get secrets
kubectl get namespaces / ns
kubectl get nodes / no
kubectl get ingress / ing
kubectl get persistentvolumes / pv
kubectl get persistentvolumeclaims / pvc
kubectl get statefulsets / sts
kubectl get daemonsets / ds
kubectl get replicasets / rs
kubectl get jobs
kubectl get cronjobs / cj
kubectl get serviceaccounts / sa
# Describe (detailed info + events)
kubectl describe pod my-pod
kubectl describe deployment my-deploy
kubectl describe node worker-1
# Watch for changes
kubectl get pods -w
kubectl get pods --watchCreating & Applying Resources
# Apply manifest (create or update)
kubectl apply -f deployment.yaml
kubectl apply -f ./manifests/ # apply all files in directory
kubectl apply -f https://example.com/app.yaml
# Create (fails if already exists)
kubectl create deployment nginx --image=nginx:1.25
kubectl create service clusterip my-svc --tcp=80:80
kubectl create configmap my-config --from-literal=key=value
kubectl create configmap my-config --from-file=config.properties
kubectl create secret generic my-secret --from-literal=password=s3cr3t
kubectl create secret docker-registry regcred --docker-server=registry.example.com --docker-username=user --docker-password=pass
# Quick pod for testing
kubectl run tmp --image=busybox --rm -it --restart=Never -- sh
kubectl run nginx --image=nginx --port=80
# Expose a deployment as a service
kubectl expose deployment nginx --port=80 --type=ClusterIP
kubectl expose deployment nginx --port=80 --type=LoadBalancerUpdating & Deleting
# Edit live resource
kubectl edit deployment my-deploy # opens in $EDITOR
kubectl edit cm my-config
# Patch (non-interactive update)
kubectl patch deployment my-deploy -p '{"spec":{"replicas":3}}'
kubectl patch deployment my-deploy --type=merge -p '{"spec":{"template":{"spec":{"terminationGracePeriodSeconds":30}}}}'
# Set image (rolling update)
kubectl set image deployment/my-deploy container=nginx:1.26
# Delete
kubectl delete pod my-pod
kubectl delete -f deployment.yaml
kubectl delete deployment my-deploy
kubectl delete pod my-pod --grace-period=0 --force # force delete
# Delete all pods matching label
kubectl delete pods -l app=nginx
# Scale
kubectl scale deployment my-deploy --replicas=5
# Rollout
kubectl rollout status deployment/my-deploy
kubectl rollout history deployment/my-deploy
kubectl rollout undo deployment/my-deploy # rollback
kubectl rollout undo deployment/my-deploy --to-revision=2Labels & Annotations
# Add/update label
kubectl label pod my-pod env=production
kubectl label pod my-pod env=staging --overwrite
# Remove label (trailing dash)
kubectl label pod my-pod env-
# Add annotation
kubectl annotate deployment my-deploy kubernetes.io/change-cause="update to v2"
# Select by label
kubectl get pods -l app=nginx,env=production
kubectl get pods -l 'env in (production, staging)'
kubectl get pods -l 'env notin (development)'Keep your own version of these notes — editable, searchable, and organised by your stack.
Start free