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
El contenedor está en mi Docker Hub: https://hub.docker.com/repository/docker/bdamian/docker-curl
Comentarios
Publicar un comentario