OKD: Prueba de Microservicios

  • Esta guia

1. Crear Proyecto

  • El primer paso es crear un proyecto
  • Completamos el formulario
  • Se crea
  • PENDIENTE:
  • Se ejecuta permisos para correr como root, desde el provisioner
oc adm policy add-scc-to-user anyuid -z default -n tavo-prueba-microservicios

2. Crear ConfigMaps: productos.json

  • Ahora en la maquina local creamos un archivo productos.json
  • y le agregamos
[
  {
    "id": 1,
    "nombre": "Martillo",
    "precio": 8.50,
    "categoria": "Herramientas"
  },
  {
    "id": 2,
    "nombre": "Taladro",
    "precio": 55.00,
    "categoria": "Eléctricas"
  },
  {
    "id": 3,
    "nombre": "Destornillador",
    "precio": 3.25,
    "categoria": "Herramientas"
  }
]
  • Ahora vamos a crear un
  • Nombre:
productos.json
  • Clave:
productos.json

3. Crear ConfigMaps: proveedores.json

  • Ahora en la maquina local creamos un archivo proveedores.json
  • y le agregamos
[
  {
    "id": 1,
    "nombre": "Ferretería Central",
    "pais": "Costa Rica"
  },
  {
    "id": 2,
    "nombre": "Herramientas Global",
    "pais": "México"
  }
]
  • Ahora vamos a crear un
  • Nombre:
proveedores-json
  • Clave:
proveedores.json
  • Valor: navegar y cargamos el archivo

4. Crear Implementación/deploy: api-productos

  • YAML
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-productos
  namespace: tavo-prueba-microservicios
spec:
  replicas: 2
  selector:
    matchLabels:
      app: api-productos
  template:
    metadata:
      labels:
        app: api-productos
    spec:
      containers:
        - name: nginx
          image: nginx:1.25
          ports:
            - containerPort: 80
          volumeMounts:
            - name: productos-json
              mountPath: /usr/share/nginx/html/productos.json
              subPath: productos.json
      volumes:
        - name: productos-json
          configMap:
            name: productos-json
  • Crear
  • Se crea
  • Si regresamos a Cargas de Trabajo -> Implementaciones
  • Vemos que tenemos la implementación funcionando y que tiene un selector de pods el cual utilizamos para crear el servicio
app=api-productos
  • Ahora para probar si esta funcionado vamos a Cargas de Trabajo -> Pods y abrimos uno
  • Vamos al tab de «Terminal» y ejecutamos
curl http://localhost/productos.json
  • Nos debe regresar el valor

5. Crear Servicio: producto

  • yaml
apiVersion: v1
kind: Service
metadata:
  name: api-productos
  namespace: tavo-prueba-microservicios
spec:
  selector:
    app: api-productos
  ports:
    - port: 80
      targetPort: 80
  • Lo creamos
  • Se crea

6. Crear la ruta: productos

  • YAML
apiVersion: route.openshift.io/v1
kind: Route
metadata:
  name: productos
  namespace: tavo-prueba-microservicios
spec:
  host: productos.apps.okd.una.ac.cr
  to:
    kind: Service
    name: api-productos
  port:
    targetPort: 80
  tls:
    termination: edge
  • Se crea

7. Crear Implementación/deploy: api-proveedores

  • YAML
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-proveedores
  namespace: tavo-prueba-microservicios
spec:
  replicas: 2
  selector:
    matchLabels:
      app: api-proveedores
  template:
    metadata:
      labels:
        app: api-proveedores
    spec:
      containers:
        - name: nginx
          image: nginx:1.25
          ports:
            - containerPort: 80
          volumeMounts:
            - name: proveedores-json
              mountPath: /usr/share/nginx/html/proveedores.json
              subPath: proveedores.json
      volumes:
        - name: proveedores-json
          configMap:
            name: proveedores-json
  • Crear
  • Se crea
  • Si regresamos a Cargas de Trabajo -> Implementaciones
  • Vemos que tenemos la implementación funcionando y que tiene un selector de pods el cual utilizamos para crear el servicio
app=api-proveedores
  • Ahora para probar si esta funcionado vamos a Cargas de Trabajo -> Pods y abrimos uno
  • Vamos al tab de «Terminal» y ejecutamos
curl http://localhost/proveedores.json
  • Nos debe regresar el valor

8. Crear Servicio: provedores

  • yaml
apiVersion: v1
kind: Service
metadata:
  name: api-proveedores
  namespace: tavo-prueba-microservicios
spec:
  selector:
    app: api-proveedores
  ports:
    - port: 80
      targetPort: 80
  • Lo creamos
  • Se crea

9. Crear la ruta: productos

  • YAML
apiVersion: route.openshift.io/v1
kind: Route
metadata:
  name: proveedores
  namespace: tavo-prueba-microservicios
spec:
  host: proveedores.apps.okd.una.ac.cr
  to:
    kind: Service
    name: api-proveedores
  port:
    targetPort: 80
  tls:
    termination: edge
  • Esto indica que llega en 443 hasta el router
  tls:
    termination: edge
  • Se crea

10. Crea ConfigMap index.html que consume los servicios

  • YAML
apiVersion: v1
kind: ConfigMap
metadata:
  name: frontend-html
  namespace: tavo-prueba-microservicios
data:
  index.html: |
    <!DOCTYPE html>
    <html lang="es">
    <head>
      <meta charset="UTF-8">
      <title>Ferretería - Microservicios</title>
      <style>
        body {
          font-family: Arial, sans-serif;
          margin: 40px;
        }
        h2 {
          margin-top: 40px;
        }
        table {
          border-collapse: collapse;
          width: 60%;
        }
        th, td {
          border: 1px solid #ccc;
          padding: 8px;
        }
        th {
          background: #f4f4f4;
        }
      </style>
    </head>
    <body>

    <h1>Ferretería - Demo Microservicios</h1>

    <h2>Productos</h2>
    <table id="productos">
      <thead>
        <tr>
          <th>ID</th>
          <th>Nombre</th>
          <th>Precio</th>
          <th>Categoría</th>
        </tr>
      </thead>
      <tbody></tbody>
    </table>

    <h2>Proveedores</h2>
    <table id="proveedores">
      <thead>
        <tr>
          <th>ID</th>
          <th>Nombre</th>
          <th>País</th>
        </tr>
      </thead>
      <tbody></tbody>
    </table>

    <script>
    async function cargarProductos() {
      const res = await fetch("https://productos.apps.okd.una.ac.cr/productos.json");
      const data = await res.json();

      const tbody = document.querySelector("#productos tbody");
      data.forEach(p => {
        tbody.innerHTML += `
          <tr>
            <td>${p.id}</td>
            <td>${p.nombre}</td>
            <td>${p.precio}</td>
            <td>${p.categoria}</td>
          </tr>`;
      });
    }

    async function cargarProveedores() {
      const res = await fetch("https://proveedores.apps.okd.una.ac.cr/proveedores.json");
      const data = await res.json();

      const tbody = document.querySelector("#proveedores tbody");
      data.forEach(p => {
        tbody.innerHTML += `
          <tr>
            <td>${p.id}</td>
            <td>${p.nombre}</td>
            <td>${p.pais}</td>
          </tr>`;
      });
    }

    cargarProductos();
    cargarProveedores();
    </script>

    </body>
    </html>
  • Se crea

11.Crear implementacion de frontend

  • yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: frontend
  namespace: tavo-prueba-microservicios
spec:
  replicas: 2
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
        - name: nginx
          image: nginx:1.25
          ports:
            - containerPort: 80
          volumeMounts:
            - name: frontend-html
              mountPath: /usr/share/nginx/html/index.html
              subPath: index.html
      volumes:
        - name: frontend-html
          configMap:
            name: frontend-html
  • Se crea
  • Verificar si esta corriendo

12. Crear servicio frontend

  • Yaml
apiVersion: v1
kind: Service
metadata:
  name: frontend
  namespace: tavo-prueba-microservicios
spec:
  selector:
    app: frontend
  ports:
    - port: 80
      targetPort: 80

13. Obtener los certificados UNA

  • Ejecutamos en la maquina local rban1.3
cd /home/tavo/Escritorio/
mkdir certificados
cd certificados/

scp -r root@10.0.2.30:/etc/letsencrypt/live/CERTIFICADOWILDCOMODO/2025/STAR_una_ac_cr.crt .

scp -r root@10.0.2.30:/etc/letsencrypt/live/CERTIFICADOWILDCOMODO/2025/una.ac.cr.key .

scp -r root@10.0.2.30:/etc/letsencrypt/live/CERTIFICADOWILDCOMODO/2025/My_CA_Bundle.ca-bundle .
  • Creamos un full que contenga STAR y Bundle
cat STAR_una_ac_cr.crt My_CA_Bundle.ca-bundle > fullcert.crt

14. Crear ruta

  • Asi
apiVersion: route.openshift.io/v1
kind: Route
metadata:
  name: frontend
  namespace: tavo-prueba-microservicios
spec:
  host: frontend.una.ac.cr
  to:
    kind: Service
    name: frontend
  port:
    targetPort: 80
  tls:
    termination: edge
  • se crea

15. Certificado

  • Editamos la ruta
  • NOTA: Estamos en el puerto 80 (es lo que tiene configurado el servicio)
  • Marcamos la opción de Ruta Segura
  • Terminación TLS: Edge
  • Trafico inseguro: redirigir
  • Certificado: el full que acabamos de crear
  • Lo abrimos o pegamos el contenido
  • Clave privada: una.ac.cr.key
  • Y ya sirve el certificado
  • Sin embargo hay errores en la carga de los servicios
  • modificamos la ruta de frontend
apiVersion: route.openshift.io/v1
kind: Route
metadata:
  name: frontend
  namespace: tavo-prueba-microservicios
spec:
  host: frontend.una.ac.cr
  path: /
  to:
    kind: Service
    name: frontend
  port:
    targetPort: 80
  tls:
    termination: edge
  • crear ruta que ve el servico de productos
apiVersion: route.openshift.io/v1
kind: Route
metadata:
  name: productos-api
  namespace: tavo-prueba-microservicios
spec:
  host: frontend.una.ac.cr
  path: /productos.json
  to:
    kind: Service
    name: api-productos
  port:
    targetPort: 80
  tls:
    termination: edge

  • proveedores
apiVersion: route.openshift.io/v1
kind: Route
metadata:
  name: proveedores-api
  namespace: tavo-prueba-microservicios
spec:
  host: frontend.una.ac.cr
  path: /proveedores.json
  to:
    kind: Service
    name: api-proveedores
  port:
    targetPort: 80
  tls:
    termination: edge
  • modificar ConfigMap frontend-html
  • Modificamos las rutas
fetch("https://productos.apps.okd.una.ac.cr/productos.json");
fetch("https://proveedores.apps.okd.una.ac.cr/proveedores.json");
  • A
fetch("/productos.json");
fetch("/proveedores.json");
  • Reiniciamos la implementación