March 29, 2024 (updated at: October 31, 2024)
Quick, dirty and effective commands for hacking your way into Kubernetes
Sometimes, we want to avoid going through the trouble of creating YAML files for resources, checking its syntax, and versioning everything. Sometimes, we only want something up and running for a POC, a quick test, or a debugging session. For those moments, these commands can help.
Spin up debug pods:
# Debug application for testing k8s features
## See docs here: https://github.com/stefanprodan/podinfo
kubectl create deployment podinfo --image=stefanprodan/podinfo
Create Services for applications:
# Basic Service (ClusterIP)
## Service will expose 'port' / target application listens on 'target-port'
kubectl expose deployment podinfo --port=80 --target-port=9898 --name=podinfo-service
# Port forward a cluster application to your local machine (access http://localhost:8080)
kubectl -n default port-forward service/podinfo-service 8080:80
# Expose the raw Kubernetes API Server on your local machine
kubectl proxy
Create and expose a Postgres database:
kubectl create deployment postgres --replicas=0 --image=postgres:16.0
kubectl set env deployment/postgres POSTGRES_PASSWORD=pass POSTGRES_USER=user
kubectl scale --replicas=1 deployment/postgres
kubectl expose deployment/postgres --port=5432 --target-port=5432
Run commands in containers:
# Latest Ubuntu container that spins up and gives you a shell
# Container is deleted when you close the connection
kubectl run ubuntu --rm -it --image=ubuntu -- bash
# Similar to the previous one, but keeps the debug container active
kubectl create deployment ubuntu --image=ubuntu -- sleep infinity
kubectl exec -it deploy/ubuntu -- bash
kubectl delete deploy/ubuntu
Get a bird’s eye view of your cluster state:
# See all running pods on your cluster (regardless of namespace)
kubectl get pods -A
# Increase verbosity level of kubectl's output (works with all its operations)
kubectl -v=8 get pods -A
# Combine the previous command with "watch" to get an evergreen view
watch kubectl get pods -A
# List all container images running
kubectl get pods -A -o=custom-columns='DATA:spec.containers[*].image'
# Read CPU and RAM consumption of your nodes (requires metrics-server)
kubectl top nodes
# Read CPU and RAM consumption of all your pods (requires metrics-server)
kubectl top pods -A
# Get cluster cluster state including logs from control plane applications
kubectl cluster-info dump
Copy folders to and from running pods (requires tar
on both local and remote environments):
tar cf - /local-source | kubectl exec -i my-pod -- tar xf - -C /remote-destination
kubectl exec my-pod -- tar cf - /remote-source | tar xf - -C /local-destination
Force all Pods of a Deployment to be recreated:
kubectl rollout restart deployment <deployment_name>
Remove finalizers from an existing object (make sure you really know what you’re doing, though):
kubectl patch <object_name> -p '{"metadata":{"finalizers":[]}}' --type=merge
Grab logs from a pod managed by a specific deployment:
kubectl logs deploy/my-app > my-app-`date '+%Y_%m_%d__%H_%M_%S'`.log
List permission-related information for your current user:
kubectl auth whoami
kubectl auth can-i --list
Some useful Helm commands to manage chart configurations:
# See all configurable options with detailed comments (equivalent to reading the values.yml)
# Example with the Coroot Helm Chart
helm show values coroot/coroot
# See all provided versions of a Helm Chart
helm search repo coroot/coroot --versions
# Get the values used when installing a Helm release
helm get values argocd -n argocd > argocd-values.yaml
helm upgrade argocd argo/argo-cd --version 5.9.1 --namespace argocd -f argocd-values.yaml
# Upgrade an existing Helm release in-place while keeping values provided during installation
helm upgrade argocd argo/argo-cd --reuse-values --force --version 5.9.1 --namespace argocd
# List all available revisions of a given release
helm -n nginx history ingress-nginx
# Get user-supplied values of a specific revision
helm -n nginx get values ingress-nginx --revision 3
# Rollback the release to a specific revision
helm -n nginx rollback ingress-nginx 3
In order to debug your own Helm Charts, you can leverage:
helm template --debug <release_name> <chart_path> -f <values_file_path>
helm install --generate-name --dry-run --debug <chart_path>
Notable domain names available in-cluster:
https://kubernetes.default (Kubernetes API Server)
http://<service_name> (reaches a service in the same namespace as the client)
http://<service_name>.<namespace>
http://<service_name>.<namespace>.svc.cluster.local