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
- En el servidor
Bastion, ingresar con credenciales de administración al cluster de Kubernetes, para lo cual vamos a utilizarcluster1:export KUBECONFIG=~/rke2_conn/cluster1/cluster1_kubeconfig.yaml - 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-meshcurl -sSL https://get.ambientmesh.io | bash - - 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 - Revisar el el despliegue se haya realizado de forma correcta;
La salida del comando anterior, debe ser similar a la siguiente:
kubectl get podsNAME 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 - Crear un
Ingress Gatewayy unHTTPRoutepara el ingreso al aplicativo desplegado:kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.25/samples/bookinfo/gateway-api/bookinfo-gateway.yaml - Agregar una
annotate, para configurar el servicio comoClusterIPkubectl annotate gateway bookinfo-gateway networking.istio.io/service-type=ClusterIP --namespace=default - Verificar que el Gateway tenga un Address y se encuentre en estado Programmed:
La salida del comando anterior, debe ser siminar a la siguiente:
kubectl get gatewayNAME CLASS ADDRESS PROGRAMMED AGE bookinfo-gateway istio bookinfo-gateway-istio.default.svc.cluster.local True 42s - 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 - 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:
El resultado, debe ser similar al siguiente:
https://bookinfo-gateway-istio.apps.lab-0.k8s-itm-01.ws.itmlabs.io/productpage
- Agregar el aplicativo Bookinfo en Ambient Mesh, por medio de un Label en el Namespace:
El resultado del comando anterior, debe ser similar al siguiente:
kubectl label namespace default istio.io/dataplane-mode=ambientnamespace/default labeled - Instalar las herramientas de monitoreo y visualización:
kubectl apply -f https://get.ambientmesh.io/monitoring.yaml - 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 - 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:
El resultado, debe ser similar al siguiente:
https://kiali.apps.lab-0.k8s-itm-01.ws.itmlabs.io
- 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 EOFchmod +x curl-loop.sh && ./curl-loop.sh - 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
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