Skip to content

Ambient Mesh

Introducción

Ambient Mesh es una nueva arquitectura de red para service mesh propuesta inicialmente por el equipo de Istio, diseñada para simplificar la adopción y operación de una malla de servicios.

A diferencia del modelo tradicional de service mesh basado en sidecars (donde cada pod despliega un contenedor adicional para interceptar tráfico), Ambient Mesh ofrece una arquitectura sidecar-less: elimina la necesidad de insertar sidecars en cada pod, moviendo las funciones de red a componentes centralizados en el clúster de Kubernetes.

¿Qué es Ambient Mesh?

Ambient Mesh es un modelo desacoplado de gestión del tráfico de red en Kubernetes que:

  • No requiere sidecars dentro de los pods.
  • Centraliza la lógica de red en nodos del clúster usando componentes como ztunnel y Waypoint Proxies.
  • Ofrece una malla de servicios ligera, menos invasiva y más fácil de operar.
  • Se integra de manera nativa con los entornos de Kubernetes mediante configuraciones dinámicas y etiquetas en los namespaces o workloads.

¿Para qué sirve Ambient Mesh?

Ambient Mesh proporciona capacidades típicas de un service mesh como:

  • Seguridad de red: cifrado de tráfico mTLS de pod a pod.
  • Control de tráfico: redirección, inyección de fallas, balanceo de carga avanzado.
  • Observabilidad: métricas de tráfico, trazabilidad (tracing) y registros de red.
  • Políticas: control de acceso y autorización de tráfico entre servicios.

Todo esto sin la sobrecarga que los sidecars pueden imponer en consumo de CPU, memoria y complejidad operativa.

¿Cuándo debería considerar usar Ambient Mesh?

Deberías considerar Ambient Mesh en situaciones como:

  • Minimizar la sobrecarga de recursos en tu clúster (especialmente importante en ambientes de alta densidad o costos sensibles).
  • Simplificar operaciones en ambientes donde gestionar sidecars es complejo o riesgoso.
  • Adoptar progresivamente un service mesh: puedes aplicar Ambient Mesh de forma gradual solo en ciertas aplicaciones o namespaces.
  • Mejorar la seguridad de la red interna del clúster sin tocar las aplicaciones (sin modificar sus imágenes o configuraciones).
  • En entornos multi-tenant donde quieres tener aislamiento y control del tráfico de red sin modificar los despliegues de cada tenant.

¿Cuál es su relación con Kubernetes?

Ambient Mesh depende directamente de Kubernetes para operar. Se integra profundamente utilizando:

  • Custom Resource Definitions (CRDs) para gestionar su configuración (como Gateway, AuthorizationPolicy, PeerAuthentication, etc.).
  • DaemonSets para desplegar componentes como ztunnel que interceptan tráfico a nivel de nodo.
  • Namespaces y Labels para definir qué workloads deben ser parte de la malla.

En esencia, Ambient Mesh extiende las capacidades nativas de Kubernetes en redes de servicios, pero sin introducir complejidad adicional en los pods o deployments.

Ejercicio de Laboratorio: Instalación de Ambient Mesh y despliegue de aplicación de ejemplo

  1. En el servidor Bastion, ingresar con credenciales de administración al cluster de Kubernetes, para lo cual vamos a utilizar cluster1:
    export KUBECONFIG=~/rke2_conn/cluster1/cluster1_kubeconfig.yaml
    
  2. Crear un directorio de trabajo y ejecutar la instalación de Ambient Mesh de forma rápida, mediante el siguiente Script:
    mkdir ~/ambient-mesh ; cd ~/ambient-mesh
    
    curl -sSL https://get.ambientmesh.io | bash -
    
  3. Desplegar la aplicación de ejemplo Bookinfo para explorar las características de seguridad, observabilidad, control de tráfico y resiliencia en su malla de servicios. Esta aplicación cuenta con cuatro microservicios que trabajan juntos para crear un catálogo de librería en línea. Los microservicios independientes se centran en compartir información básica sobre el libro, las reseñas de los usuarios, las calificaciones y la página del producto.
    kubectl apply -f \
    https://raw.githubusercontent.com/istio/istio/release-1.25/samples/bookinfo/platform/kube/bookinfo.yaml
    
  4. Revisar el el despliegue se haya realizado de forma correcta;
    kubectl get pods
    
    La salida del comando anterior, debe ser similar a la siguiente:
    NAME                             READY   STATUS    RESTARTS   AGE
    details-v1-cf74bb974-nw94k       1/1     Running   0          42s
    productpage-v1-87d54dd59-wl7qf   1/1     Running   0          42s
    ratings-v1-7c4bbf97db-rwkw5      1/1     Running   0          42s
    reviews-v1-5fd6d4f8f8-66j45      1/1     Running   0          42s
    reviews-v2-6f9b55c5db-6ts96      1/1     Running   0          42s
    reviews-v3-7d99fd7978-dm6mx      1/1     Running   0          42s
    
  5. Crear un Ingress Gateway y un HTTPRoute para el ingreso al aplicativo desplegado:
    kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.25/samples/bookinfo/gateway-api/bookinfo-gateway.yaml
    
  6. Agregar una annotate, para configurar el servicio como ClusterIP
    kubectl annotate gateway bookinfo-gateway networking.istio.io/service-type=ClusterIP --namespace=default
    
  7. Verificar que el Gateway tenga un Address y se encuentre en estado Programmed:
    kubectl get gateway
    
    La salida del comando anterior, debe ser siminar a la siguiente:
    NAME               CLASS   ADDRESS                                            PROGRAMMED   AGE
    bookinfo-gateway   istio   bookinfo-gateway-istio.default.svc.cluster.local   True         42s
    
  8. Crear un Ingress para exponer el aplicativo desplegado anteriormente:
    cat <<EOF | kubectl apply -f -
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: bookinfo-ingress
      namespace: default
    spec:
      ingressClassName: nginx
      rules:
      - host: bookinfo-gateway-istio.apps.lab-0.k8s-itm-01.ws.itmlabs.io
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: bookinfo-gateway-istio
                port:
                  number: 80
    EOF
    
  9. Validar el funcionamiento de la URL, puede realizarlo entrando a un navegador web y colocar la siguiente URL, debe asegurarse de utilizar su FQDN de laboratorio:
    https://bookinfo-gateway-istio.apps.lab-0.k8s-itm-01.ws.itmlabs.io/productpage
    
    El resultado, debe ser similar al siguiente: BookInfo App
  10. Agregar el aplicativo Bookinfo en Ambient Mesh, por medio de un Label en el Namespace:
    kubectl label namespace default istio.io/dataplane-mode=ambient
    
    El resultado del comando anterior, debe ser similar al siguiente:
    namespace/default labeled
    
  11. Instalar las herramientas de monitoreo y visualización:
    kubectl apply -f https://get.ambientmesh.io/monitoring.yaml
    
  12. Crear un Ingress para poder acceder a la herramienta Kiali:
    cat <<EOF | kubectl apply -f -
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: kiali-ingress
      namespace: istio-system
    spec:
      ingressClassName: nginx
      tls:
      - hosts:
        - kiali.apps.lab-0.k8s-itm-01.ws.itmlabs.io
        secretName: default-tls-secret
      rules:
      - host: kiali.apps.lab-0.k8s-itm-01.ws.itmlabs.io
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: kiali
                port:
                  number: 20001
    EOF
    
  13. Validar el funcionamiento de la URL de Kiali, puede realizarlo entrando a un navegador web y colocar la siguiente URL, debe asegurar se de utilizar su FQDN de laboratorio:
    https://kiali.apps.lab-0.k8s-itm-01.ws.itmlabs.io
    
    El resultado, debe ser similar al siguiente: Kiali Ambient Mesh
  14. Crear un Script para generar tráfico al aplicativo de ejemplo BookInfo, debe asegurarse de utilizar su FQDN de laboratorio:
    cat <<EOF > curl-loop.sh
    #!/bin/bash
    while true; do
      curl -sk -I https://bookinfo-gateway-istio.apps.lab-0.k8s-itm-01.ws.itmlabs.io/productpage
      sleep 1
    done
    EOF
    
    chmod +x curl-loop.sh && ./curl-loop.sh
    
  15. Verificar la generación de tráfico en la herramienta Kiali.

Limpieza del ambiente

Detener el Script de generación de tráfico en la línea de comandos:

Ctrl+c

Eliminar la herramienta de monitoreo:

kubectl delete -f https://get.ambientmesh.io/monitoring.yaml

Eliminar el Label en en Namespace default:

kubectl label namespace default istio.io/dataplane-mode-

Eliminar el recurso Gateway

kubectl delete -f https://raw.githubusercontent.com/istio/istio/release-1.25/samples/bookinfo/gateway-api/bookinfo-gateway.yaml

Eliminar el aplicativo de ejemplo:

kubectl delete -f https://raw.githubusercontent.com/istio/istio/release-1.25/samples/bookinfo/platform/kube/bookinfo.yaml
Crear el siguiente Script y ejecutarlo:
cat <<'EOF' > uninstall-ambientmesh.sh
#!/usr/bin/env bash
set -euo pipefail

# Desinstalador de Ambient Mesh basado en el instalador oficial

function k() {
  kubectl --context "$CONTEXT" "$@"
}

function main() {
  if ! command -v kubectl >/dev/null 2>&1; then
    echo "kubectl no está instalado. Por favor instálalo primero."
    exit 1
  fi

  # Obtener contexto actual si no se especifica
  CONTEXT=${CONTEXT:-$(kubectl config current-context)}
  AMBIENTMESH_HOST=${AMBIENTMESH_HOST:-"get.ambientmesh.io"}
  BASE_URL="https://${AMBIENTMESH_HOST}"
  GATEWAY_API_MANIFEST_URL="https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.0/standard-install.yaml"

  echo "* Desinstalando Ambient Mesh en el contexto: $CONTEXT"
  echo ""

  echo "  * Eliminando manifiestos Ambient Mesh..."
  k delete -f "${BASE_URL}/yamls/default.yaml" --ignore-not-found || true

  echo "  * Eliminando Gateway API CRDs..."
  k delete -f "${GATEWAY_API_MANIFEST_URL}" --ignore-not-found || true

  echo "  * Eliminando Ingress personalizados..."
  k delete ingress kiali-ingress -n istio-system --ignore-not-found || true
  k delete ingress bookinfo-ingress -n default --ignore-not-found || true

  echo "  * Quitando label del namespace default (si existe)..."
  kubectl label namespace default istio.io/dataplane-mode- --context "$CONTEXT" || true

  echo "  * Eliminando el namespace istio-system..."
  k delete namespace istio-system --ignore-not-found || true

  echo ""
  echo "* Ambient Mesh y recursos relacionados han sido eliminados correctamente."
}
main
EOF
chmod +x uninstall-ambientmesh.sh ; ./uninstall-ambientmesh.sh
cd ~/ ; rm -fR ~/ambient-mesh