0
votes

Kubettes et Docker: Comment laisser deux services pour communiquer correctement

J'ai deux microservices Java ( caller.jar strong> qui appelle appelé.jar strong>)

Nous pouvons définir le port str STRY> SERVICE HTTP HTTP À travers un ENV-var strong> Callerport em> et l'adresse de service appelé via un env-var appelé em>. appeler utilise deux env-var. strong> p>

Nous devons également définir appelé strud> service env-var appelé em> appelé em> pour définir Le port HTTP spécifique sur lequel appelé Service est à l'écoute des demandes HTTP. P>

Je ne sais pas exactement comment simplement exposer ces variables à partir d'un dockerfile, afin de les définir à l'aide de Kubettes. P> Voici comment j'ai fait les deux dockerfiles: p>

dockerfile de l'appelant strong> p> xxx pré>

dockerfile d'appelé " / strong> p> xxx pré>

avec ceux-ci, j'ai fait deux docker images forts>: p>

  • myAccount / appelant em> strong> li>
  • myAccount / appelé em> strong> li> ul>

    Puis j'ai fabriqué les deux déploiements.YAML afin de laisser les K8s déployer (sur Minikube) les deux microservices à l'aide de répliques et d'albanciers. P>


    de déploiement-caller.yaml strong> p> xxx pré>

    et déploiement-appelé.yaml strong> p> xxx pré>

    Important: strong> Les services individuels fonctionnent bien si appelé singulièrement (comme appeler un point de terminaison HealthCheck) mais, lors de l'appelant le point final impliquant la communication entre les deux services, il y a cette erreur: p>

    java.net.unknownhostexception: appelé p> blockQuote>

    Les gousses sont correctement exécutées et actives, mais je suppose que le problème est la partie de déploiement.YAML dans laquelle je dois définir comment trouver le service pointu, alors ici: P>

    http://caller 
    
    
    kubectl get pods,svc -o wide
    
    NAME                          READY     STATUS    RESTARTS   AGE       IP           NODE       NOMINATED NODE   READINESS GATES
    pod/called-855cc4d89b-4gf97   1/1       Running   0          3m23s     172.17.0.4   minikube   <none>           <none>
    pod/called-855cc4d89b-6268l   1/1       Running   0          3m23s     172.17.0.5   minikube   <none>           <none>
    pod/caller-696956867b-9n7zc   1/1       Running   0          106s      172.17.0.6   minikube   <none>           <none>
    pod/caller-696956867b-djwsn   1/1       Running   0          106s      172.17.0.7   minikube   <none>           <none>
    
    NAME                          TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE       SELECTOR
    service/called-loadbalancer   LoadBalancer   10.99.14.91    <pending>     8081:30161/TCP   171m      app=called
    service/caller-loadbalancer   LoadBalancer   10.107.9.108   <pending>     8080:30078/TCP   65m       app=caller
    service/kubernetes            ClusterIP      10.96.0.1      <none>        443/TCP          177m      <none>
    


8 commentaires

Pouvez-vous montrer kubectl obtenir des pods, svc -o large ?


Bonjour Konstantin, j'ai mis à jour la description. Les pods fonctionnent bien. Aucune erreur dans leur processus d'exécution.


@ALEX MAWASHI Essayez de mettre la valeur: "Appoint-Waldbalancer" avec les citations autour de lui. L'exception suggère que vous perdez la partie après le trait d'union


En réalité, ce n'est pas kubectl obtenir des pods, svc -o large


@Ryandawson avec les citations: java.net.malformedurxception: pas de protocole: appelé-loadbalancer


@Konstantinvustin fait maintenant dans la description


Bien, maintenant, veuillez décrire ce que vous voulez sous peu. Je veux un service-A être capable d'atteindre le service-b ou quelque chose ... c'est trop de texte, mais il n'y a aucun résultat souhaité du tout


@ALEX MAWASHI 'Aucun protocole' suggère que vous manquez le "http: //" au début de votre appel ...


3 Réponses :


4
votes

La réponse courte est que vous n'avez pas besoin de les exposer dans le dockerfile. Vous pouvez définir toutes les variables d'environnement souhaitées lorsque vous démarrez un conteneur et il n'est pas nécessaire d'être spécifié à l'avance dans le DockerFile.

Vous pouvez vérifier cela en démarrant un conteneur à l'aide de 'Docker Run' avec '-E' pour définir env Vars et "-Ilt 'pour obtenir une session interactive. L'écho la valeur de votre VaR env et vous verrez qu'il est défini.

Vous pouvez également obtenir une session de terminal avec l'un des conteneurs de votre POD Kubettes en cours d'exécution avec "kubectl exécu" ( https://kubernettes.io/docs/tasks/debug-application-Cluster/get-shell-running-Container/ ). De là, vous pouvez faire écho aux variables d'environnement de là pour voir qu'ils sont définis. Vous pouvez les voir plus rapidement avec 'Kubectl Décrivez POD' après avoir obtenu le nom de la gousse avec 'Kubectl Obtenir des pods'.

Étant donné que vous rencontrez des problèmes, vous souhaitez également vérifier si vos services fonctionnent correctement. Puisque vous utilisez Minikube, vous pouvez faire "service minikube" pour vérifier qu'elles peuvent être consultées à l'extérieur. Vous voudrez également vérifier l'accès interne - voir Accès à l'extrémité du contrôleur de démarrage à ressort dans Kubettes Pod

Votre approche d'utiliser des noms de service et des ports est valide. Avec un peu de débogage, vous devriez pouvoir le faire fonctionner. Votre configuration est semblable à une illustration que j'ai faite dans https://dzone.com/articles/kubernettes-namespaces -Explensé ainsi en faisant référence à cela pourrait aider (sauf que vous utilisez env Vares directement au lieu de la configuration, mais cela revient à celui-ci).

Je pense que dans l'appelant, vous injecte le mauvais port de l'env VaR - vous mettez le port de l'appelant et non le port de ce qu'il va d'appeler.


1 commentaires

Merci pour la réponse utile, j'ai mis à jour la description. Les gousses sont correctement en cours d'exécution et si j'appelle le chèque de santé des deux, ils fonctionnent bien. Si oui, ils mystiques communiquent, il y a une inconnueHostexception. Donc, il me manque quelque chose dans le fichier YamL du déploiement de l'appelant dans lequel je pointe le service appelé ou l'appelébalancer. Pourriez-vous comprendre à première vue ce que cela peut être, en regardant cette ligne?



1
votes

Pour accéder aux services à l'intérieur des Kubettes, vous devez utiliser ce DNS:


2 commentaires

appelé-loadbalancer.default.svc.cluster.local: 8081 pour être correct


OUI CELA FONCTIONNE! Merci!



1
votes

Tout d'abord - il est tout à fait impossible de comprendre ce que vous voulez. Votre message commence à partir de:

Nous pouvons définir ... p>

Nous devons définir ... p> blockQuote>

personne ici ne sait pas ce que vous voulez faire et cela pourrait être beaucoup plus utile de voir une définition de vous-même que vous attendez. P>

Cela a été dit maintenant, je Demandez à votre question de fond ... p>

caller-loadbalancer
called-loadbalancer


0 commentaires