Muestra las diferencias entre dos versiones de la página.
| Próxima revisión | Revisión previa | ||
|
kubernetesdeploy [2025/06/04 07:05] fmolinuevo creado |
kubernetesdeploy [2025/08/27 06:49] (actual) fmolinuevo [3. Service de tipo LoadBalancer (Acceso Externo Avanzado - Solo en la Nube)] |
||
|---|---|---|---|
| Línea 9: | Línea 9: | ||
| Crea un archivo, por ejemplo, mi-aplicacion-deployment.yaml, con la siguiente estructura. Este ejemplo desplegará una aplicación Nginx simple: | Crea un archivo, por ejemplo, mi-aplicacion-deployment.yaml, con la siguiente estructura. Este ejemplo desplegará una aplicación Nginx simple: | ||
| - | YAML | ||
| <code> | <code> | ||
| Línea 37: | Línea 36: | ||
| Explicación de los campos clave: | Explicación de los campos clave: | ||
| - | apiVersion: La versión de la API de Kubernetes que estás utilizando. | + | **apiVersion**: La versión de la API de Kubernetes que estás utilizando. |
| - | kind: El tipo de recurso de Kubernetes que estás creando, en este caso, un Deployment. | + | **kind**: El tipo de recurso de Kubernetes que estás creando, en este caso, un Deployment. |
| - | metadata: Información sobre el Deployment, como su name y labels. | + | **metadata**: Información sobre el Deployment, como su name y labels. ç |
| - | spec: La especificación deseada para el Deployment. | + | |
| - | replicas: El número de Pods idénticos que deseas que se ejecuten. | + | **spec**: La especificación deseada para el Deployment. |
| - | selector: Define cómo el Deployment encuentra los Pods que debe gestionar. matchLabels asegura que los Pods con la etiqueta app: nginx sean parte de este Deployment. | + | **replicas**: El número de Pods idénticos que deseas que se ejecuten. |
| - | template: La plantilla para los Pods que el Deployment creará. | + | |
| - | metadata.labels: Etiquetas que se aplicarán a cada Pod, crucial para que el selector los identifique. | + | **selector**: Define cómo el Deployment encuentra los Pods que debe gestionar. matchLabels asegura que los Pods con la etiqueta app: nginx sean parte de este Deployment. |
| - | spec.containers: Define los contenedores que se ejecutarán dentro de cada Pod. | + | **template**: La plantilla para los Pods que el Deployment creará. |
| - | name: Nombre del contenedor. | + | **metadata.labels**: Etiquetas que se aplicarán a cada Pod, crucial para que el selector los identifique. |
| - | image: La imagen de contenedor que se utilizará (por ejemplo, nginx:latest). | + | **spec.containers**: Define los contenedores que se ejecutarán dentro de cada Pod. |
| - | containerPort: El puerto en el que la aplicación dentro del contenedor está escuchando. | + | **name**: Nombre del contenedor. |
| + | |||
| + | **image**: La imagen de contenedor que se utilizará (por ejemplo, nginx:latest). | ||
| + | |||
| + | **containerPort**: El puerto en el que la aplicación dentro del contenedor está escuchando. | ||
| ==== 2. Aplica el Deployment a tu clúster: ==== | ==== 2. Aplica el Deployment a tu clúster: ==== | ||
| Línea 77: | Línea 78: | ||
| Deberías ver tu Deployment listado y los Pods en estado Running. | Deberías ver tu Deployment listado y los Pods en estado Running. | ||
| - | Paso 2: Exponer la Aplicación con un Service (Servicio) | + | ===== Paso 2: Exponer la aplicación con un service ===== |
| Un Service en Kubernetes es una abstracción que define un conjunto lógico de Pods y una política para acceder a ellos. Los Pods tienen direcciones IP efímeras y pueden cambiar, por lo que los Services proporcionan una ubicación estable e inmutable para acceder a un grupo de Pods. | Un Service en Kubernetes es una abstracción que define un conjunto lógico de Pods y una política para acceder a ellos. Los Pods tienen direcciones IP efímeras y pueden cambiar, por lo que los Services proporcionan una ubicación estable e inmutable para acceder a un grupo de Pods. | ||
| Línea 83: | Línea 84: | ||
| Existen varios tipos de Services, cada uno adecuado para diferentes escenarios de acceso: | Existen varios tipos de Services, cada uno adecuado para diferentes escenarios de acceso: | ||
| - | 1. Service de tipo ClusterIP (Acceso Interno) | + | ==== 1. Service de tipo ClusterIP (Acceso Interno) ==== |
| - | Propósito: Este es el tipo de Service predeterminado. Asigna una dirección IP interna al Service, haciéndolo accesible solo desde dentro del clúster. Es ideal para la comunicación entre diferentes componentes de tu aplicación (microservicios). | + | Propósito: Este es el tipo de Service predeterminado. Asigna una dirección IP interna al Service, haciéndolo accesible solo desde dentro del clúster. Es ideal para la comunicación entre diferentes componentes de tu aplicación (microservicios). |
| - | Cuándo usarlo: Cuando tu aplicación solo necesita ser accesible por otros servicios o Pods dentro del mismo clúster. | + | Cuándo usarlo: Cuando tu aplicación solo necesita ser accesible por otros servicios o Pods dentro del mismo clúster. |
| Define tu Service ClusterIP en un archivo YAML (por ejemplo, mi-aplicacion-service-clusterip.yaml): | Define tu Service ClusterIP en un archivo YAML (por ejemplo, mi-aplicacion-service-clusterip.yaml): | ||
| - | YAML | ||
| + | <code> | ||
| apiVersion: v1 | apiVersion: v1 | ||
| kind: Service | kind: Service | ||
| Línea 104: | Línea 105: | ||
| targetPort: 80 # Puerto del contenedor al que se redirige el tráfico | targetPort: 80 # Puerto del contenedor al que se redirige el tráfico | ||
| type: ClusterIP | type: ClusterIP | ||
| + | </code> | ||
| Aplica el Service: | Aplica el Service: | ||
| - | Bash | ||
| - | kubectl apply -f mi-aplicacion-service-clusterip.yaml | + | kubectl apply -f mi-aplicacion-service-clusterip.yaml |
| Verifica el Service: | Verifica el Service: | ||
| - | Bash | ||
| - | kubectl get service mi-aplicacion-service-internal | + | kubectl get service mi-aplicacion-service-internal |
| Verás una CLUSTER-IP asignada, que es la IP interna del Service. | Verás una CLUSTER-IP asignada, que es la IP interna del Service. | ||
| - | 2. Service de tipo NodePort (Acceso Externo Básico) | + | ==== 2. Service de tipo NodePort (Acceso Externo Básico) ==== |
| - | Propósito: Extiende la funcionalidad de ClusterIP. Expone el Service en un puerto estático (generalmente en el rango 30000-32767) en la dirección IP de cada nodo del clúster. Esto permite que la aplicación sea accesible desde fuera del clúster a través de la IP de cualquier nodo y el NodePort asignado. | + | Propósito: Extiende la funcionalidad de ClusterIP. Expone el Service en un puerto estático (generalmente en el rango 30000-32767) en la dirección IP de cada nodo del clúster. Esto permite que la aplicación sea accesible desde fuera del clúster a través de la IP de cualquier nodo y el NodePort asignado. |
| - | Cuándo usarlo: Para exponer aplicaciones web o APIs cuando no tienes un balanceador de carga en la nube o para entornos de desarrollo/prueba. | + | Cuándo usarlo: Para exponer aplicaciones web o APIs cuando no tienes un balanceador de carga en la nube o para entornos de desarrollo/prueba. |
| Define tu Service NodePort en un archivo YAML (por ejemplo, mi-aplicacion-service-nodeport.yaml): | Define tu Service NodePort en un archivo YAML (por ejemplo, mi-aplicacion-service-nodeport.yaml): | ||
| - | YAML | ||
| + | <code> | ||
| apiVersion: v1 | apiVersion: v1 | ||
| kind: Service | kind: Service | ||
| Línea 139: | Línea 139: | ||
| nodePort: 30080 # Opcional: puedes especificar un puerto en el rango 30000-32767 | nodePort: 30080 # Opcional: puedes especificar un puerto en el rango 30000-32767 | ||
| type: NodePort | type: NodePort | ||
| + | </code> | ||
| Aplica el Service: | Aplica el Service: | ||
| - | Bash | ||
| - | kubectl apply -f mi-aplicacion-service-nodeport.yaml | + | kubectl apply -f mi-aplicacion-service-nodeport.yaml |
| Verifica el Service: | Verifica el Service: | ||
| - | Bash | ||
| - | kubectl get service mi-aplicacion-service-nodeport | + | kubectl get service mi-aplicacion-service-nodeport |
| En la columna PORT(S), verás algo como 80:30080/TCP. El 30080 es el NodePort asignado. | En la columna PORT(S), verás algo como 80:30080/TCP. El 30080 es el NodePort asignado. | ||
| Accede a tu aplicación: | Accede a tu aplicación: | ||
| - | Puedes acceder a tu aplicación desde un navegador o curl utilizando la dirección IP de cualquiera de tus nodos y el NodePort asignado: http://<IP_del_Nodo>:<NodePort> (ej. http://192.168.1.10:30080). | ||
| - | 3. Service de tipo LoadBalancer (Acceso Externo Avanzado - Solo en la Nube) | + | Puedes acceder a tu aplicación desde un navegador o curl utilizando la dirección IP de cualquiera de tus nodos y el NodePort asignado: |
| - | Propósito: Este tipo de Service solo está disponible en entornos de nube (como AWS EKS, Google Kubernetes Engine, Azure Kubernetes Service). Cuando creas un Service de tipo LoadBalancer, Kubernetes provisiona automáticamente un balanceador de carga externo en tu proveedor de nube, asignándole una dirección IP pública. | + | http://<IP_del_Nodo>:<NodePort> (ej. http://192.168.1.10:30080) |
| - | Cuándo usarlo: Para aplicaciones de producción que necesitan manejar un alto volumen de tráfico y requieren un balanceador de carga externo gestionado. | + | ==== 3. Service de tipo LoadBalancer (Acceso Externo Avanzado - Solo en la Nube) ==== |
| + | |||
| + | Propósito: Este tipo de Service solo está disponible en entornos de nube (como AWS EKS, Google Kubernetes Engine, Azure Kubernetes Service). Cuando creas un Service de tipo LoadBalancer, Kubernetes provisiona automáticamente un balanceador de carga externo en tu proveedor de nube, asignándole una dirección IP pública. | ||
| + | |||
| + | Cuándo usarlo: Para aplicaciones de producción que necesitan manejar un alto volumen de tráfico y requieren un balanceador de carga externo gestionado. | ||
| Define tu Service LoadBalancer en un archivo YAML (por ejemplo, mi-aplicacion-service-loadbalancer.yaml): | Define tu Service LoadBalancer en un archivo YAML (por ejemplo, mi-aplicacion-service-loadbalancer.yaml): | ||
| - | YAML | ||
| + | <code> | ||
| apiVersion: v1 | apiVersion: v1 | ||
| kind: Service | kind: Service | ||
| Línea 176: | Línea 178: | ||
| targetPort: 80 # Puerto del contenedor al que se redirige el tráfico | targetPort: 80 # Puerto del contenedor al que se redirige el tráfico | ||
| type: LoadBalancer | type: LoadBalancer | ||
| + | </code> | ||
| Aplica el Service: | Aplica el Service: | ||
| - | Bash | ||
| - | kubectl apply -f mi-aplicacion-service-loadbalancer.yaml | + | kubectl apply -f mi-aplicacion-service-loadbalancer.yaml |
| Verifica el Service: | Verifica el Service: | ||
| - | Bash | ||
| - | kubectl get service mi-aplicacion-service-external | + | kubectl get service mi-aplicacion-service-external |
| En la columna EXTERNAL-IP, verás la dirección IP pública asignada por el balanceador de carga de tu proveedor de nube. Puede tardar unos minutos en aparecer. | En la columna EXTERNAL-IP, verás la dirección IP pública asignada por el balanceador de carga de tu proveedor de nube. Puede tardar unos minutos en aparecer. | ||
| Accede a tu aplicación: | Accede a tu aplicación: | ||
| - | Una vez que la EXTERNAL-IP esté disponible, puedes acceder a tu aplicación desde un navegador o curl utilizando esa dirección IP pública: http://<EXTERNAL-IP>. | + | |
| - | Paso 3: Verificación y Depuración | + | Una vez que la EXTERNAL-IP esté disponible, puedes acceder a tu aplicación desde un navegador o curl utilizando esa dirección IP pública: |
| + | |||
| + | http://<EXTERNAL-IP>. | ||
| + | |||
| + | |||
| + | ===== Paso 3: Verificación y Depuración ===== | ||
| Es fundamental verificar el estado de tus recursos y saber cómo depurar si algo no funciona como esperas. | Es fundamental verificar el estado de tus recursos y saber cómo depurar si algo no funciona como esperas. | ||
| - | Verificar Deployments: | + | Verificar Deployments: |
| - | Bash | + | |
| - | kubectl get deployments | + | kubectl get deployments |
| - | kubectl describe deployment mi-aplicacion-nginx # Para detalles y eventos [5] | + | kubectl describe deployment mi-aplicacion-nginx # Para detalles y eventos [5] |
| Verificar Pods: | Verificar Pods: | ||
| - | Bash | ||
| - | kubectl get pods -o wide # Muestra IPs de Pods y en qué nodo están [4] | + | kubectl get pods -o wide # Muestra IPs de Pods y en qué nodo están [4] |
| - | kubectl describe pod <nombre_del_pod> # Para detalles, eventos y errores [4, 5] | + | kubectl describe pod <nombre_del_pod> # Para detalles, eventos y errores [4, 5] |
| - | kubectl logs <nombre_del_pod> # Para ver los logs de tu aplicación [5] | + | kubectl logs <nombre_del_pod> # Para ver los logs de tu aplicación [5] |
| Verificar Services: | Verificar Services: | ||
| - | Bash | ||
| - | kubectl get services | + | kubectl get services |
| - | kubectl describe service mi-aplicacion-service-nodeport # Para detalles y eventos | + | kubectl describe service mi-aplicacion-service-nodeport # Para detalles y eventos |
| + | |||
| + | ===== Bibliografía ===== | ||
| + | |||
| + | * Kubernetes Deployments: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/ | ||
| + | * Kubernetes Deployment in YAML: https://codefresh.io/learn/kubernetes-deployment/kubernetes-deployment-yaml/ | ||
| + | * Kubernetes Deployment YAML examples: https://octopus.com/devops/kubernetes-deployments/kubernetes-yaml/ | ||