Capitulo 4: kubectl Esencial

Por: Artiko
k3skuberneteskubectlcli

Capitulo 4: kubectl Esencial

< Volver al Indice del Tutorial

kubectl en K3s

K3s incluye kubectl integrado en el mismo binario. Puedes usarlo de dos formas:

# Opcion 1: kubectl integrado
sudo k3s kubectl get nodes

# Opcion 2: symlink (creado por el instalador)
sudo kubectl get nodes

Si prefieres usar kubectl como herramienta independiente (para gestionar multiples clusters), puedes instalarlo por separado:

# Instalar kubectl standalone
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/

Configurar KUBECONFIG

kubectl necesita saber donde esta el cluster. K3s genera el archivo de configuracion en /etc/rancher/k3s/k3s.yaml.

Opcion 1: Variable de entorno

export KUBECONFIG=/etc/rancher/k3s/k3s.yaml

Agrega esta linea a tu ~/.bashrc o ~/.zshrc para que persista.

Opcion 2: Copiar al directorio estandar

mkdir -p ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
sudo chown $(id -u):$(id -g) ~/.kube/config

Opcion 3: Acceso remoto

Para gestionar K3s desde tu maquina local, copia el kubeconfig y cambia la IP:

# En el servidor
sudo cat /etc/rancher/k3s/k3s.yaml

# En tu maquina local, pegar el contenido y cambiar:
# server: https://127.0.0.1:6443 → server: https://IP-SERVIDOR:6443

El server debe tener el TLS SAN configurado para la IP o dominio externo:

curl -sfL https://get.k3s.io | sh -s - --tls-san IP-PUBLICA

Comandos de Informacion

get - Listar recursos

# Pods en el namespace actual
kubectl get pods

# Pods en todos los namespaces
kubectl get pods -A

# Pods con mas detalle
kubectl get pods -o wide

# Nodos del cluster
kubectl get nodes

# Services
kubectl get svc

# Todos los recursos comunes
kubectl get all

describe - Detalle de un recurso

# Detalle de un pod (eventos, condiciones, volumenes)
kubectl describe pod mi-pod

# Detalle de un nodo (capacidad, pods asignados)
kubectl describe node mi-nodo

# Detalle de un servicio
kubectl describe svc mi-servicio

logs - Ver logs de contenedores

# Logs de un pod
kubectl logs mi-pod

# Logs en tiempo real
kubectl logs -f mi-pod

# Logs de un contenedor especifico en pod multi-contenedor
kubectl logs mi-pod -c nombre-contenedor

# Ultimas 50 lineas
kubectl logs --tail=50 mi-pod

# Logs de la ultima hora
kubectl logs --since=1h mi-pod

top - Uso de recursos

# CPU y RAM por nodo
kubectl top nodes

# CPU y RAM por pod
kubectl top pods

# Top en todos los namespaces
kubectl top pods -A

Requiere metrics-server (incluido en K3s por defecto).

Comandos CRUD

create - Crear recursos imperativamente

# Crear un namespace
kubectl create namespace staging

# Crear un deployment
kubectl create deployment nginx --image=nginx:alpine

# Crear un servicio
kubectl create service clusterip nginx --tcp=80:80

apply - Aplicar configuracion declarativa

# Aplicar un archivo YAML
kubectl apply -f mi-deployment.yaml

# Aplicar todos los YAML de un directorio
kubectl apply -f ./manifests/

# Aplicar desde URL
kubectl apply -f https://ejemplo.com/manifest.yaml

apply es el metodo recomendado. Crea el recurso si no existe o lo actualiza si ya existe.

delete - Eliminar recursos

# Eliminar un pod
kubectl delete pod mi-pod

# Eliminar un deployment (y sus pods)
kubectl delete deployment mi-app

# Eliminar desde archivo YAML
kubectl delete -f mi-deployment.yaml

# Eliminar todos los pods de un namespace
kubectl delete pods --all -n staging

# Forzar eliminacion (pod atascado en Terminating)
kubectl delete pod mi-pod --force --grace-period=0

edit - Editar recursos en vivo

# Abre el recurso en $EDITOR
kubectl edit deployment mi-app

# Editar un servicio
kubectl edit svc mi-servicio

Los cambios se aplican inmediatamente al guardar y cerrar el editor.

Comandos de Debugging

exec - Ejecutar comandos dentro de un pod

# Abrir una shell interactiva
kubectl exec -it mi-pod -- /bin/sh

# Ejecutar un comando puntual
kubectl exec mi-pod -- ls /app

# En un contenedor especifico
kubectl exec -it mi-pod -c sidecar -- /bin/sh

port-forward - Tunel a un pod o servicio

# Forward local:8080 → pod:80
kubectl port-forward pod/mi-pod 8080:80

# Forward a un servicio
kubectl port-forward svc/mi-servicio 8080:80

# Escuchar en todas las interfaces (no solo localhost)
kubectl port-forward --address 0.0.0.0 svc/mi-servicio 8080:80

Util para acceder a servicios que no estan expuestos externamente.

cp - Copiar archivos desde/hacia pods

# Copiar archivo local al pod
kubectl cp archivo.txt mi-pod:/tmp/archivo.txt

# Copiar archivo del pod a local
kubectl cp mi-pod:/var/log/app.log ./app.log

Formatos de Output

-o wide

Muestra columnas adicionales (IP del pod, nodo donde corre):

kubectl get pods -o wide

-o yaml

Output completo en YAML (util para ver toda la configuracion):

kubectl get deployment mi-app -o yaml

-o json

Output en JSON:

kubectl get pods -o json

-o jsonpath

Extraer campos especificos:

# IP de un pod
kubectl get pod mi-pod -o jsonpath='{.status.podIP}'

# Imagenes de todos los pods
kubectl get pods -o jsonpath='{.items[*].spec.containers[*].image}'

# Nombres y estados
kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.phase}{"\n"}{end}'

-o name

Solo nombres de recursos (util para scripting):

kubectl get pods -o name
# pod/nginx-abc123
# pod/redis-xyz789

Autocompletado

Bash

echo 'source <(kubectl completion bash)' >> ~/.bashrc
source ~/.bashrc

Zsh

echo 'source <(kubectl completion zsh)' >> ~/.zshrc
source ~/.zshrc

Despues de configurar, presiona Tab para autocompletar nombres de recursos, namespaces y subcomandos.

Aliases Utiles

Agrega estos aliases a tu ~/.bashrc o ~/.zshrc:

# Alias basico
alias k='kubectl'

# Pods
alias kgp='kubectl get pods'
alias kgpa='kubectl get pods -A'
alias kgpw='kubectl get pods -o wide'

# Services
alias kgs='kubectl get svc'

# Deployments
alias kgd='kubectl get deployments'

# Logs
alias kl='kubectl logs'
alias klf='kubectl logs -f'

# Aplicar y eliminar
alias ka='kubectl apply -f'
alias kd='kubectl delete -f'

# Contexto y namespace
alias kns='kubectl config set-context --current --namespace'

Uso:

kgp              # kubectl get pods
kgpa             # kubectl get pods -A
klf mi-pod       # kubectl logs -f mi-pod
ka deploy.yaml   # kubectl apply -f deploy.yaml
kns staging      # cambiar al namespace staging

Cheat Sheet

ComandoDescripcion
kubectl get podsListar pods
kubectl get pods -APods en todos los namespaces
kubectl get nodesListar nodos
kubectl get svcListar services
kubectl get ingressListar ingress
kubectl get allListar recursos principales
kubectl describe pod <nombre>Detalle de un pod
kubectl logs <pod>Ver logs
kubectl logs -f <pod>Logs en tiempo real
kubectl exec -it <pod> -- /bin/shShell en un pod
kubectl apply -f <archivo>Aplicar manifiesto
kubectl delete -f <archivo>Eliminar por manifiesto
kubectl port-forward svc/<svc> 8080:80Tunel a un servicio
kubectl top podsUso de CPU/RAM por pod
kubectl rollout status deploy/<nombre>Estado del rollout
kubectl rollout undo deploy/<nombre>Rollback del deployment
kubectl scale deploy/<nombre> --replicas=3Escalar replicas
kubectl config get-contextsVer contextos configurados
kubectl config use-context <nombre>Cambiar de cluster/contexto
kubectl api-resourcesListar tipos de recursos disponibles

Labels y Selectors

Los labels son pares clave-valor que etiquetan recursos. Los selectors filtran por labels:

# Filtrar pods por label
kubectl get pods -l app=nginx

# Multiples labels
kubectl get pods -l app=nginx,env=prod

# Agregar label a un recurso
kubectl label pod mi-pod env=staging

# Eliminar un label
kubectl label pod mi-pod env-

Los labels son fundamentales en Kubernetes. Los Services usan selectors para encontrar sus pods y los Deployments para gestionar sus ReplicaSets.


Siguiente: Capitulo 5: Pods y Deployments —>