# Kubernetes (kubectl)

`kubectl` talks to a cluster's API server. Almost every command takes `-n <namespace>` (or `-A` for all namespaces) — forgetting it is the number-one reason "my pod isn't there." Set a default namespace to save the typing.

## Inspect Resources

| Command | Shows |
| --- | --- |
| `kubectl get pods` | pods in the current namespace |
| `kubectl get pods -A` | pods across all namespaces |
| `kubectl get pods -o wide` | add node & IP columns |
| `kubectl get all` | pods, services, deployments, etc. |
| `kubectl describe pod <name>` | events + full detail for one object |
| `kubectl get pod <name> -o yaml` | the live manifest |

## Context & Namespace

| Command | Does |
| --- | --- |
| `kubectl config get-contexts` | list clusters you can talk to |
| `kubectl config current-context` | which cluster am I on? |
| `kubectl config use-context <name>` | switch clusters |
| `kubectl get pods -n kube-system` | target one namespace |
| `kubectl config set-context --current --namespace=dev` | set a default namespace |

> **Know your context before you act.** The same `kubectl delete` runs against whatever context is current — including prod. `kubectx` / `kubens` (or a shell prompt that shows the context) make the active target impossible to miss.

## Apply & Manage

| Command | Does |
| --- | --- |
| `kubectl apply -f app.yaml` | create or update from a manifest |
| `kubectl delete -f app.yaml` | delete what the manifest defines |
| `kubectl edit deploy <name>` | edit a live object in $EDITOR |
| `kubectl scale deploy <name> --replicas=3` | change replica count |
| `kubectl rollout restart deploy <name>` | restart pods (e.g. after a config change) |
| `kubectl rollout status deploy <name>` | watch a rollout finish |
| `kubectl rollout undo deploy <name>` | roll back to the previous version |

## Debugging

| Command | Does |
| --- | --- |
| `kubectl logs <pod>` | print a pod's logs |
| `kubectl logs -f <pod>` | follow logs live |
| `kubectl logs <pod> --previous` | logs from the crashed instance |
| `kubectl exec -it <pod> -- sh` | shell into a running pod |
| `kubectl port-forward <pod> 8080:80` | tunnel a local port to the pod |
| `kubectl get events --sort-by=.lastTimestamp` | recent cluster events |

## Nodes & Cluster

| Command | Shows / does |
| --- | --- |
| `kubectl get nodes` | cluster nodes and their status |
| `kubectl top nodes` | live CPU / memory per node (needs metrics-server) |
| `kubectl top pods` | resource use per pod |
| `kubectl cluster-info` | control-plane endpoints |
| `kubectl cordon <node>` | stop scheduling new pods onto a node |
| `kubectl drain <node>` | evict pods to prep a node for maintenance |
