2
votes

Existe-t-il un moyen de faire un équilibrage de charge entre les pods sur plusieurs nœuds?

J'ai un cluster kubernetes déployé avec rke witch est composé de 3 nœuds dans 3 serveurs différents et dans ces serveurs, il y a 1 pod qui exécute yatsukino / healthereum qui est une modification personnelle de ethereum / client-go: stable. Le problème est que je ne comprends pas comment ajouter une adresse IP externe pour envoyer une requête aux pods qui sont

Mes pods pourraient être dans 3 états:

  1. ils synchronisent la blockchain Ethereum
  2. ils ont redémarré en raison d'un problème de synchronisation
  3. ils sont synchronisés et tout va bien

Je ne veux pas que mon équilibreur de charge transfère les requêtes vers les 2 premiers états, seul le troisième point considère mon pod comme à jour.

J'ai effectué une recherche dans le kubernetes doc mais (peut-être parce que je ne comprends pas bien) je ne trouve que l'équilibrage de charge pour les pods à l'intérieur d'un nœud unique.

Voici mon fichier de déploiement:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: goerli
  name: goerli-deploy
spec:
  replicas: 3
  selector:
    matchLabels:
      app: goerli
  template:
    metadata:
      labels:
        app: goerli
    spec:
      containers:
        - image: yatsukino/healthereum
          name: goerli-geth
          args: ["--goerli", "--datadir", "/app", "--ipcpath", "/root/.ethereum/geth.ipc"]
          env:
          - name: LASTBLOCK
            value: "0"
          - name: FAILCOUNTER
            value: "0"
          ports:
          - containerPort: 30303
            name: geth
          - containerPort: 8545
            name: console
          livenessProbe:
            exec:
              command:
              - /bin/sh
              - /app/health.sh
            initialDelaySeconds: 20
            periodSeconds: 60
          volumeMounts:
          - name: app
            mountPath: /app
      initContainers: 
      - name: healthcheck
        image: ethereum/client-go:stable
        command: ["/bin/sh", "-c", "wget -O /app/health.sh http://my-bash-script && chmod 544 /app/health.sh"]
        volumeMounts:
        - name: app
          mountPath: "/app"
      restartPolicy: Always
      volumes:
      - name: app
        hostPath:
          path: /app/


0 commentaires

3 Réponses :


1
votes

Pour équilibrer la charge et exposer vos pods, vous pouvez utiliser https: // kubernetes. io / docs / concepts / services-networking / service /

et pour vérifier quand un pod est prêt, vous pouvez modifier vos sondes de vivacité et de préparation comme expliqué https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/

pour les sondes, vous voudrez peut-être envisager des actions d'exécution comme l'exécution d'un script qui vérifie ce qui est requis et renvoie 0 ou 1 en fonction de l'état.


5 commentaires

J'écrivais littéralement la même chose haha!


@FrankYuchengGu oui, cela arrive dans les forums ouverts :)


Pour le loadBalancing, j'ai déjà vu ces pages de doc mais je ne comprends pas comment cela fonctionne. Pourquoi le client est-il dans le nœud? Pourquoi y a-t-il toujours un proxy kube? Et où est le service?


Pour la vivacité et la disponibilité, je l'ai déjà fait. J'expliquais juste plus précisément mon idée, mais la question portait simplement sur la façon d'équilibrer la charge. Désolé pour cette confusion!


l'équilibrage de charge est implémenté avec les services in.



3
votes

Les réponses ci-dessus expliquent les concepts, mais sur vos questions sur les services et l'adresse IP externe; vous devez déclarer le service, par exemple;

ip route add 222.0.0.30/32 \
  nexthop via 192.168.0.1 \
  nexthop via 192.168.0.2 \
  nexthop via 192.168.0.3

Le type: LoadBalancer attribuera une adresse externe pour dans le cloud public ou si vous utilisez quelque chose comme metallb . Vérifiez votre adresse avec kubectl get svc goerli . Si l'adresse externe est "en attente", vous avez un problème ...

S'il s'agit de votre propre configuration, vous pouvez utiliser externalIPs pour attribuer votre propre adresse IP externe;

apiVersion: v1
kind: Service
metadata:
  name: goerli
spec:
  selector:
    app: goerli
  ports:
  - port: 8545
  externalIPs:
  - 222.0.0.30

Les externalIPs peuvent être utilisés depuis l'extérieur du cluster mais vous devez acheminer le trafic vers n'importe quel nœud vous-même, par exemple; p >

apiVersion: v1
kind: Service
metadata:
  name: goerli
spec:
  selector:
    app: goerli
  ports:
  - port: 8545
  type: LoadBalancer

En supposant que vos nœuds k8s aient l'ip 192.168.0.x. Cela configurera les routes ECMP vers vos nœuds. Lorsque vous faites une demande depuis l'extérieur du cluster vers 222.0.0.30:8545, les k8s équilibreront la charge entre vos POD prêts .


2 commentaires

Merci ! J'apprécie la réponse claire. Dans le premier cas, il semble que j'ai un problème ... Le statut est en attente. J'ai essayé la deuxième manière alors et l'IP externe mais il est impossible pour moi de cingler l'IP externe ... Des idées? Peut-être à cause de rke?


Vous ne pouvez jamais envoyer une requête ping à un service (externe ou interne) dans k8 car l'écho ICMP n'est pas transmis. Cependant, la connexion TCP fonctionne de toute façon.



0
votes

Lorsqu'un conteneur est démarré, Kubernetes peut être configuré pour attendre un le temps écoulé avant d'effectuer le premier contrôle de l'état de préparation. Après cela, il appelle la sonde périodiquement et agit en fonction du résultat de la sonde de disponibilité. Si un le pod signale qu'il n'est pas prêt, il a été supprimé du service. Si le pod devient alors prêt à nouveau, il est de nouveau ajouté. Contrairement aux sondes de vivacité, si un conteneur échoue au contrôle de disponibilité, il ne sera pas tué ou redémarré. Il s'agit d'une distinction importante entre les sondes de vivacité et de préparation. Les sondes de vie maintiennent les gousses en bonne santé en éliminant les contenants malsains et en les remplaçant les avec de nouveaux, sains, tandis que les sondes de préparation s'assurent que seules les gousses qui sont prêts à répondre aux demandes de les recevoir. Ceci est surtout nécessaire pendant le conteneur démarrer, mais il est également utile après que le conteneur a fonctionné pendant un certain temps.

Je pense que vous pouvez utiliser la sonde pour votre objectif


0 commentaires