Inspección del Estado del Clúster y Nodos
Para comenzar a diagnosticar o monitorear un entorno Kubernetes, es fundamental verificar la salud de los nodos físicos o virtuales que conforman la infraestructura subyacente.
$ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP OS-IMAGE
control-plane-01 Ready control-plane 12h v1.28.2 192.168.1.10 Ubuntu 22.04
worker-node-01 Ready <none> 12h v1.28.2 192.168.1.11 Ubuntu 22.04
worker-node-02 Ready <none> 12h v1.28.2 192.168.1.12 Ubuntu 22.04
Aunque el comando para verificar los estados de los componentes del plano de control está marcado como obsoleto en versiones modernas (v1.19+), aún puede ejecutarse para una revisión rápida:
$ kubectl get componentstatuses
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health":"true","reason":""}
Listado y Filtrado de Pods
Los pods son las unidades mínimas de despliegue. Podemos listarlos en el namespace por defecto, ampliar la información de red o aplicar filtros por namespace y etiquetas.
# Listar pods en el namespace actual
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
api-gateway-7d9f 1/1 Running 0 15m
# Obtener detalles extendidos (IPs y nodos asignados)
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
api-gateway-7d9f 1/1 Running 0 15m 10.244.12.45 worker-node-01 <none> <none>
# Filtrar por un namespace específico del sistema
$ kubectl get pods -n kube-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE
coredns-5d78c9869d-8x2lp 1/1 Running 0 12h 10.244.0.5 control-plane-01
kube-proxy-9k2m4 1/1 Running 0 12h 192.168.1.11 worker-node-01
# Filtrar pods utilizando selectores de etiquetas
$ kubectl get pods -o wide -l tier=frontend
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
api-gateway-7d9f 1/1 Running 0 20m 10.244.12.45 worker-node-01 <none> <none>
Análisis Profundo de un Pod
Cuando un pod presenta problemas o necesitamos verificar su configuración en tiempo de ejecución, el comando describe expone eventos, condiciones y detalles específicos de los contenedores.
$ kubectl describe pod api-gateway-7d9f
Name: api-gateway-7d9f
Namespace: default
Priority: 0
Service Account: default
Node: worker-node-01/192.168.1.11
Start Time: Mon, 23 Oct 2023 09:15:22 +0000
Labels: tier=frontend
app=api
Annotations: cni.projectcalico.org/podIP: 10.244.12.45/32
Status: Running
IP: 10.244.12.45
Containers:
nginx-container:
Container ID: containerd://8f3b2a1c9d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0
Image: nginx:1.25-alpine
Image ID: docker.io/library/nginx@sha256:1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c2d3e4f5a6b7c8d9e0f1a2b
Port: 80/TCP
State: Running
Started: Mon, 23 Oct 2023 09:15:25 +0000
Ready: True
Restart Count: 0
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 16m default-scheduler Successfully assigned default/api-gateway-7d9f to worker-node-01
Normal Pulling 16m kubelet Pulling image "nginx:1.25-alpine"
Normal Pulled 15m kubelet Successfully pulled image "nginx:1.25-alpine"
Normal Created 15m kubelet Created container nginx-container
Normal Started 15m kubelet Started container nginx-container
Gestión de Namespaces
Los namespaces permiten el aislamiento lógico de recursos dentro del mismo clúster. Para visualizar los espacios de nombres activos:
$ kubectl get namespaces
NAME STATUS AGE
default Active 12h
kube-node-lease Active 12h
kube-public Active 12h
kube-system Active 12h
monitoring Active 10h
Exploarción de la API mediante Explain
Para redactar manifiestos YAML precisos sin consultar documentación externa, kubectl explain actúa como referencia integrada, detallando los campos, sus tipos y descripciones.
$ kubectl explain pod.spec.containers
KIND: Pod
VERSION: v1
RESOURCE: containers <[]Object>
DESCRIPTION:
List of containers belonging to the pod. Containers cannot currently be
added or removed. There must be at least one container in a Pod. Cannot be
updated.
A single application container that you want to run within a pod.
FIELDS:
args <[]string>
Arguments to the entrypoint. The container image's CMD is used if this is
not provided.
command <[]string>
Entrypoint array. Not executed within a shell. The container image's
ENTRYPOINT is used if this is not provided.
image <string>
Container image name. More info:
https://kubernetes.io/docs/concepts/containers/images
Interacción Directa y Revisión de Logs
Para depurar aplicaciones en ejecución, es común acceder al shell del contenedor o extraer sus registros estándar. Es necesario especificar el nombre del contenedor si el pod aloja más de uno.
# Acceder a la terminal del pod (usa el contenedor por defecto)
$ kubectl exec -it api-gateway-7d9f -- /bin/sh
# Acceder a un contenedor específico dentro del pod
$ kubectl exec -it api-gateway-7d9f -c nginx-container -- /bin/sh
# Visualizar los logs estándar del contenedor
$ kubectl logs api-gateway-7d9f
Identificación mediante Etiquetas
Las etiquetas (labels) son cruciales para la selección, agrupación y enrutamiento de recursos. Podemos visualizarlas directamente en la salida de la consola.
$ kubectl get pod api-gateway-7d9f --show-labels
NAME READY STATUS RESTARTS AGE LABELS
api-gateway-7d9f 1/1 Running 0 25m app=api,tier=frontend
$ kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
api-gateway-7d9f 1/1 Running 0 25m app=api,tier=frontend
cache-redis-5b8c 1/1 Running 0 25m app=redis,tier=backend
Eliminación de Recursos
La destrucción de recursos puede realizarse de forma directa por nombre, mediante archivos de configuración o de manera forzada si el objeto queda atrapado en estado Terminating.
# Eliminación directa por nombre
$ kubectl delete pod api-gateway-7d9f
# Eliminación basada en un archivo de manifiesto
$ kubectl delete -f deployment-config.yaml
# Eliminación forzada (omite el periodo de gracia)
$ kubectl delete -f deployment-config.yaml --force --grace-period=0
Estructura Básica de un Manifiesto
Utilizando la información obtenida con explain, podemos construir un archivo de configuración. A continuación, se muestra un ejemplo básico para desplegar un servidor web:
---
apiVersion: v1
kind: Pod
metadata:
name: web-frontend-app
labels:
tier: frontend
environment: staging
spec:
containers:
- name: nginx-container
image: nginx:1.25-alpine
ports:
- containerPort: 80
imagePullPolicy: IfNotPresent
Nota: Si al explorar la documentación con explain observas la marca -required- junto a un campo, significa que es un parámetro obligatorio para que el manifiesto sea válido y aceptado por el servidor de API.