Introducción
Brotli es un método de compresión desarrollado por Google y lanzado en 2015. En función del escenario, brotli es capaz de conseguir una mejora en la tasa de compresión de entre un 20 y un 30% sobre gzip, que es el método de compresión por defecto.
Configuración del ingress-nginx
Para crear el ingress-nginx en función de nuestro proveedor, podemos seguir la documentación del siguiente enlace:
https://kubernetes.github.io/ingress-nginx/deploy/
La configuración del ingress-nginx puede hacerse a través de los Annotations, con un ConfigMap o con una plantilla personalizada.
En el siguiente enlace podemos comprobar qué parámetros pueden modificarse con cada una de las formas:
https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/
En este caso, para modificar el método de compresión, tendremos que emplear el ConfigMap.
El método de compresión por defecto es gzip, con un nivel de compresión de 1. Para habilitar y configurar la compresión brotli, disponemos de tres parámetros: enable-brotli, brotli-level y brotli-types.
- enable-brotli: true o false. Permite habilitar la compresión brotli.
- brotli-level: nivel de compresión. Puede tomar valores entre 1 y 11, por defecto es 4. A mayor nivel de compresión, más agresivos serán los algoritmos para comprimir los ficheros, consiguiendo menores tamaños, pero a cambio será más costoso computacionalmente.
- brotli-types: tipos MIME que serán comprimidos al vuelo por brotli.
Aplicando los cambios
Ejecutando el siguiente comando, listaremos los ConfigMap del ingress-nginx:
kubectl get cm -l app.kubernetes.io/name=ingress-nginx -A
El parámetro ‘-A’ nos lista los recursos de todos los namespaces, dado que en función del proveedor que estemos usando, el namespace puede variar. La salida del comando sería algo así:
NAMESPACE NAME DATA AGE my-namespace ingress-nginx-configuration 0 14d my-namespace ingress-nginx-tcp-services 0 14d my-namespace ingress-nginx-udp-services 0 14d
El ConfigMap que debemos modificar es ingress-nginx-configuration.
Para ver el contenido actual del ConfigMap, ejecutaremos el siguiente comando:
kubectl get cm ingress-nginx-configuration -n my-namespace -o yaml
En este caso deberemos especificar el namespace donde está desplegado el ingress-nginx.
Podemos editar este ConfigMap de forma directa, pero en este caso crearemos un fichero yaml para luego aplicarlo.
configmap.yaml:
apiVersion: v1 kind: ConfigMap metadata: name: ingress-nginx-configuration data: enable-brotli: "true" brotli-level: "6" brotli-types: "text/xml image/svg+xml application/x-font-ttf image/vnd.microsoft.icon application/x-font-opentype application/json font/eot application/vnd.ms-fontobject application/javascript font/otf application/xml application/xhtml+xml text/javascript application/x-javascript text/plain application/x-font-truetype application/xml+rss image/x-icon font/opentype text/css image/x-win-bitmap"
Nota importante: todos los parámetros del ConfigMap deben ser cadenas de texto y, por lo tanto, deben estar entrecomillados.
Una vez tengamos el fichero configmap.yaml creado, con los valores deseados de los parámetros, lo aplicaremos ejecutaremos el siguiente comando:
kubectl apply -f configmap.yaml -n my-namespace
Tenemos que asegurarnos de aplicar el ConfigMap en el mismo namespace donde tengamos desplegado el ingress-nginx.
Comprobación
Finalmente comprobaremos que hemos aplicado correctamente los cambios, mostrando de nuevo el contenido del ConfigMap de configuración del ingress-nginx:
kubectl get cm ingress-nginx-configuration -n kube-system -o yaml apiVersion: v1 data: brotli-level: "6" brotli-types: text/xml image/svg+xml application/x-font-ttf image/vnd.microsoft.icon application/x-font-opentype application/json font/eot application/vnd.ms-fontobject application/javascript font/otf application/xml application/xhtml+xml text/javascript application/x-javascript text/plain application/x-font-truetype application/xml+rss image/x-icon font/opentype text/css image/x-win-bitmap enable-brotli: "true" kind: ConfigMap metadata: annotations: ...
Con la compresión brotli activada, al realizar una petición a alguna web expuesta a través del ingress-nginx, en la cabeceras de respuesta recibiremos algo como lo siguiente:
¡Y listo!
Esperamos que te haya sido útil este post, no olvides que el equipo DevOps de Geko está a tu disposición. Contáctanos si tienes cualquier duda.