Fundamentos de kubectl
Información del clúster
kubectl cluster-info kubectl get nodes kubectl config current-context kubectl config use-context my-cluster
Comandos esenciales
kubectl get <resource>Listar recursos
kubectl describe <resource> <name>Información detallada del recurso
kubectl create -f file.yamlCrear recurso desde archivo
kubectl apply -f file.yamlCrear o actualizar recurso
kubectl delete -f file.yamlEliminar recurso desde archivo
kubectl edit <resource> <name>Editar recurso en el lugar
kubectl api-resourcesListar todos los tipos de recurso
Formatos de salida
-o wideColumnas adicionales (IP, nodo)
-o yamlSalida YAML completa
-o jsonSalida JSON completa
-o jsonpath='{.spec}'Extraer campos específicos
--sort-by=.metadata.nameOrdenar salida por campo
Pods
Operaciones con pods
kubectl get pods kubectl get pods -A # all namespaces kubectl run nginx --image=nginx # quick pod kubectl delete pod nginx
YAML de pod
apiVersion: v1 kind: Pod metadata: name: myapp labels: { app: myapp } spec: containers: - name: app image: nginx:1.27 ports: - containerPort: 80
Valores de estado del pod
RunningTodos los contenedores iniciados
PendingEsperando planificación o descarga de imagen
CrashLoopBackOffEl contenedor sigue fallando y reiniciándose
ImagePullBackOffNo se puede descargar la imagen del contenedor
CompletedEjecutado hasta completarse (Jobs)
Deployments
YAML de deployment
apiVersion: apps/v1 kind: Deployment metadata: name: web spec: replicas: 3 selector: matchLabels: { app: web } template: metadata: labels: { app: web } spec: containers: - name: web image: nginx:1.27 ports: - containerPort: 80
Comandos de deployment
kubectl get deployListar deployments
kubectl scale deploy web --replicas=5Escalar réplicas
kubectl set image deploy/web web=nginx:1.28Actualizar imagen (rolling)
kubectl rollout status deploy/webVer progreso del rollout
kubectl rollout undo deploy/webRevertir a la revisión anterior
kubectl rollout history deploy/webVer historial de revisiones
Services
Tipos de service
ClusterIPSolo interno (por defecto)
NodePortExponer en la IP de cada nodo en un puerto estático
LoadBalancerBalanceador de carga externo (cloud)
ExternalNameAlias DNS a servicio externo
YAML de service
apiVersion: v1 kind: Service metadata: name: web-svc spec: type: ClusterIP selector: { app: web } ports: - port: 80 targetPort: 80
Exponer rápidamente
kubectl expose deploy web --port=80 --type=ClusterIP kubectl expose deploy web --port=80 --type=NodePort kubectl get svc
ConfigMaps y Secrets
ConfigMap
kubectl create configmap app-cfg \ --from-literal=DB_HOST=db.example.com \ --from-file=config.ini
Secret
kubectl create secret generic db-creds \ --from-literal=username=admin \ --from-literal=password=s3cret
Usar en pods
# As environment variables envFrom: - configMapRef: { name: app-cfg } - secretRef: { name: db-creds } # As volume mount volumes: - name: cfg configMap: { name: app-cfg }
Comandos
kubectl get cmListar ConfigMaps
kubectl get secretListar Secrets
kubectl describe cm app-cfgMostrar datos del ConfigMap
kubectl get secret db-creds -o yamlMostrar Secret (codificado en base64)
Namespaces
Comandos de namespace
kubectl get nsListar namespaces
kubectl create ns stagingCrear namespace
kubectl delete ns stagingEliminar namespace y todos sus recursos
kubectl get pods -n stagingListar pods en el namespace
kubectl get pods -AListar pods en todos los namespaces
Establecer namespace por defecto
kubectl config set-context --current \ --namespace=staging
Volúmenes
PersistentVolumeClaim
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: data-pvc spec: accessModes: [ReadWriteOnce] resources: requests: { storage: 10Gi }
Montar en pod
volumes: - name: data persistentVolumeClaim: claimName: data-pvc containers: - volumeMounts: - name: data mountPath: /app/data
Tipos de volumen
emptyDirDirectorio temporal, eliminado con el pod
hostPathMontar ruta del sistema de archivos del host
persistentVolumeClaimAlmacenamiento persistente (PVC)
configMapMontar ConfigMap como archivos
secretMontar Secret como archivos
Ingress
YAML de Ingress
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-ingress spec: rules: - host: app.example.com http: paths: - path: / pathType: Prefix backend: service: name: web-svc port: { number: 80 }
Notas sobre Ingress
Ingress ControllerObligatorio (nginx-ingress, traefik, etc.)
pathType: PrefixCoincidir con el prefijo de la URL
pathType: ExactCoincidir con la ruta URL exacta
TLSAgregar sección tls: con nombre del secret
Depuración
Comandos de diagnóstico
kubectl logs <pod>stdout/stderr del contenedor
kubectl logs <pod> -c <ctr>Logs de un contenedor específico
kubectl logs <pod> --previousLogs del contenedor que falló
kubectl describe pod <pod>Eventos, condiciones, estado
kubectl exec -it <pod> -- shShell dentro del contenedor
kubectl port-forward <pod> 8080:80Reenviar puerto local al pod
kubectl top podsUso de CPU/memoria (metrics-server)
kubectl get events --sort-by=.lastTimestampLínea de tiempo de eventos del clúster
Pod de depuración
kubectl run debug --rm -it --image=busybox -- sh # or attach ephemeral container kubectl debug -it --image=busybox
Patrones comunes
Etiquetas y selectores
kubectl get pods -l app=web kubectl get pods -l 'env in (prod,staging)' kubectl label pod myapp env=prod
Límites de recursos
resources: requests: { cpu: 100m, memory: 128Mi } limits: { cpu: 500m, memory: 256Mi }
Liveness y Readiness
livenessProbe: httpGet: { path: /healthz, port: 8080 } initialDelaySeconds: 5 periodSeconds: 10 readinessProbe: httpGet: { path: /ready, port: 8080 }
Recetas rápidas
Dry runkubectl apply -f file.yaml --dry-run=client
Generate YAMLkubectl create deploy web --image=nginx --dry-run=client -o yaml
Watchkubectl get pods -w
Copy fileskubectl cp file.txt pod:/tmp/
Restart deploykubectl rollout restart deploy/web