0
votes

Chaîne de connexion qu'un pod doit utiliser pour se connecter à un pod postgresql dans le même cluster?

Je travaille actuellement sur une application qui fonctionnera dans un pod kubernetes. Il est censé se connecter à un pod postgressql, qui est exécuté dans le même cluster.

mais je peux pour une raison quelconque ne pas déduire ce que devrait être la chaîne de connexion

J'ai pour l'instant défini le déploiement postgressql comme tel:

kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: local-deployment
spec:
  replicas: 1
  revisionHistoryLimit: 3
  template:
    metadata:
      labels:
        app: local-pod
    spec:
      containers:
      - name: local-deployment
        image: api:dev5
        imagePullPolicy: Never
        ports:
        - containerPort: 80
        livenessProbe:
          httpGet:
            path: /WeatherForecast
            port: 80
          initialDelaySeconds: 3
          periodSeconds: 3

mais pour une chaîne de connexion

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/core/runtime:3.1-buster-slim AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["pingMe/pingMe.csproj", "pingMe/"]
RUN dotnet restore "pingMe/pingMe.csproj"
COPY . .
WORKDIR "/src/pingMe"
RUN dotnet build "pingMe.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "pingMe.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "pingMe.dll"]

Qui ne semble pas fonctionner?

Quelque chose d'aussi simple que

kubectl get svc postgres-service
NAME               TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
postgres-service   ClusterIP   10.106.91.9   <none>        5432/TCP   74m

résoudre ceci:

dans le cluster déclenche une erreur

    System.Net.NetworkInformation.PingException: An exception occurred during a Ping request.
 ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException (00000005, 0xFFFDFFFF): Name or service not known
   at System.Net.Dns.InternalGetHostByName(String hostName)
   at System.Net.Dns.GetHostAddresses(String hostNameOrAddress)
   at System.Net.NetworkInformation.Ping.GetAddressAndSend(String hostNameOrAddress, Int32 timeout, Byte[] buffer, PingOptions options)
   --- End of inner exception stack trace ---
   at System.Net.NetworkInformation.Ping.GetAddressAndSend(String hostNameOrAddress, Int32 timeout, Byte[] buffer, PingOptions options)
   at System.Net.NetworkInformation.Ping.Send(String hostNameOrAddress, Int32 timeout, Byte[] buffer, PingOptions options)
   at System.Net.NetworkInformation.Ping.Send(String hostNameOrAddress)
   at API.Startup.Configure(IApplicationBuilder app, IWebHostEnvironment env, SchemaContext schemaContext) in /src/API/Startup.cs:line 42
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder)
   at Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__DisplayClass4_0.b__0(IApplicationBuilder builder)
   at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass13_0.b__2(IApplicationBuilder app)
   at Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.<>c__DisplayClass0_0.g__MiddlewareFilterBuilder|0(IApplicationBuilder builder)
   at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.b__0(IApplicationBuilder app)
   at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken)
Unhandled exception. System.Net.NetworkInformation.PingException: An exception occurred during a Ping request.

Service Kubernetes

using System;
using System.Net.NetworkInformation;

    namespace pingMe
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Hello World!");
                Ping ping = new Ping();
                PingReply pingresult = ping.Send("postgres-service.default.svc.cluster.local");
                if (pingresult.Status.ToString() == "Success")
                {
                    Console.WriteLine("I can reach");
                }
            }
        }
    }

Dockerfile:

            x.UseNpgsql("Host=postgres-service:5432;Database=postgres;Username=postgres;Password=postgres"));

Pod local:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: postgres
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
        - name: postgres
          image: postgres:10.4
          imagePullPolicy: "IfNotPresent"
          ports:
            - containerPort: 5432
          volumeMounts:
            - mountPath: /var/lib/postgresql/data
              name: postgredb
      volumes:
        - name: postgredb
          persistentVolumeClaim:
            claimName: postgres-pv-claim   

---
apiVersion: v1
kind: Service
metadata:
  name: postgres-service
  labels:
    app: postgres
spec:
  ports:
   - port: 5432
     targetPort: 5432 
  selector:
   app: postgres


9 commentaires

d'où exécutez-vous le ping? votre terminal? à l'intérieur d'un pod? veuillez également fournir la sortie de kubectl get svc postgres-service


Je lance le ping depuis l'application C #, au démarrage comme première chose. L'application expose le port 80,443,5432 @morgwai


essayez de vous concentrer: où l'application c # est-elle exécutée? de votre studio visuel? depuis votre terminal? à partir d'un pod kubernetes?


le pod local est le pod qui exécute l'API C # qui, au démarrage, envoie une requête ping à l'adresse IP comme première chose


ah, je peux voir le problème maintenant: le ping doit être fait à postgres-service.default.svc.cluster.local , pas à postgres-service.default.svc.cluster.local: 5432 . vous envoyez des pings à un hôte, pas à un port spécifique.


toujours la même sortie @morgwai


Je peux encore voir 5432 au moins dans la question ... avez-vous également reconstruit et repoussé votre image?


@morgwai mis à jour avec le code factice que j'exécute dans le pod


veuillez essayer de cingler simplement postgres-service.default.svc votre cluster peut avoir un domaine différent configuré. si cela n'aide pas, je n'ai plus d'idées pour le moment ...


4 Réponses :


0
votes

tl; dr: postgres-service.default.svc

voir l'explication dans la documentation : default est le nom de votre espace de noms et la partie du domaine du cluster peut être omise.


7 commentaires

alors vous suggérez que j'utilise postgres-service.default.svc: 5432 J'ai essayé de lui envoyer un ping - il semble que je reçoive nom ou service inconnu ?


@kafka d'où lui faites-vous un ping? votre terminal local? cela ne fonctionnera pas bien sûr: ce nom est résolu en cluster IP interne


ou postgres-service.default.svc.cluster.local


J'exécute l'application en tant que pod à l'intérieur du cluster - Je suis donc très surpris de pouvoir lui envoyer un ping ou de me connecter à l'intérieur ...


postgres-service.default.svc.cluster.local est identique à postgres-service.default.svc : comme je l'ai écrit, le domaine du cluster peut être omis


Mise à jour de la question ... avec stacktrace


ressemble au pod kubernetes est incapable de résoudre le nom du service? je trouve ça un peu bizarre



0
votes

Le fichier /etc/resolv.conf à l'intérieur du pod a-t-il l'IP du pod coredns? Cela devrait ressembler à ceci:

nslookup kubernetes.default.svc

Vérifiez également si vous pouvez rechercher un autre service

u@pod$ cat /etc/resolv.conf
nameserver 10.0.0.10 # IP of core dns pod
search default.svc.cluster.local svc.cluster.local cluster.local example.com
options ndots:5

Vérifiez ceci guide sur la façon de déboguer les problèmes avec les services dans kubernetes.


0 commentaires

0
votes

J'ai lu toutes les réponses et tous les commentaires, recommençons pour avoir un nouveau point de vue.

Je travaille actuellement sur une application qui fonctionnera dans un pod kubernetes. Il est censé se connecter à un pod PostgreSql, qui est exécuté dans le même cluster.

Afin de vous aider, nous devons tester chaque étape de votre environnement séparément.

Tout d'abord, une clarification:

  • Les services n'acceptent pas le ping , pour tester le service, vous devez tester le port de l'application qui est exposée. Il est conçu de cette façon.

Étape 1 - Nous devons nous assurer que le service PostgreSQL fonctionne correctement.

Voici mon PostgreSQL déployé:

root@test-shell-845c969686-vh9zh:/# psql --host=postgresql --port=5432 --username=postgres --dbname=postgres  
Password for user postgres: 
psql (10.10 (Ubuntu 10.10-0ubuntu0.18.04.1), server 11.6)
Type "help" for help.

postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
  • Section A - Exécutez un module shell interactif postgresql-client :
root@test-shell-845c969686-h9gz2:/# export my_conn='postgresql://postgres:postgres@postgresql/postgres'
root@test-shell-845c969686-h9gz2:/# pg_isready -d $my_conn
kneeling-scorpion-postgresql:5432 - accepting connections

Si les informations d'identification sont correctes, vous verrez postgres = # . Essayez d'exécuter une commande comme \du:

root@test-shell-845c969686-h9gz2:/# pg_isready --host=postgresql --port=5432 --username=postgres --dbname=postgresql
postgresql:5432 - accepting connections

SI: ça marche! Passez à l ' Étape 2 .

SI NON:

  • Section B - Tester manuellement avec postgresql-client .

Démarrez un seul pod d'exécution d'un shell Ubuntu:

kubectl run -i --tty --rm --image ubuntu test-shell - / bin / bash

Ensuite, installez le client postgresql et nslookup:

apt update && apt install postgresql-client -y && apt install dnsutils -y

Exécutez un nslookup sur le service:

root@test-shell-845c969686-h9gz2:/# nslookup postgresql
Server:         10.0.0.10
Address:        10.0.0.10#53

Name:   postgresql.default.svc.cluster.local
Address: 10.0.8.179

Comme vous pouvez le voir, comme nous travaillons dans le même cluster et namespace , tous les appels effectués à genoux-scorpion-postgresql sont correctement attribués sans spécifier le nom de domaine complet.

Exécutez le pg_isready (rappelez-vous que host est le service, pas le pod) :

postgres=# \du
                                   List of roles
 Role name |                         Attributes                         | Member of 
-----------+------------------------------------------------------------+-----------
 postgres  | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

Vous pouvez testez également en tant que chaîne de connexion:

La structure est export my_conn = 'postgresql: // user: password @ FQDN / DATABASE'

$ kubectl run postgresql-client --rm --tty -i --restart='Never' \
--namespace default \
--image docker.io/bitnami/postgresql:11.6.0-debian-10-r0 \
--env="PGPASSWORD=postgres" \
--command -- psql --host postgres \
-U postgres -d postgres -p 5432
  • Il peut y avoir un problème avec votre PostgreSQL.
  • À ce stade, je vous suggère de réessayer ces tests, mais avec une base de données propre comme celle de Helm Chart: stable / postgresql . Documentation ici . Il est vraiment facile à installer et à supprimer en cas de besoin.

Étape 2 - Se restreindre au client:

À ce stade, je suppose que votre connexion à la base de données fonctionne correctement. Nous devons donc revoir quelques points:

  • Si vous pouvez vous connecter à la base de données à partir d'autres pods, je vous suggère d'essayer de déployer et d'exécuter une instance de votre APP à partir de l'Ubuntu POD que nous avons utilisé dans la section B.

Si cela ne fonctionne toujours pas, vous vous êtes maintenant limité à un problème dans votre application.

Si vous rencontrez des difficultés à reproduire cette solution, laissez je sais dans les commentaires.


0 commentaires

0
votes

Je ne suis pas sûr de comprendre pourquoi .. Mais tout mon asp. L'application conteneurisée Net Core n'a pas pu résoudre le nom du service.

Ceux-ci ont dû être résolus dans une étape distincte en utilisant https: // docs. microsoft.com/en-us/dotnet/api/system.net.dns.gethostname?view=netframework-4.8 , puis transmis en tant qu'adresse IP, résolue à partir de l'étape précédente ..

Je me suis basé sur la façon dont nslookup a répondu, il échoue initialement car l'enregistrement DNS n'est pas mis en cache, puis résout le nom d'hôte car il peut être trouvé via la diffusion.

Je suppose que puisque la recherche initiale de DNS échoue, elle se déclenche et une exception à laquelle la mienne a échoué ...


1 commentaires

Je suis content que vous ayez trouvé votre bogue et que vous l'ayez corrigé !! Veuillez envisager de voter pour les réponses que vous trouvez utiles pour le processus de dépannage, afin que d'autres membres de la communauté puissent être aidés face à des problèmes similaires.