kubectl
kubectl es el comando para hablar con el cluster: consultar qué hay, crear y borrar objetos, ver logs y entrar a los Pods. Casi todos los comandos siguen el patrón kubectl <verbo> <tipo> <nombre>, por ejemplo kubectl get pods o kubectl delete deploy chanchito. Lo que está entre < > se reemplaza.
Términos de esta página
Los objetos (Pod, Deployment, Service…) están explicados en Conceptos.
- Recurso / objeto
- Cualquier cosa que existe en el cluster: un Pod, un Deployment, un Service, un namespace. Cada uno tiene un tipo y un nombre.
- Verbo
- Lo que querés hacer:
get(listar),describe(detalle),apply(crear o actualizar),delete(borrar),logs,exec… - kubeconfig
- El archivo
~/.kube/configdonde kubectl guarda a qué clusters puede conectarse y con qué credenciales. - Contexto
- Una combinación de cluster + usuario + namespace guardada en el kubeconfig. Cambiar de contexto = cambiar de cluster.
- Namespace
- Agrupación de recursos dentro del cluster. Si no indicás uno con
-n, kubectl usadefault. - Label
- Una etiqueta
clave=valorpegada a un objeto (app=chanchito), para filtrar y agrupar. - Rollout
- El proceso de actualizar un Deployment a una versión nueva, reemplazando los Pods de a poco.
- Port-forward
- Un túnel temporal desde un puerto de tu PC hasta un Pod o Service del cluster, para probarlo desde el navegador.
- Watch (
-w) - Dejar el comando abierto mostrando los cambios en vivo. Se corta con Ctrl+C.
- Helm / chart
- Helm es un gestor de paquetes para Kubernetes; un chart es un paquete listo para instalar (por ejemplo, una base de datos completa).
Cluster local para practicar
Elegí uno. En Windows lo más directo es el de Docker Desktop.
Docker Desktop
- Abrí Docker Desktop → ícono de engranaje (Settings) → Kubernetes.
- Marcá Enable Kubernetes y tocá Apply & restart. Si pregunta por el tipo de cluster, dejá la opción por defecto (kubeadm).
- Esperá unos minutos a que abajo aparezca Kubernetes running.
kubectl y crea el contexto docker-desktop.kubectl config use-context docker-desktop
kubectl get nodeskubectl que use el cluster de Docker Desktop (por si tenías otro configurado). La segunda lista las máquinas del cluster: si aparece docker-desktop con STATUS Ready, está funcionando y listo para recibir Pods.NAME STATUS ROLES AGE VERSION
docker-desktop Ready control-plane 2m v1.3x.x
Comparte las imágenes con tu Docker: lo que construís con docker build ya está disponible (usá imagePullPolicy: IfNotPresent).
minikube
minikube start
minikube stop
minikube deletestart lo crea la primera vez (tarda unos minutos) y lo enciende las siguientes; stop lo apaga conservando todo; delete lo borra por completo. Al arrancar, configura kubectl para que apunte a él.minikube image load chanchito:1docker build en tu PC no está ahí. Este comando la copia al cluster para que los Pods puedan usarla sin un registro.minikube service chanchitominikube dashboard
minikube tunneldashboard abre un panel web para ver Pods, Deployments y logs con el mouse. tunnel (se deja corriendo en otra terminal) le da una dirección accesible desde tu PC a los Services de tipo LoadBalancer, que en un cluster local, si no, quedan en pending.kind (Kubernetes in Docker)
kind create cluster --name dev
kind delete cluster --name dev--name permite tener varios; delete lo elimina.kind load docker-image chanchito:1 --name dev¿Funciona?
kubectl versionkubectl (Client) y la del cluster (Server). Si solo aparece Client y un error de conexión, kubectl no llega al cluster: revisá que esté encendido y el contexto.kubectl cluster-infokubectl get nodesNotReady significa que el nodo tiene un problema y no va a recibir Pods nuevos.Contextos: a qué cluster estoy apuntando
Un contexto = cluster + usuario + namespace por defecto. Viven en ~/.kube/config.
Ver y cambiar contexto
kubectl config get-contextskubectl puede tener configurados varios clusters (local, de pruebas, de producción). Cada combinación de cluster + usuario + namespace es un contexto. Este comando los lista; el que está en uso tiene un * en la columna CURRENT.kubectl config current-contextkubectl config use-context <contexto>kubectl. Todos los comandos siguientes van a ese cluster hasta que vuelvas a cambiarlo.Namespace por defecto
kubectl config set-context --current --namespace=<ns>kubectl get pods muestra los de ese namespace sin escribir -n <ns> en cada comando.kubectl config view --minify%USERPROFILE%\.kube\config.Antes de borrar algo, revisá el contexto. Es el error clásico: ejecutar en producción creyendo que estás en local.
Ver recursos
get para listar, describe para el detalle con eventos.
Listar (get)
kubectl get podsdocker ps). Columnas: READY (contenedores listos / total), STATUS (Running, Pending, CrashLoopBackOff…), RESTARTS (cuántas veces se reinició: si sube, algo falla) y AGE.kubectl get pods -o wide-o (output) cambia el formato; wide agrega columnas: la IP interna de cada Pod y en qué nodo corre.kubectl get pods -A-A (all namespaces) muestra los Pods de todos los namespaces, incluidos los del propio Kubernetes en kube-system. Agrega una columna NAMESPACE.kubectl get pods -w-w (watch) se queda mirando y agrega una línea cada vez que un Pod cambia de estado. Ideal justo después de un apply, para ver cómo arrancan. Ctrl+C para salir.kubectl get allkubectl get deploy,svc,pvc,cm,secretdeploy (Deployment), svc (Service), pvc, cm (ConfigMap), secret.Detalle (describe)
kubectl describe pod <pod>kubectl describe deploy chanchito
kubectl describe svc chanchitoselector no coincide con las etiquetas de ningún Pod listo.kubectl get events --sort-by=.lastTimestampkubectl get deploy chanchito -o yamlstatus con su estado actual.kubectl explain deployment.spec.template.spec.containers--recursive para ver todos los subcampos.kubectl api-resourcesapiVersion y si pertenecen a un namespace.Crear, actualizar y borrar
Lo normal: escribir YAML y usar apply. Los comandos imperativos sirven para pruebas rápidas o para generar el YAML.
Declarativo (apply)
kubectl apply -f deployment.yamlunchanged. Es la forma normal de trabajar.kubectl apply -f k8s/.yaml de una carpeta de una vez: equivale a docker compose up -d para un proyecto completo.kubectl diff -f k8s/- se quitan, con + se agregan). Si no imprime nada, el cluster ya está igual a los archivos.kubectl delete -f k8s/docker compose down. Si hay un PVC en la carpeta, sus datos también se pierden.kubectl apply -k overlays/dev-k apunta a la carpeta que tiene un kustomization.yaml.Imperativo y generadores
kubectl create deployment chanchito --image=chanchito:1 --replicas=2kubectl expose deployment chanchito --port=80 --target-port=300080 y reenvía al 3000 de los Pods (donde escucha la app). Por defecto es de tipo ClusterIP, accesible solo dentro del cluster; agregá --type=NodePort para abrirlo en tu PC.kubectl create deployment chanchito --image=chanchito:1 \
--dry-run=client -o yaml > deployment.yaml--dry-run=client no crea nada en el cluster y -o yaml imprime el manifiesto que hubiera creado; > lo guarda en un archivo. Así obtenés un YAML base correcto para editar en vez de escribirlo desde cero.kubectl run tmp --rm -it --image=busybox -- sh--rm lo borra al salir con exit.kubectl edit deploy chanchitoapply lo pisa. Mejor editar el YAML y aplicar.Borrar
kubectl delete pod <pod>kubectl delete deploy chanchito
kubectl delete svc chanchitokubectl delete all -l app=chanchito-l filtra por etiqueta (label): borra Pods, Services, Deployments y ReplicaSets que tengan app=chanchito. Igual que get all, no incluye ConfigMaps, Secrets ni PVC.kubectl delete pod <pod> --grace-period=0 --forceLogs, entrar al Pod y acceder desde tu PC
Lo que más vas a usar para depurar.
Logs
kubectl logs <pod>console.log y errores). Es lo primero que hay que mirar cuando un Pod no anda.kubectl logs -f <pod>-f (follow) sigue mostrando las líneas nuevas en vivo. Ctrl+C deja de mirar; el Pod sigue corriendo.kubectl logs deploy/chanchitokubectl logs -l app=chanchito --tail=50app=chanchito. Agregá --prefix para ver de qué Pod viene cada línea.kubectl logs <pod> --previouskubectl logs <pod> -c <contenedor>-c elige de cuál ver los logs (sin él, kubectl te pide que elijas). Los nombres están en kubectl describe pod.Entrar y copiar
kubectl exec -it <pod> -- sh-it conecta tu teclado y el -- separa las opciones de kubectl del comando que se ejecuta adentro. Salís con exit.kubectl exec -it deploy/monguito -- mongosh -u mati -p <password>show dbs o consultar colecciones. Salís con exit.kubectl cp <pod>:/home/app/log.txt ./log.txtpod:/ruta. Necesita que la imagen tenga el programa tar.kubectl top pods
kubectl top nodes100m = una décima de núcleo) y memoria usa cada Pod ahora. Requiere metrics-server, que Docker Desktop no trae instalado; sin él, da el error Metrics API not available.Acceder desde tu PC
kubectl port-forward svc/chanchito 3000:80localhost:3000 en tu PC llega al puerto 80 del Service. El formato es tu PC:destino, como el -p de Docker. Queda corriendo mientras lo uses; Ctrl+C lo cierra.kubectl port-forward svc/monguito 27017:27017localhost:27017 como si Mongo corriera en tu PC.kubectl port-forward pod/<pod> 3000:3000Queda corriendo en la terminal: Ctrl+C lo corta.
Escalar, actualizar y volver atrás
Un Deployment actualiza de a poco (rolling update): nunca te quedás sin Pods.
Rolling update de v1 a v2
kubectl set image deployment/chanchito chanchito=chanchito:2 (o cambiar la imagen en el YAML y apply)
Escalar
kubectl scale deploy chanchito --replicas=5replicas: en el archivo.kubectl autoscale deploy chanchito --min=2 --max=6 --cpu-percent=70resources.requests, y los quita cuando baja, siempre entre 2 y 6. Requiere metrics-server y que el contenedor declare requests de CPU.kubectl get hpa45%/70%) y cuántas réplicas hay. Si dice <unknown>, falta metrics-server o los requests.Actualizar y rollback
kubectl set image deployment/chanchito chanchito=chanchito:2nombre-del-contenedor=imagen (el nombre es el de containers[].name en el YAML). Dispara un rolling update: reemplaza los Pods de a poco, sin cortar el servicio.kubectl rollout status deploy/chanchitoget pods y sus logs.kubectl rollout history deploy/chanchitotemplate del Pod (imagen, variables…) crea una revisión nueva.kubectl rollout undo deploy/chanchito
kubectl rollout undo deploy/chanchito --to-revision=2--to-revision=N vuelve a una revisión concreta de rollout history. Recordá corregir también tu YAML, o el próximo apply vuelve a poner la versión mala.kubectl rollout restart deploy/chanchitoNamespaces y labels
Organizar y filtrar.
Namespaces
kubectl get nsdefault (donde va lo tuyo si no indicás otro), kube-system (los componentes de Kubernetes) y kube-public.kubectl create ns chanchito-devchanchito en chanchito-dev y otro en chanchito-qa.kubectl get pods -n chanchito-dev
kubectl apply -f k8s/ -n chanchito-dev-n <namespace> funciona en cualquier comando para trabajar en ese namespace: listar, aplicar, borrar, ver logs. Sin -n, se usa el del contexto (normalmente default).kubectl delete ns chanchito-devLabels
kubectl get pods --show-labelsclave=valor que se ponen en metadata.labels y que usan los Services y Deployments para encontrar sus Pods.kubectl get pods -l app=chanchito
kubectl get pods -l 'env in (dev,qa)'-l filtra por etiqueta: solo los Pods con app=chanchito. La segunda forma elige varios valores. Es el mismo mecanismo (el selector) que usa un Service para saber a qué Pods mandar tráfico.kubectl label pod <pod> env=dev
kubectl label pod <pod> env-- al final del nombre (env-) la quita. Si le sacás a un Pod la etiqueta que usa su Deployment, el Deployment deja de considerarlo suyo y crea otro.Formatos de salida
Flag -o en cualquier get.
Tabla de -o
| Flag | Qué muestra | Ejemplo |
|---|---|---|
-o wide | Columnas extra (IP, nodo, imagen) | kubectl get pods -o wide |
-o yaml / -o json | El objeto completo | kubectl get svc chanchito -o yaml |
-o name | Solo tipo/nombre (para scripts) | kubectl get pods -o name |
-o jsonpath | Un campo puntual | kubectl get pod <pod> -o jsonpath='{.status.podIP}' |
-o custom-columns | Tus propias columnas | -o custom-columns=NOMBRE:.metadata.name,IMG:.spec.containers[0].image |
--sort-by | Ordenar | kubectl get pods --sort-by=.status.startTime |
-w | Seguir mostrando cambios | kubectl get pods -w |
Secret decodificado (PowerShell): kubectl get secret mongo-secret -o jsonpath='{.data.MONGO_PASSWORD}' y después [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String("<valor>")).
Atajos y Helm
Para escribir menos.
Alias y autocompletado
# PowerShell ($PROFILE)
Set-Alias k kubectl
kubectl completion powershell | Out-String | Invoke-Expressionk para no escribir kubectl y activa el autocompletado con Tab (nombres de comandos, tipos y hasta nombres de Pods). Pegalo en tu perfil de PowerShell (notepad $PROFILE) para que se cargue en cada terminal nueva. Después: k get po.# Bash / Git Bash (~/.bashrc)
alias k=kubectl
source <(kubectl completion bash)~/.bashrc y abrí una terminal nueva.po pods · deploy · svc · ns · cm · pvc · ing · sts · no nodes.Helm (gestor de paquetes)
helm repo add traefik https://traefik.github.io/charts
helm repo updaterepo add registra un repositorio de charts con un nombre corto; repo update descarga la lista actualizada de lo que ofrece.helm install traefik traefik/traefik -n traefik --create-namespacetraefik/traefik (repositorio/chart) con el nombre traefik, en el namespace traefik, creándolo si no existe. A cada instalación Helm la llama release. Traefik es un Ingress controller: el programa que hace funcionar los Ingress.helm list -A
helm upgrade traefik traefik/traefik -n traefik -f values.yaml
helm uninstall traefik -n traefiklist muestra los releases instalados en todos los namespaces. upgrade actualiza uno, aplicando tus valores de configuración de values.yaml. uninstall lo borra con todo lo que había creado.No hay comandos que coincidan con la búsqueda.