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

kubectl get pods -A -w

Watch all pods

kubectl rollout restart statefulset NAME

Rolling restart

kubectl logs POD --tail=100 -f

Follow logs

kubectl exec -it POD — bash

Interactive shell

kubectl cp NS/POD:/path /local/path

Copy files out