kubectl
01 / 03

Core Commands & Resource Management

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 --watch

Creating & 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=LoadBalancer

Updating & 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=2

Labels & 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