Desplegar sitio web

Desplegar una Web con Docker y containerd

1. Requisitos previos

  • Kubernetes instalado (kubeadm con containerd).
  • kubectl configurado correctamente.
  • Docker instalado (para construir la imagen).
  • ctr y crictl instalados (para gestionar containerd).

2. Crear la página web y el Dockerfile

Primero, creamos el código HTML y el Dockerfile para empaquetarlo en un contenedor.

2.1- Crear el archivo index.html

mkdir -p ~/static-website
cd ~/static-website
nano index.html

Contenido:

<!DOCTYPE html>
<html lang="es">
    <head>
        <meta charset="UTF-8" />
        <title>Hola Mundo</title>
    </head>
    <body>
        <h1>¡Hola, Kubernetes!</h1>
    </body>
</html>

Guardar (CTRL+X, Y, Enter).

2.2- Crear el Dockerfile

nano Dockerfile

Contenido:

FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html

Guardar (CTRL+X, Y, Enter).


3. Construir la imagen con Docker

Ejecuta el siguiente comando para construir la imagen en Docker:

docker build -t static-website:v1 .

Verifica que la imagen se creó correctamente:

docker images

4. Mover la imagen de Docker a containerd

Kubernetes no usa Docker directamente, así que debemos exportar la imagen de Docker e importarla en containerd.

4.1- Exportar la imagen desde Docker

docker save static-website:v1 -o static-website.tar

4.2- Importar la imagen en containerd

sudo ctr -n k8s.io images import static-website.tar

4.3- Verificar que la imagen está en containerd

sudo crictl images

La imagen ya está lista para ser usada en Kubernetes.


5. Crear el manifiesto de Kubernetes (static-website.yaml)

nano static-website.yaml

Contenido:

apiVersion: apps/v1
kind: Deployment
metadata:
    name: static-website
spec:
    replicas: 1
    selector:
        matchLabels:
            app: static-website
    template:
        metadata:
            labels:
                app: static-website
        spec:
            containers:
                - name: static-website
                  image: static-website:v1
                  imagePullPolicy: Never
                  ports:
                      - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
    name: static-website-service
spec:
    type: NodePort
    selector:
        app: static-website
    ports:
        - protocol: TCP
          port: 80
          targetPort: 80
          nodePort: 30080

Guardar (CTRL+X, Y, Enter).


6. Desplegar la aplicación en Kubernetes

kubectl apply -f static-website.yaml

Verificar que el pod está corriendo:

kubectl get pods

Verificar que el servicio está creado:

kubectl get svc

Salida esperada:

NAME                     TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes               ClusterIP   10.96.0.1      <none>        443/TCP        10m
static-website-service   NodePort    10.101.198.243 <none>        80:30080/TCP   30s

7. Acceder a la web desde el navegador

  1. Obtener la IP de la VM:

    hostname -I
  2. Acceder desde el navegador:

    http://<IP-DE-TU-VM>:30080
  3. Verificar acceso desde dentro de la VM:

    curl http://localhost:30080

Resumen final

  • Construiste la imagen con Docker.
  • Exportaste la imagen y la importaste en containerd.
  • Desplegaste la aplicación en Kubernetes.
  • Configuraste las reglas de red para que sea accesible.
  • Probaste y accediste con http://<IP-VM>:30080.

Este método te permite usar Docker para construir imágenes, pero aprovechar containerd en Kubernetes sin problemas.