Aplicar el manifiesto YAML
En este paso, explorarás en detalle el comando kubectl apply
y aprenderás diferentes formas de aplicar manifiestos de Kubernetes. A partir de los archivos YAML del paso anterior, demostraremos diversas técnicas para aplicar manifiestos.
Primero, asegúrate de estar en el directorio correcto:
cd ~/project/k8s-manifests
Creemos un nuevo subdirectorio para organizar mejor nuestros manifiestos. Crea un directorio llamado manifests
y navega hacia él:
mkdir -p manifests
cd manifests
Ahora, creemos un manifiesto para una aplicación web simple que incluya tanto un Despliegue (Deployment) como un Servicio (Service) en un solo archivo. Crea un nuevo archivo llamado web-app.yaml
usando nano
:
nano web-app.yaml
Agrega el siguiente contenido a web-app.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:alpine
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
selector:
app: web
type: ClusterIP
ports:
- port: 80
targetPort: 80
Este manifiesto define dos recursos de Kubernetes en un solo archivo, separados por ---
. Esta es una forma común de agrupar recursos relacionados. Analicemos lo nuevo:
- Múltiples recursos en un solo archivo: El archivo
web-app.yaml
ahora contiene dos definiciones de recursos de Kubernetes separadas: un Despliegue y un Servicio. El separador ---
se utiliza para distinguirlos.
kind: Service
: Esto define un recurso de Servicio.
spec.selector.app: web
: Este Servicio apuntará a los pods que tengan la etiqueta app: web
. Esto coincide con las etiquetas que establecimos para los pods creados por el Despliegue web-app
.
spec.type: ClusterIP
: Especifica el tipo de servicio como ClusterIP
. Esto significa que el servicio se expondrá en una dirección IP interna dentro del clúster y se utiliza típicamente para la comunicación entre servicios dentro del clúster.
spec.ports
: Define cómo el servicio mapea puertos a los pods de destino.
port: 80
: El puerto en el propio Servicio al que accederás.
targetPort: 80
: El puerto en los pods de destino al que el servicio reenviará el tráfico.
Ahora, apliquemos este manifiesto utilizando diferentes métodos.
Método 1: Aplicar el archivo completo
Esta es la forma más común de aplicar un manifiesto. Utiliza kubectl apply -f
seguido del nombre del archivo:
kubectl apply -f web-app.yaml
Este comando creará tanto el Despliegue como el Servicio definidos en web-app.yaml
. Deberías ver una salida como esta:
deployment.apps/web-app created
service/web-service created
Método 2: Aplicar desde un directorio
Puedes aplicar todos los manifiestos en un directorio a la vez. Si tienes múltiples archivos de manifiesto en el directorio manifests
, puedes aplicarlos todos especificando el directorio en lugar de un archivo específico:
kubectl apply -f.
El .
representa el directorio actual. kubectl
buscará archivos YAML en este directorio y los aplicará todos. Esto es útil cuando has organizado tus manifiestos en múltiples archivos dentro de un directorio.
Método 3: Aplicar desde una URL (Opcional)
kubectl apply
también puede aplicar manifiestos directamente desde una URL. Esto es útil para desplegar rápidamente aplicaciones de ejemplo o configuraciones alojadas en línea. Por ejemplo, puedes desplegar el despliegue del maestro de Redis desde el repositorio de ejemplos de Kubernetes:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/examples/master/guestbook/redis-master-deployment.yaml
Esto descargará el manifiesto desde la URL y lo aplicará a tu clúster. Nota: Ten precaución al aplicar manifiestos desde URLs no confiables, ya que pueden modificar potencialmente tu clúster.
Exploremos algunas opciones adicionales para kubectl apply
.
Ejecución simulada (Dry Run)
Puedes usar la bandera --dry-run=client
para simular la aplicación de un manifiesto sin realizar cambios reales en el clúster. Esto es útil para comprobar si tu manifiesto es válido y para ver qué recursos se crearían o modificarían:
kubectl apply -f web-app.yaml --dry-run=client
Este comando mostrará lo que se crearía o cambiaría, pero no aplicará realmente los cambios a tu clúster.
Salida detallada (Verbose Output)
Para obtener una salida más detallada de kubectl apply
, puedes usar la bandera -v
seguida de un nivel de detalle (por ejemplo, -v=7
). Los niveles de detalle más altos proporcionan más información, lo que puede ser útil para la depuración:
kubectl apply -f web-app.yaml -v=7
Esto imprimirá mucha más información sobre las solicitudes de API que se están realizando y el procesamiento del manifiesto.
Verifica los recursos creados al aplicar web-app.yaml
. Utiliza kubectl get deployments
y kubectl get services
para listar los Despliegues y Servicios en tu clúster:
## List deployments
kubectl get deployments
## List services
kubectl get services
## Describe the deployment to see more details
kubectl describe deployment web-app
Ejemplo de salida para kubectl get deployments
:
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 3/3 3 3 3m33s
redis-master 0/1 1 0 23s
web-app 2/2 2 2 42s
Ejemplo de salida para kubectl get services
:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8m28s
web-service ClusterIP 10.106.220.33 <none> 80/TCP 46s
Observa que ahora tienes un Despliegue web-app
con 2/2 réplicas READY
y un Servicio web-service
de tipo ClusterIP
.
Hablemos brevemente sobre la diferencia entre la gestión declarativa e imperativa en Kubernetes, especialmente en el contexto de kubectl apply
y kubectl create
.
kubectl apply
: Utiliza un enfoque declarativo. Defines el estado deseado en tus archivos de manifiesto, y kubectl apply
intenta alcanzar ese estado. Si ejecutas kubectl apply
varias veces con el mismo manifiesto, Kubernetes solo realizará cambios si hay diferencias entre el estado deseado en el manifiesto y el estado actual en el clúster. kubectl apply
generalmente se recomienda para gestionar recursos de Kubernetes porque es más robusto y más fácil de gestionar los cambios con el tiempo. Realiza un seguimiento de la configuración de tus recursos y permite actualizaciones incrementales.
kubectl create
: Utiliza un enfoque imperativo. Instructas directamente a Kubernetes a crear un recurso. Si intentas ejecutar kubectl create
para un recurso que ya existe, generalmente resultará en un error. kubectl create
es menos flexible para gestionar actualizaciones y cambios en comparación con kubectl apply
.
En la mayoría de los casos, especialmente para la gestión de despliegues de aplicaciones, kubectl apply es el método preferido y recomendado
debido a su naturaleza declarativa y mejor manejo de actualizaciones y gestión de configuración.