web-dev-qa-db-fra.com

Kubernetes: Est-il possible de frapper plusieurs pods avec une seule demande dans le cluster Kubernetes

Je veux vider le cache de tous les pods de mon espace-noms Kubernetes. Je souhaite envoyer une requête au noeud final, qui enverra ensuite un appel HTTP à tous les pods de l'espace-noms pour vider le cache. Actuellement, je ne peux utiliser qu'un seul pod avec Kubernetes et je ne contrôle pas le pod qui serait touché.

Même si l'équilibreur de charge est défini sur RR, le fait de frapper les pods en continu (n nombre de fois, n est le nombre total de pods) n'aide pas, d'autres requêtes pouvant s'y insérer.

Le même problème a été discuté ici, mais je n'ai pas pu trouver de solution pour la mise en œuvre: https://github.com/kubernetes/kubernetes/issues/18755

J'essaie d'implémenter la partie du cache d'effacement à l'aide de Hazelcast, dans lequel je vais stocker tout le cache et Hazelcast se charge automatiquement de la mise à jour du cache.

S'il existe une approche alternative à ce problème ou un moyen de configurer les kubernetes pour qu'ils atteignent tous les points finaux pour certaines requêtes spécifiques, le partage ici serait d'une grande aide.

13
Vineeth Chitteti

Si vous avez kubectl dans votre pod et que vous avez accès au serveur api, vous pouvez obtenir toutes les adresses de point final et les transmettre à curl:

kubectl get endpoints <servicename> \
        -o jsonpath="{.subsets[*].addresses[*].ip}" | xargs curl

Alternative sans kubectl dans le pod:

le moyen recommandé d'accéder au serveur api à partir d'un pod consiste à utiliser le proxy kubectl: https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/#accessing-the-api-from- a-pod ceci ajouterait bien entendu au moins les mêmes frais généraux. sinon, vous pouvez directement appeler l’API REST, vous devez fournir le jeton manuellement.

APISERVER=$(kubectl config view --minify | grep server | cut -f 2- -d ":" | tr -d " ")
TOKEN=$(kubectl describe secret $(kubectl get secrets \
     | grep ^default | cut -f1 -d ' ') | grep -E '^token' | cut -f2 -d':' | tr -d " ")

si vous fournissez les variables APISERVER et TOKEN, vous n'avez pas besoin de kubectl dans votre pod. Ainsi, vous n'avez besoin que de curl pour accéder au serveur api et de "jq" pour analyser la sortie json:

curl $APISERVER/api/v1/namespaces/default/endpoints --silent \
     --header "Authorization: Bearer $TOKEN" --insecure \
     | jq -rM ".items[].subsets[].addresses[].ip" | xargs curl

UPDATE (version finale)

APISERVER peut généralement être défini sur kubernetes.default.svc et le jeton doit être disponible dans /var/run/secrets/kubernetes.io/serviceaccount/token dans le pod, il est donc inutile de fournir quoi que ce soit manuellement:

TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token); \
curl https://kubernetes.default.svc/api/v1/namespaces/default/endpoints --silent \
     --header "Authorization: Bearer $TOKEN" --insecure \
     | jq -rM ".items[].subsets[].addresses[].ip" | xargs curl

jq est disponible ici: https://stedolan.github.io/jq/download/ (<4 Mio, mais cela en vaut la peine pour analyser facilement JSON)

5
Markus Dresch

Pour ceux d'entre vous qui cherchent une alternative, j'ai utilisé hazelcast comme auditeur d'événements distribués. Ajout d'un POC similaire sur github: https://github.com/vinrar/HazelcastAsEventListener

1
Vineeth Chitteti