kubectl Favorites
Custom Output
Custom Columns
# Custom columns - exactly what you need, nothing more
kubectl get pods -A -o custom-columns=\
'NAMESPACE:.metadata.namespace,'\
'POD:.metadata.name,'\
'STATUS:.status.phase,'\
'RESTARTS:.status.containerStatuses[0].restartCount,'\
'NODE:.spec.nodeName'
Service Endpoints
# Service endpoint debugging
kubectl get endpoints -A -o custom-columns=\
'NAMESPACE:.metadata.namespace,'\
'SERVICE:.metadata.name,'\
'ENDPOINTS:.subsets[*].addresses[*].ip'
PVC Status
# PVC status with storage class
kubectl get pvc -A -o custom-columns=\
'NAMESPACE:.metadata.namespace,'\
'NAME:.metadata.name,'\
'STATUS:.status.phase,'\
'SIZE:.spec.resources.requests.storage,'\
'STORAGECLASS:.spec.storageClassName,'\
'VOLUME:.spec.volumeName'
Troubleshooting
Pod Deep Dive
# Pod troubleshooting deep dive
POD="wazuh-manager-master-0"
NS="wazuh"
# Events for this pod
kubectl get events -n "$NS" --field-selector "involvedObject.name=$POD" --sort-by='.lastTimestamp'
# Container logs (last 100 lines)
kubectl logs -n "$NS" "$POD" --tail=100
# Previous container logs (if restarted)
kubectl logs -n "$NS" "$POD" --previous --tail=50 2>/dev/null || echo "No previous container"
# Describe with events
kubectl describe pod -n "$NS" "$POD" | awk '/Events:/,0'
Exec Patterns
# Exec patterns for debugging
NS="wazuh"
# Interactive shell
kubectl exec -it -n "$NS" wazuh-manager-master-0 -- /bin/bash
# One-shot command
kubectl exec -n "$NS" wazuh-manager-master-0 -- /var/ossec/bin/agent_control -l
# Multiple commands
kubectl exec -n "$NS" wazuh-manager-master-0 -- sh -c 'cat /etc/ossec-init.conf && ls -la /var/ossec/logs/'
# Copy files out
kubectl cp "$NS/wazuh-manager-master-0:/var/ossec/logs/ossec.log" /tmp/ossec.log
Node Pressure
# Node condition monitoring (memory/disk pressure)
kubectl get nodes -o json | jq -r '
.items[] |
.metadata.name as $node |
.status.conditions[] |
select(.type | test("Pressure|Ready")) |
[$node, .type, .status, .reason] | @tsv' | column -t
Networking
IngressRoute Analysis
# Traefik IngressRoute analysis
kubectl get ingressroute -A -o json | jq -r '
.items[] |
.metadata.namespace as $ns |
.spec.routes[] |
[$ns, .match, (.services[0].name // "N/A"), (.services[0].port // "N/A")] | @tsv' | \
column -t -s $'\t' -N "NS,MATCH,SERVICE,PORT"
Cilium Policies
# Cilium network policy analysis
kubectl get ciliumnetworkpolicies -A -o json | jq -r '
.items[] |
[.metadata.namespace, .metadata.name,
(.spec.endpointSelector.matchLabels | to_entries | map("\(.key)=\(.value)") | join(",")),
(.spec.ingress // [] | length), (.spec.egress // [] | length)] | @tsv' | \
column -t -s $'\t' -N "NS,POLICY,SELECTOR,INGRESS,EGRESS"
Resource Management
Namespace Resource Quotas
# Namespace resource consumption
for ns in $(kubectl get ns -o jsonpath='{.items[*].metadata.name}'); do
pods=$(kubectl get pods -n "$ns" --no-headers 2>/dev/null | wc -l)
if [ "$pods" -gt 0 ]; then
cpu=$(kubectl top pods -n "$ns" --no-headers 2>/dev/null | awk '{sum+=$2} END {print sum"m"}')
mem=$(kubectl top pods -n "$ns" --no-headers 2>/dev/null | awk '{sum+=$3} END {print sum"Mi"}')
printf "%-25s %3d pods %8s CPU %8s MEM\n" "$ns" "$pods" "$cpu" "$mem"
fi
done
Quick Reference
| Pattern | Purpose |
|---|---|
|
Watch all pods |
|
Rolling restart |
|
Follow logs |
|
Interactive shell |
|
Copy files out |