tengo un netcore webapi implementado en kubernetes. Todas las noches a la medianoche necesito llamar a un punto final para realizar algunas operaciones en cada pod, por lo que implementé un cronjob que llama a la API con curl y el método realiza las operaciones requeridas.
apiVersion: batch/v1beta1 kind: CronJob metadata: name: test-cronjob spec: schedule: "0 0 * * *" jobTemplate: spec: template: spec: containers: - name: test-cronjob image: curlimages/curl:7.74.0 imagePullPolicy: IfNotPresent command: - "/bin/sh" - "-ec" - | date; echo "doingOperation" curl POST "serviceName/DailyTask" restartPolicy: OnFailureyPero esto solo llama a un pod, el asignado por mi ingreso. ¿Hay alguna manera de llamar a cada pod contenido en un servicio?
Ese es un comportamiento esperado, ya que cuando hacemos curl en un objeto Service de Kubernetes, se espera que pase las solicitudes solo a uno de los endpoints (IP de los pods). Para lograr lo que necesita, debe escribir un script personalizado que primero obtenga los puntos finales asociados con los servicios y luego llame iterativamente a curl sobre ellos uno por uno.
Nota: La IP de los pods se puede cambiar debido a la recreación del pod, por lo que debe obtener los endpoints asociados con el servicio en cada ejecución del cronjob .
Podría ejecutar kubectl dentro de su trabajo:
kubectl get pods -l mylabel=mylabelvalue \ -o go-template='{{range .items}}{{.status.podIP}}{{"\n"}}{{end}}'Esto devolverá la IP interna de todos los contenedores en la etiqueta específica. Luego puede recorrer las direcciones y ejecutar su comando.
Dado que habilitar Pods con derechos en el API-Server, por ejemplo, para ver los puntos finales del servicio real, es engorroso y presenta un riesgo de seguridad, recomiendo una solución de secuencias de comandos simple aquí.
En primer lugar, instale un servicio sin interfaz para la implementación en cuestión (un servicio con clusterIP=Ninguno). Esto hará que su servidor DNS interno cree varios registros A, cada uno apuntando a una de sus IP de pod.
En segundo lugar, para hacer ping a cada Pod de forma rotativa desde su Cron-Job, emplee un pequeño script de shell como se muestra a continuación (deberá ejecutarlo desde un contenedor con dig and curl instalado):
dig +noall +answer <name-of-headless-service>.<namespace>.svc.cluster.local | awk -F$'\t' '{curl="curl <your-protocol>://"$2":<your-port>/<your-endpoint>"; print curl}' | source /dev/stdin