Cómo habilitar la compresión Brotli en un ingress-nginx

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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *