Kubernetes, Pod para generación de tráfico

Muchas veces debemos generar tráfico cuando estamos testeando una aplicación. Hace poco estaba probando el reenvío de logs desde Kubernetes hacia plataformas externas y necesitaba generar dichos logs. Para ello creé un Contenedor que generara llamadas a diferentes URLs usando el comando "curl".

Definiciones

Pensé en un contenedor que aceptara, por variables de entorno, los siguientes parámetros:

  • REQUESTS_COUNT: cantidad de llamadas que debía realizar
  • SECONDS_BETWEEN_REQUESTS: tiempo de espera entre las llamadas
  • URLS: lista de URLs a las cuales llamar

Construcción de la imagen Docker

Simplemente construí una imagen basada en Alpine a la cual fue necesario agregarle los paquetes "curl" y "bash".
El entrypoint fue un simple archivo ".sh" que hace llamadas curl aleatorias basado en la lista de URLs.
#!/bin/bash

requestsCount="${REQUESTS_COUNT:-3}"
sleepSeconds="${SECONDS_BETWEEN_REQUESTS:-0.5}"
IFS=' ' read -r -a arrUrls <<< "$URLS"

for i in $(seq $requestsCount); do
  RND=$(( ( RANDOM % ${#arrUrls[@]} )  ))
  echo "request to: ${arrUrls[$RND]}"
  curl -o /dev/null -s "${arrUrls[$RND]}" --insecure
  sleep $sleepSeconds
done

El Dockerfile quedó así:
FROM alpine:3.16.1

RUN apk add --update --no-cache \
    bash \
    curl && \
    rm -rf /root/.cache /var/cache

COPY entrypoint.sh /home/

WORKDIR /home/

CMD ["/home/entrypoint.sh"]

Cómo usarlo en Kubernetes

Para usarlo simplemente definimos un "Job" en un archivo yaml y agregamos las variables de entorno. En este ejemplo generamos 10 pods que realizarán 100 llamadas cada uno esperando medio segundo entre cada llamada.
apiVersion: batch/v1
kind: Job
metadata:
  name: traffic-generator
spec:
  ttlSecondsAfterFinished: 10
  template:
    metadata:
      labels:
        app: traffic-generator
    spec:
      restartPolicy: Never
      containers:
      - image: bdamian/docker-curl:1.0.1
        name: docker-curl
        env:
        - name: REQUESTS_COUNT
          value: "100"
        - name: SECONDS_BETWEEN_REQUESTS
          value: "0.5"
        - name: URLS
          value: >
            https://host/
            http://host/page
            https://host/page2

  completions: 10
  parallelism: 10

Pueden ver el código del contenedor en mi GitHub: https://github.com/DamianBacalov/docker-curl

Comentarios

Entradas populares de este blog

vRA8 - Definir redes disponibles por Projecto

Aria Automation - crear lista ordenada de key-value en custom forms con Orchestrator

Demo simple de GSLB con AVI