Single page application en Kubernetes

Ya tengo mi cluster montado, es hora de empezar a montar la web que estará al amparo de Kubernetes. El objetivo de esta SPA es que no tenga computación que el JavaScript que se ejecuta sólo sea del lado del cliente y no del servido, para eso utilizaremos otro lenguaje.

Entonces que quiero realmente ?. Quiero un contenedor para la aplicación que contenga los archivos y un servidor que las sirva, por ejemplo Nginx.

No os parece genial ?. Tenemos nuestro servidor Nginx con un volumen montado que es el que sirve. Entonces sólo necesitamos poner nuestros archios allí para servir la web

Configuración

Personalmente los pv me gusta nombrarlos con la capacidad, para luego no tener problemas a elegir alguno y demás, por lo tanto aquí tenemos hydra-nfs-bucket-18G03-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: hydra-nfs-bucket-18g03-pv
spec:
  storageClassName: storage-nfs
  mountOptions:
  - nfsvers=4.1
  capacity:
    storage: 18Gi
  accessModes:
    - ReadWriteMany
  nfs:
    server: <TU-IP>
    path: "/bucket/18g03"

También soy muy fan de poner cada cosa en su namespace, para tenerlo todo ordenador y poder auditarlo en el futuro

00-namespace.yaml

kind: Namespace
apiVersion: v1
metadata:
  name: infra-web-spa-ns

Ahora toca el yaml que reclama el volumen 01-vpc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: infra-web-spa-pvc
  labels:
    app: infra-web-spa
  namespace: infra-web-spa-ns
spec:
  storageClassName: storage-nfs
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 18Gi
  volumeName: hydra-nfs-bucket-18g03-pv

Un deployment bastante simple y sencillo de entender, como este

apiVersion: apps/v1
kind: Deployment
metadata:
  name: infra-web-spa-deployment
  namespace: infra-web-spa-ns
spec:
  replicas: 2
  selector:
    matchLabels:
      app: infra-web-spa
  template:
    metadata:
      labels:
        app: infra-web-spa
    spec:
      containers:
      - name: web
        image: nginx
        ports:
          - name: web
            containerPort: 80
        volumeMounts:
            - name: infra-web-spa-pvc
              mountPath: "/usr/share/nginx/html"
      volumes:
      - name: infra-web-spa-pvc
        persistentVolumeClaim:
          claimName: infra-web-spa-pvc

Suelo tener la configuración separada, aunque según va aumentando la configuración, creo que es mejor ponerlo todo en un mismo archivo, bueno ya os contaré si eso pasa.

I por ultimo el servicio

apiVersion: v1
kind: Service
metadata:
  name: web-nfs-service
  namespace: infra-web-spa-ns
spec:
  selector:
    app: infra-web-spa
  type: NodePort
  ports:
    - port: 80
      nodePort: 30010

Llegados a este ultimo, yo he utilizado un Nodeport, para probar si todo funcionaba correctamente, pero sentiros libres de elegir lo que queráis!

Deja una respuesta

A %d blogueros les gusta esto: