J'ai déployé une application mongo db, Spring Boot BE, Angular dans GKE. Mon service FE est un équilibreur de charge, il doit se connecter à mon BE pour obtenir des données mais j'obtiens une erreur de console dans mon navigateur: GET http: //contactbe.default.svc.cluster.local/contacts net :: ERR_NAME_NOT_RESOLVED . Mon FE doit consommer le point de terminaison / contacts pour obtenir des données. J'utilise le DNS de mon service BE (contactbe.default.svc.cluster.local) dans mon application Angular. C'est mon fichier yml que j'ai utilisé pour créer mon déploiement:
apiVersion: v1 kind: Service metadata: name: mongo labels: run: mongo spec: type: NodePort ports: - port: 27017 targetPort: 27017 protocol: TCP selector: run: mongo --- apiVersion: apps/v1beta1 kind: Deployment metadata: name: mongo spec: template: metadata: labels: run: mongo spec: containers: - name: mongo image: mongo ports: - containerPort: 27017 --- apiVersion: v1 kind: Service metadata: name: contactbe labels: app: contactbe spec: type: NodePort ports: - port: 8181 targetPort: 8181 protocol: TCP selector: app: contactbe --- apiVersion: apps/v1beta1 kind: Deployment metadata: name: contactbe spec: template: metadata: labels: app: contactbe spec: containers: - name: contactbe image: glgelopfalcon/k8s_contactbe:latest ports: - containerPort: 8181 --- apiVersion: apps/v1beta1 # for versions before 1.9.0 use apps/v1beta2 kind: Deployment metadata: name: angular-deployment spec: selector: matchLabels: app: angular replicas: 2 # tells deployment to run 2 pods matching the template template: metadata: labels: app: angular spec: containers: - name: angular image: glgelopfalcon/my-angular-app:latest ports: - containerPort: 80 --- # https://kubernetes.io/docs/concepts/services-networking/service/#defining-a-service kind: Service apiVersion: v1 metadata: name: angular-service spec: selector: app: angular ports: - port: 80 targetPort: 80 protocol: TCP type: LoadBalancer
J'ai beaucoup cherché sur Google mais je n'ai toujours pas trouvé comment résoudre ce problème. J'apprécierais que quelqu'un puisse donner un coup de main.
3 Réponses :
vérifiez que votre équilibreur de charge a ouvert le port 27017 comme demande d'envoi vers le port 27017
Sinon, vous pouvez changer le port du nœud de service sur 80 et le port cible sera le même
Bonjour Harsh, je n'ai pas compris votre suggestion. Pourriez-vous s'il vous plaît donner plus de détails ou des extraits de code à ce sujet? Je suis un débutant en K8S. Merci d'avance.
vérifier le port ouvert sur l'équilibreur de charge
Mongo Db écoute le port 27017. Mon équilibreur de charge utilise le port 80. De plus, mon équilibreur de charge a Port Node Port Target Port Protocol 80 31011 80 TCP
Le numéro de port est manquant dans l'URL. essayez ci-dessous
contactbe.default.svc.cluster.local:8181/contacts
La même erreur apparaît: contactbe.default.svc.cluster.local: 8181 / contacts: 1 Échec du chargement de la ressource: net :: ERR_NAME_NOT_RESOLVED
pouvez-vous frapper l'url directement dans le pod contactbe comme ci-dessous et confirmer le résultat. curl localhost: 8181 / contacts
J'obtiens un résultat avec succès. curl localhost: 8181 / contacts [{"id": "01", "name": "Gerardo", "email": "gag@gmail.com", "phone" : "1111", "lastName": " Lopez"}] root @ contact be-54d479d774-zf5b8: / usr / app # . Mmmm, je suis confus.
Qu'est-ce que ça veut dire? Le pod fonctionne mais pourquoi ne puis-je pas l'obtenir à partir de mon front-end?
Apparaît comme si les pods ne sont pas liés au service. Partager la sortie de 'kubectl get ep'
C'est le résultat de kubectl get ep
: angular-service: 10.48.1.6:80,10.48.2.9:80. contactbe: 10.48.1.4:8181
Pouvez-vous frapper l'adresse IP de l'hôte et le nodeport dans le navigateur et partager la sortie. Ajoutez le résultat à votre question
J'ai trouvé une solution. J'ai changé le type de service de mon backend. Au lieu de ClusterIP, j'utilise un équilibreur de charge, cela fonctionne comme prévu
Si je comprends bien, l'appel est passé de l'application angular-service à l'application contactbe via le service, n'est-ce pas? L'erreur implique un problème DNS. Connectez-vous à l'un des pods angulaires et exécutez la même requête: kubectl exec -it [angular_pod_name] - curl contactbe.default.svc.cluster.local: 8181 / contact . Vous pouvez utiliser wget à la place si angular n'a pas installé curl