Leer en inglés

Compartir a través de


Creación de grupos de nodos de Interfaz del sistema de WebAssembly (WASI) en Azure Kubernetes Service (AKS) para ejecutar la carga de trabajo de WebAssembly (Wasm) (versión preliminar)

WebAssembly (Wasm) es un formato binario optimizado para una descarga rápida y una velocidad de ejecución máxima en un entorno de ejecución Wasm. Un tiempo de ejecución de Wasm está diseñado para ejecutarse en una arquitectura de destino y ejecutar componentes Wasm en un espacio aislado, aislado del equipo host, en un rendimiento casi nativo. De forma predeterminada, los componentes Wasm no pueden acceder a los recursos del host fuera del espacio aislado a menos que se permita explícitamente. Por ejemplo, los componentes Wasm no pueden comunicarse a través de sockets, recibir o enviar tráfico HTTP, o incluso para acceder a cosas como variables de entorno sin aprobación explícita. El estándar Interfaz del sistema de WebAssembly (WASI) define una API para que los entornos de ejecución Wasm proporcionen acceso a los componentes de Wasm al entorno y a los recursos fuera del host mediante un modelo de capacidades.

Importante

Los grupos de nodos WASI ahora usan Correcciones de compatibilidad en contenedores SpinKube para ejecutar cargas de trabajo de Wasm. Anteriormente, AKS usaba Krustlet para permitir que los módulos Wasm se ejecutasen en Kubernetes. Si sigue usando grupos de nodos WASI basados en Krustlet, puede migrar a correcciones de compatibilidad (shims) containerd mediante la creación de un nuevo grupo de nodos WASI y la migración de las cargas de trabajo al nuevo grupo de nodos.

Antes de empezar

Debe tener instalada la versión más reciente de la CLI de Azure.

Instalación de la versión preliminar de la extensión de la CLI de Azure en versión preliminar de AKS

Importante

Las características en versión preliminar de AKS están disponibles como opción de participación y autoservicio. Las versiones preliminares se proporcionan "tal cual" y "como están disponibles", y están excluidas de los Acuerdos de nivel de servicio y garantía limitada. Las versiones preliminares de AKS reciben cobertura parcial del soporte al cliente en la medida de lo posible. Por lo tanto, estas características no están diseñadas para su uso en producción. Para más información, consulte los siguientes artículos de soporte:

Ejecute el siguiente comando para instalar la extensión de versión preliminar de AKS:

az extension add --name aks-preview

Ejecute el siguiente comando para actualizar a la versión más reciente de la extensión publicada:

az extension update --name aks-preview

Registro de la marca de característica "WasmNodePoolPreview"

Registre la marca de la característica WasmNodePoolPreview con el comando WasmNodePoolPreview, como se muestra en el siguiente ejemplo:

az feature register --namespace "Microsoft.ContainerService" --name "WasmNodePoolPreview"

Tarda unos minutos en que el estado muestre Registrado. Para comprobar el estado de registro se usa el comandoaz feature show:

az feature show --namespace "Microsoft.ContainerService" --name "WasmNodePoolPreview"

Cuando aparezca el estado Registrado, actualice el registro del proveedor de recursos Microsoft.ContainerService mediante el comando az provider register:

az provider register --namespace Microsoft.ContainerService

Limitaciones

  • Actualmente, los grupos de nodos WASI solo admiten aplicaciones Spin, que utilizan el entorno de ejecución Wasmtime y contenedores nativos de Linux.
  • El operador SpinKube no se admite en grupos de nodos Wasm/WASI.
  • Los grupos de nodos Wasm/WASI no se pueden usar para el grupo de nodos del sistema.
  • El tipo de sistema operativo de los grupos de nodos Wasm/WASI debe ser Linux.
  • No se puede usar Azure Portal para crear grupos de nodos Wasm/WASI.

Adición de un grupo de nodos Wasm/WASI a un clúster de AKS existente

Para agregar un grupo de nodos Wasm/WASI, utilice el comando az aks node pool add. En el ejemplo siguiente, se crea un grupo de nodos WASI llamado mywasipool con un nodo.

az aks nodepool add \
    --resource-group myResourceGroup \
    --cluster-name myAKSCluster \
    --name mywasipool \
    --node-count 1 \
    --workload-runtime WasmWasi

Nota

El valor predeterminado del parámetro workload-runtime es ocicontainer. Para crear un grupo de nodos que ejecute cargas de trabajo de contenedor, omita el parámetro workload-runtime o establezca el valor en ocicontainer.

Compruebe el valor de workloadRuntime mediante az aks nodepool show. Por ejemplo:

az aks nodepool show -g myResourceGroup --cluster-name myAKSCluster -n mywasipool --query workloadRuntime

En la salida de ejemplo siguiente, se muestra que mywasipool tiene el tipo de workloadRuntime establecido en WasmWasi.

az aks nodepool show -g myResourceGroup --cluster-name myAKSCluster -n mywasipool --query workloadRuntime
"WasmWasi"

Para configurar kubectl para conectarse a su clúster de Kubernetes, use el comando az aks get-credentials. El siguiente comando:

az aks get-credentials -n myakscluster -g myresourcegroup

Utilice kubectl get nodes para mostrar los nodos del clúster.

kubectl get nodes -o wide
NAME                                 STATUS   ROLES   AGE    VERSION    INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
aks-mywasipool-12456878-vmss000000   Ready    agent   123m   v1.23.12   <WASINODE_IP> <none>        Ubuntu 22.04.1 LTS   5.15.0-1020-azure   containerd://1.5.11+azure-2
aks-nodepool1-12456878-vmss000000    Ready    agent   133m   v1.23.12   <NODE_IP>     <none>        Ubuntu 22.04.1 LTS   5.15.0-1020-azure   containerd://1.5.11+azure-2

Use kubectl describe node para mostrar las etiquetas de un nodo en el grupo de nodos WASI. En el ejemplo siguiente, se muestran los detalles de aks-mywasipool-12456878-vmss000000.

kubectl describe node aks-mywasipool-12456878-vmss000000
Name:               aks-mywasipool-12456878-vmss000000
Roles:              agent
Labels:             agentpool=mywasipool
...
                    kubernetes.azure.com/wasmtime-spin-v2=true
...

Ejecución de una carga de trabajo Wasm/WASI

Cree un archivo llamado spin.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-v2
      containers:
        - name: spin-hello
          image: ghcr.io/spinkube/containerd-shim-spin/examples/spin-rust-hello:v0.15.1
          command: ["/"]
          resources:
            limits:
              cpu: 100m
              memory: 128Mi
            requests:
              cpu: 100m
              memory: 128Mi
---
apiVersion: v1
kind: Service
metadata:
  name: wasm-spin
spec:
  type: LoadBalancer
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  selector:
    app: wasm-spin

Nota

Si quiere obtener más información sobre cómo desarrollar aplicaciones spin, consulte la documentación de spin.

Utilice kubectl para ejecutar la implementación de ejemplo:

kubectl apply -f spin.yaml

Use kubectl get svc para obtener la dirección IP externa del servicio.

kubectl get svc
NAME          TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)        AGE
kubernetes    ClusterIP      10.0.0.1       <none>         443/TCP        10m
wasm-spin     LoadBalancer   10.0.133.247   <EXTERNAL-IP>  80:30725/TCP   2m47s

Acceda a la aplicación de ejemplo en http://EXTERNAL-IP/hello. En el ejemplo siguiente se utiliza curl.

curl http://EXTERNAL-IP/hello
Hello world from Spin!

Nota

Si la solicitud agota el tiempo de espera, use kubectl get pods y kubectl describe pod <POD_NAME> para comprobar el estado del pod. Si el pod no se está ejecutando, use kubectl get rs y kubectl describe rs <REPLICA_SET_NAME> para ver si el conjunto de réplicas tiene problemas para crear un nuevo pod.

Limpieza

Para quitar la implementación de ejemplo, use kubectl delete.

kubectl delete -f spin.yaml

Para quitar el grupo de nodos Wasm/WASI, use az aks nodepool delete.

az aks nodepool delete --name mywasipool -g myresourcegroup --cluster-name myakscluster

Clases en tiempo de ejecución admitidas

La clase RuntimeClass siguiente se admite en grupos de nodos WASI:

  • wasmtime-spin-v2 (alias para wasmtime-spin-v0-15-1)
  • wasmtime-spin-v1 (alias para wasmtime-spin-v0-8-0)
  • wasmtime-spin-v0-15-1
  • wasmtime-spin-v0-8-0
  • wasmtime-spin-v0-5-1
  • wasmtime-spin-v0-3-0

El sufijo -v0-15-1, -v0-8-0, -v0-5-1 y -v0-3-0 son las versiones de la corrección de compatibilidad de número. Puede encontrar las versiones admitidas de la corrección de compatibilidad en la tabla siguiente:

Versión de correcciones de compatibilidad v0.15.1 v0.8 v0.5.1 v0.3.0
Spin v2.6.0 v1.4.1 v1.0.0 v0.4.0