Diferencia entre revisiones de «MCC - Implementación Dockerizada»

De MCC™ Wiki
Sin resumen de edición
Sin resumen de edición
Línea 1: Línea 1:
== Requerimientos ==
== Servir un Sitio HTML5 Utilizando una Imagen Docker Liviana con Apache ==


IP Variable por ISP:
Para servir tu sitio HTML5 utilizando una imagen Docker liviana con Apache, te recomiendo que utilices una imagen basada en Alpine, que es una de las distribuciones de Linux más ligeras disponibles. Alpine es ideal para casos en los que se busca minimizar el tamaño de las imágenes y mejorar la eficiencia en Kubernetes.


Configurar un servicio **DDNS** en mi router Ej: **no-ip.com**, y además, crear un registro **CNAME** en el DNS de su dominio con el subdominio Ej: '''domus.maxiscomputers.com''' el cual apunte a su DDNS, en este caso Ej: '''maxiscomputers.dyndns.net'''.
A continuación te doy un ejemplo de cómo sería el Dockerfile utilizando una imagen de httpd (Apache) basada en Alpine:


IP Fija: Redirigir puertos a ingress.
=== Dockerfile ===
<syntaxhighlight lang="docker">
# Usa la imagen de Apache en Alpine como base
FROM httpd:alpine


Quiero adaptar mi clúster de Kubernetes para que haga proxy inverso y genere automáticamente un certificado SSL con **Let's Encrypt**. ¿Es esto posible, dado esta arquitectura de DDNS y CNAME entre el dominio final que va a usar el usuario vs el DDNS?
# Copia los archivos de tu sitio web a la carpeta de Apache
COPY ./public-html/ /usr/local/apache2/htdocs/


=== Descripción del Escenario ===
# Expone el puerto 80 para servir el sitio
EXPOSE 80


* **DDNS con no-ip.com**: Utilizas un DDNS para gestionar los cambios de IP de tu router, con '''maxiscomputers.dyndns.net''' como dominio proporcionado.
# Comando para iniciar Apache en modo foreground
* **Subdominio personalizado**: '''domus.maxiscomputers.com''' es el subdominio, con un registro CNAME apuntando a '''maxiscomputers.dyndns.net'''.
CMD ["httpd-foreground"]
* **Let's Encrypt**: Usarás Let's Encrypt para generar certificados SSL para el subdominio '''domus.maxiscomputers.com'''.
</syntaxhighlight>


=== Retos a Considerar ===
=== Estructura del Proyecto ===
Supongamos que tienes los archivos de tu sitio web HTML5 en una carpeta llamada ''public-html'' dentro del mismo directorio donde está el Dockerfile. Esta estructura es común en proyectos web estáticos.


* **Verificación de Let's Encrypt (HTTP-01)**: Let's Encrypt necesita verificar el control sobre tu dominio antes de emitir un certificado. Para la verificación HTTP-01, se comprobará un archivo expuesto en la ruta '''http://domus.maxiscomputers.com/.well-known/acme-challenge/''' desde tu clúster.
=== Pasos para construir y ejecutar la imagen ===
* **Actualización de IP**: Como tu IP cambia cada 24 horas, debes asegurarte de que el DDNS esté actualizado para que Let's Encrypt apunte a la IP correcta al hacer la verificación. No-ip.com se encarga de este aspecto.
* **Certificado para CNAME**: A pesar de que el subdominio real apunta a un DDNS, Let's Encrypt validará el dominio '''domus.maxiscomputers.com''' para emitir el certificado.


=== Solución Propuesta ===
==== Construir la imagen Docker: ====
<syntaxhighlight lang="bash">
docker build -t mi-sitio-html5:latest .
</syntaxhighlight>


Usaremos **cert-manager** en el clúster de Kubernetes, junto con un Ingress Controller (como **NGINX** o **Traefik**) para manejar el tráfico HTTPS y solicitar automáticamente los certificados de Let's Encrypt. El Ingress Controller actuará como un proxy inverso para redirigir el tráfico, y cert-manager gestionará los certificados SSL.
==== Ejecutar la imagen en un contenedor: ====
<syntaxhighlight lang="bash">
docker run -d -p 80:80 mi-sitio-html5:latest
</syntaxhighlight>


==== Pasos a Seguir ====
Con esto, estarías sirviendo tu sitio web estático a través del puerto 80.


1. **Instalar cert-manager**
=== Ventajas de usar Alpine ===
 
* '''Tamaño reducido''': Las imágenes basadas en Alpine suelen ser mucho más pequeñas que las tradicionales.
Cert-manager gestionará la obtención y renovación de los certificados SSL de Let's Encrypt automáticamente.
* '''Eficiencia en Kubernetes''': Usar imágenes más livianas ayuda a mejorar los tiempos de despliegue y a reducir el consumo de recursos en un clúster.
 
```bash
# Agrega el repositorio Helm de Jetstack
helm repo add jetstack https://charts.jetstack.io
 
# Instala cert-manager en tu clúster
helm install cert-manager jetstack/cert-manager  --namespace cert-manager --create-namespace  --version v1.10.0
```
 
2. **Crear un ClusterIssuer para Let's Encrypt**
 
Configura un ClusterIssuer para que cert-manager pueda solicitar certificados de Let's Encrypt usando la verificación HTTP-01.
 
```yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: <tu-email>  # Reemplaza con tu email
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
    - http01:
        ingress:
          class: nginx
```
 
Aplica el ClusterIssuer:
 
```bash
kubectl apply -f clusterissuer.yaml
```
 
3. **Configurar el Ingress para tu Aplicación**
 
Suponiendo que tienes un servicio en el puerto 80 en Kubernetes, configuraremos un recurso Ingress para gestionar el proxy inverso y la solicitud del certificado SSL.
 
```yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: domus-ingress
  namespace: default
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
spec:
  rules:
  - host: domus.maxiscomputers.com  # El dominio para el que solicitas el certificado
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: your-service-name  # Cambia por el nombre de tu servicio
            port:
              number: 80
  tls:
  - hosts:
    - domus.maxiscomputers.com
    secretName: domus-tls  # Nombre del secreto que contendrá el certificado SSL
```
 
Aplica el Ingress:
 
```bash
kubectl apply -f ingress.yaml
```
 
4. **Verificar la Configuración de DDNS**
 
Asegúrate de que el dominio '''domus.maxiscomputers.com''' esté correctamente apuntando a '''maxiscomputers.dyndns.net''', y que tu router actualice el DDNS automáticamente.
 
5. **Configurar Ingress Controller (NGINX)**
 
Si aún no tienes un Ingress Controller, puedes instalar NGINX con:
 
```bash
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install ingress-nginx ingress-nginx/ingress-nginx  --namespace ingress-nginx --create-namespace
```
 
=== Renovación Automática del Certificado ===
Cert-manager se encargará de renovar el certificado antes de su vencimiento (por defecto, cuando falten 30 días).
 
== Conclusión ==
 
Con esta configuración, **cert-manager** solicitará automáticamente un certificado SSL para tu dominio '''domus.maxiscomputers.com''', a pesar de que uses un CNAME hacia un DDNS. El certificado se renovará automáticamente y el Ingress Controller (NGINX en este caso) gestionará el tráfico y la redirección a HTTPS.

Revisión del 01:15 10 sep 2024

Servir un Sitio HTML5 Utilizando una Imagen Docker Liviana con Apache

Para servir tu sitio HTML5 utilizando una imagen Docker liviana con Apache, te recomiendo que utilices una imagen basada en Alpine, que es una de las distribuciones de Linux más ligeras disponibles. Alpine es ideal para casos en los que se busca minimizar el tamaño de las imágenes y mejorar la eficiencia en Kubernetes.

A continuación te doy un ejemplo de cómo sería el Dockerfile utilizando una imagen de httpd (Apache) basada en Alpine:

Dockerfile

<syntaxhighlight lang="docker">

  1. Usa la imagen de Apache en Alpine como base

FROM httpd:alpine

  1. Copia los archivos de tu sitio web a la carpeta de Apache

COPY ./public-html/ /usr/local/apache2/htdocs/

  1. Expone el puerto 80 para servir el sitio

EXPOSE 80

  1. Comando para iniciar Apache en modo foreground

CMD ["httpd-foreground"] </syntaxhighlight>

Estructura del Proyecto

Supongamos que tienes los archivos de tu sitio web HTML5 en una carpeta llamada public-html dentro del mismo directorio donde está el Dockerfile. Esta estructura es común en proyectos web estáticos.

Pasos para construir y ejecutar la imagen

Construir la imagen Docker:

<syntaxhighlight lang="bash"> docker build -t mi-sitio-html5:latest . </syntaxhighlight>

Ejecutar la imagen en un contenedor:

<syntaxhighlight lang="bash"> docker run -d -p 80:80 mi-sitio-html5:latest </syntaxhighlight>

Con esto, estarías sirviendo tu sitio web estático a través del puerto 80.

Ventajas de usar Alpine

  • Tamaño reducido: Las imágenes basadas en Alpine suelen ser mucho más pequeñas que las tradicionales.
  • Eficiencia en Kubernetes: Usar imágenes más livianas ayuda a mejorar los tiempos de despliegue y a reducir el consumo de recursos en un clúster.