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
4 Réponses :
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.
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
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.
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:
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 | {}
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:
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
stable / postgresql
. Documentation ici . Il est vraiment facile à installer et à supprimer en cas de besoin. À ce stade, je suppose que votre connexion à la base de données fonctionne correctement. Nous devons donc revoir quelques points:
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.
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é ...
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.
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 ...