Comandos Esenciales de kubectl para la Operación de Clústeres Kubernetes

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.

Etiquetas: Kubernetes kubectl DevOps Orquestación contenedores

Publicado el 9-28 18:15