Skip to content

WebAssembly en RKE2


Introducción

WebAssembly fue originalmente creado para navegadores pero ultimamente se ha vuelto bastante popular del lado de servidor. En este laboratorio hablaremos un poco acerca de WebAssembly , sus ventajas y como ejecutarlo utlizando contenedores.

WebAssembly es una tecnologia universal que permite compilar aplicativos en varios lenguajes como c, rust y go en bytecode, para luego ser ejecutados directamente en navegadores y servidores.

Se pueden enumerar las siguientes ventajas/ Rapidez: Estos modulos inician considerablemente mas rapido que contenedores regulares. Livianos: Generalmente ocupan menos espacio y requieren menos recursos que contenedores regulares. Seguros: Estos modulos estan aislados del sistema operativo. Portabilidad: Los modulos de WASM puede ejecutarse en varios sistemas operativos y arquitecturas sin necesitas realizar cambios.


Objetivo

Objetivo General:

  • El objetivo de este laboratorio es entender la tecnologia de webassembly e integrarla con nuestro cluster de rke2 por medio de un operador que nos facilita el trabajo de configuracion. Desplegando finalmente un aplicativo con esta tecnologia.

Laboratorio: Desplegar KwASM y probar aplicativo webassembly(cluster1)

Antes de comenzar

  • Contar con el acceso al ambiente de laboratorio
  • Haber realizado la validación de conexión y funcionamiento
  • Finalizar las prácticas de laboratorio de las instalaciones de RKE2.
  • Esta práctica utiliza cluster (cluster1).

Inicio de laboratorio

Esta práctica se ejecutará con el usuario student en el sistemas lab-X-bastion

student@lab-0-bastion:~>

  1. Habilitaremos el acceso al cluster1 defieniedo la variable KUBECONFIG. Utilizaremos el cluster1, para desplegar la KwASM.
    export KUBECONFIG=/home/student/rke2_conn/cluster1/cluster1_kubeconfig.yaml
    
  2. Antes de instalar KvASM hablemos un poco de esta herramienta: Es un operador de kubernetes que agregar soporte para WebAssembly a los nodos de un cluster de kubernetes, este operador modificar directamente cada nodo del cluster instalando binarios y configuraciones necesarias para poder ejecutar WebAseembly Kwasm

  3. Primeramente vamos a agregar el repositorio de helm de esta herramienta.

    helm repo add kwasm http://kwasm.sh/kwasm-operator/
    

  4. Vamos a proceder con la instalacion utlizando al configuracion por defecto.
    helm install -n kwasm --create-namespace kwasm-operator kwasm/kwasm-operator
    
  5. Esperamos a que finalice la instalacion, podemos revisar con el siguiente comando.
    kubectl get pods -n kwasm
    
    Esperamos a que el pod del operador se encuentre en estado running.
  6. En este momento el operador ya se encuentra instalado pero no es funcional, para este proposito necesitamos colocarle un par de anotaciones a nuestros nodos workers de la siguiente manera.
    kubectl annotate node lab-11-node1.c.mx-g01.internal kwasm.sh/kwasm-node=true
    kubectl annotate node lab-11-node2.c.mx-g01.internal kwasm.sh/kwasm-node=true
    
  7. En este momento nuestro nodos estan listos para poder ejecutar aplicativos WebAssembly, vamos a ejecutar uno de ejemplo. Primero necesitamos crear el runtime de sping para poder ejecutar cargas de trabajo , ejecutamos el siguiente comando.
    echo '
    apiVersion: node.k8s.io/v1                                           
    kind: RuntimeClass
    metadata:
      name: wasmtime-spin
    handler: spin' | kubectl apply -f -
    
  8. Vamos a crear un namespace en donde deplegaremos nuestra carga de trabajo.
    kubectl create ns webassembly
    
  9. Finalmente vamos a crear un archivo llamado webdeployment.yaml con el siguiente contenido.
    apiVersion: apps/v1                                                  
    kind: Deployment
    metadata:
      name: wasm-spin
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: wasm-spin
      template:
        metadata:
          labels:
            app: wasm-spin
        spec:
          runtimeClassName: wasmtime-spin
          containers:
          - name: spin-hello
            image: ghcr.io/deislabs/containerd-wasm-shims/examples/spin-rust-hello:latest
            command: ["/"]
    
    Es de notar que definimos un parametro que no habiamos visto antes que es el de runtimeClassName, aqui indicamos que ejecute el runtime de Webassembly que creamos antes. Finalmente creamos el deploy
    kubectl apply -f webdeployment.yaml -n webassembly
    
  10. Validamos que se este ejecutando correctamente.
    kubectl get pods -n webassembly
    
    NAME                       READY   STATUS    RESTARTS   AGE
    wasm-spin-9f65849d-cxkd2   1/1     Running   0          40s
    
  11. Finalmente vamos a limpiar el ambiente Eliminamos el deployment y el runtime
    kubectl delete -f webdeployment.yaml -n webassembly
    kubectl delete RuntimeClass wasmtime-spin
    
    Le quitamos las anotaciones a los nodos
    kubectl annotate node lab-11-node1.c.mx-g01.internal kwasm.sh/kwasm-node- 
    kubectl annotate node lab-11-node2.c.mx-g01.internal kwasm.sh/kwasm-node-
    
    Finalmente eliminamos el operador
    helm uninstall kwasm-operator -n kwasm