Session setup

alias k=kubectl
export do='--dry-run=client -o yaml'
export now='--grace-period=0 --force'
source <(kubectl completion bash)
complete -F __start_kubectl k

Generate YAML fast

k run mypod --image=nginx $do > pod.yaml
k create deploy myapp --image=nginx --replicas=3 $do > deploy.yaml
k create job myjob --image=busybox $do -- echo hi > job.yaml
k create cronjob mycj --schedule="*/1 * * * *" --image=busybox $do -- echo hi > cj.yaml
k create cm myconfig --from-literal=key=val $do
k create secret generic mysecret --from-literal=pwd=s3cre! $do
k expose deploy myapp --port=80 --target-port=8080 $do

In-exam API reference

k explain pod.spec.containers.resources
k explain pod.spec.securityContext
k explain networkpolicy.spec
k explain pvc.spec
k explain cronjob.spec.jobTemplate.spec.template.spec

Core resource shortcuts

ResourceShort
podspo
replicasetsrs
deploymentsdeploy
servicessvc
namespacesns
networkpoliciesnetpol
persistentvolumespv
persistentvolumeclaimspvc
serviceaccountssa
configmapscm
horizontalpodautoscalershpa
ingressesing
nodesno

Most-used one-liners

# Set namespace for session
k config set-context --current --namespace=<ns>

# Delete fast (exam only)
k delete pod mypod $now

# Debug: run throwaway pod
k run bb --image=busybox:1.36.1 --rm -it --restart=Never -- sh

# Debug: test DNS/connectivity from inside cluster
k run bb --image=busybox:1.36.1 --rm -it --restart=Never -- wget -qO- http://myservice.mynamespace

# Ephemeral debug container (distroless)
k debug pod/mypod -it --image=busybox:1.36.1 --target=app

# Copy files to/from pod
k cp mypod:/etc/config/app.conf ./app.conf
k cp ./app.conf mypod:/tmp/app.conf

# Check events sorted by time
k get events --sort-by=.metadata.creationTimestamp -n <ns>

# Watch rollout
k rollout status deployment myapp --watch

# Verify RBAC
k auth can-i list pods --as=system:serviceaccount:default:my-sa -n default

Official reference

https://kubernetes.io/docs/reference/kubectl/quick-reference/