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