pod 应该用来连接到同一集群中的 postgresql pod 的连接字符串?
Connectionstring that an pod should use to connect to an postgresql pod in same cluster?
我目前正在开发一个将 运行 在 kubernetes pod 中的应用程序。它应该连接到一个 postgressql pod,即同一集群中的 运行。
但出于某种原因我无法推断出连接字符串应该是什么
我现在这样定义 postgressql 部署:
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
但对于连接字符串
x.UseNpgsql("Host=postgres-service:5432;Database=postgres;Username=postgres;Password=postgres"));
哪个好像不行?
像
一样简单的东西
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");
}
}
}
}
解析为:
集群内触发错误
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.
Kubernetes 服务
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
Docker 文件:
#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"]
本地广告连播:
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
tl;博士:postgres-service.default.svc
参见explanation in the docs:default
是你的命名空间名称,集群域部分可以省略。
pod里面的/etc/resolv.conf文件里有coredns pod的IP吗?它应该如下所示:
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
同时检查您是否能够查找任何其他服务
nslookup kubernetes.default.svc
查看此guide,了解如何调试 kubernetes 中的服务问题。
所有的回答和评论我都看完了,让我们重新来过,这样我们才能有一个新的观点。
I am currently working on a application which will be running in a kubernetes pod. It is supposed to connect to a PostgreSql pod, that is ran within the same cluster.
为了帮助您,我们需要分别测试您环境的每个步骤。
首先澄清一下:
- 服务不接受 ping,要测试服务,您必须测试暴露的应用程序端口。它是这样设计的。
第 1 步 - 我们需要确保 PostgreSQL 服务正常运行。
这是我部署的 PostgreSQL:
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/postgresql-0 1/1 Running 0 99m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/postgresql ClusterIP 10.0.8.179 <none> 5432/TCP 99m
service/postgresql-headless ClusterIP None <none> 5432/TCP 99m
service/kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 8d
NAME READY AGE
statefulset.apps/postgresql 1/1 99m
- A 部分 - 运行 一个
postgresql-client
交互式 shell 播客:
$ 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
如果凭据正确,您将看到 postgres=#
。尝试 运行 执行一些命令,例如 \du
:
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
IF:有效!转到步骤 2。
如果不是:
- B 部分 - 使用
postgresql-client
手动测试。
启动 Ubuntu shell:
的单个执行 pod
kubectl run -i --tty --rm --image ubuntu test-shell -- /bin/bash
然后安装postgresql客户端和nslookup:
apt update && apt install postgresql-client -y && apt install dnsutils -y
运行一个nslookup
到服务:
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
如您所见,由于我们在同一个 集群 和 命名空间 中工作,对kneeling-scorpion-postgresql 在没有指定 FQDN 的情况下被正确分配。
运行 pg_isready
(记住 host
是服务,不是 pod):
root@test-shell-845c969686-h9gz2:/# pg_isready --host=postgresql --port=5432 --username=postgres --dbname=postgresql
postgresql:5432 - accepting connections
您也可以作为连接字符串进行测试:
结构为export my_conn='postgresql://user:password@FQDN/DATABASE'
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
最后,让我们像对 postegresql-client
pod 一样再次进行登录连接:
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 | {}
IF:有效!转到步骤 2。
如果不是:
- 您的 PostgreSQL 可能有问题。
- 此时我建议您再次尝试此测试,但要使用干净的数据库,例如来自 Helm Chart 的数据库:
stable/postgresql
。 Documentation Here。在需要时安装和拆卸真的很容易。
第 2 步 - 缩小客户范围:
此时我假设您的数据库连接工作正常。
所以我们必须回顾一些事情:
- 如果您可以从其他 pods 连接到数据库,我建议您尝试从 Ubuntu POD部署和 运行 您的 APP 实例 我们在 B 节中使用了
如果还是不行,那么现在你已经缩小到应用程序内部的问题了。
如果您在重现此解决方案时遇到任何困难,请在评论中告诉我。
我不确定我明白为什么..但是我所有的asp。 Net Core 容器化应用程序无法解析服务名称..
这些问题必须在单独的步骤中使用
https://docs.microsoft.com/en-us/dotnet/api/system.net.dns.gethostname?view=netframework-4.8
, 然后作为 ip 地址传递,从上一步解析..
我基于 nslookup 的响应方式,它最初失败是因为没有缓存 dns 记录,然后解析主机名,因为这可以通过广播找到。
我想由于初始 dns 查找失败,它触发了异常,而我的一直在...
我目前正在开发一个将 运行 在 kubernetes pod 中的应用程序。它应该连接到一个 postgressql pod,即同一集群中的 运行。
但出于某种原因我无法推断出连接字符串应该是什么
我现在这样定义 postgressql 部署:
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
但对于连接字符串
x.UseNpgsql("Host=postgres-service:5432;Database=postgres;Username=postgres;Password=postgres"));
哪个好像不行?
像
一样简单的东西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");
}
}
}
}
解析为:
集群内触发错误
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.
Kubernetes 服务
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
Docker 文件:
#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"]
本地广告连播:
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
tl;博士:postgres-service.default.svc
参见explanation in the docs:default
是你的命名空间名称,集群域部分可以省略。
pod里面的/etc/resolv.conf文件里有coredns pod的IP吗?它应该如下所示:
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
同时检查您是否能够查找任何其他服务
nslookup kubernetes.default.svc
查看此guide,了解如何调试 kubernetes 中的服务问题。
所有的回答和评论我都看完了,让我们重新来过,这样我们才能有一个新的观点。
I am currently working on a application which will be running in a kubernetes pod. It is supposed to connect to a PostgreSql pod, that is ran within the same cluster.
为了帮助您,我们需要分别测试您环境的每个步骤。
首先澄清一下:
- 服务不接受 ping,要测试服务,您必须测试暴露的应用程序端口。它是这样设计的。
第 1 步 - 我们需要确保 PostgreSQL 服务正常运行。
这是我部署的 PostgreSQL:
$ kubectl get all
NAME READY STATUS RESTARTS AGE
pod/postgresql-0 1/1 Running 0 99m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/postgresql ClusterIP 10.0.8.179 <none> 5432/TCP 99m
service/postgresql-headless ClusterIP None <none> 5432/TCP 99m
service/kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 8d
NAME READY AGE
statefulset.apps/postgresql 1/1 99m
- A 部分 - 运行 一个
postgresql-client
交互式 shell 播客:
$ 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
如果凭据正确,您将看到 postgres=#
。尝试 运行 执行一些命令,例如 \du
:
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------------------+-----------
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
IF:有效!转到步骤 2。
如果不是:
- B 部分 - 使用
postgresql-client
手动测试。
启动 Ubuntu shell:
的单个执行 podkubectl run -i --tty --rm --image ubuntu test-shell -- /bin/bash
然后安装postgresql客户端和nslookup:
apt update && apt install postgresql-client -y && apt install dnsutils -y
运行一个nslookup
到服务:
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
如您所见,由于我们在同一个 集群 和 命名空间 中工作,对kneeling-scorpion-postgresql 在没有指定 FQDN 的情况下被正确分配。
运行 pg_isready
(记住 host
是服务,不是 pod):
root@test-shell-845c969686-h9gz2:/# pg_isready --host=postgresql --port=5432 --username=postgres --dbname=postgresql
postgresql:5432 - accepting connections
您也可以作为连接字符串进行测试:
结构为export my_conn='postgresql://user:password@FQDN/DATABASE'
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
最后,让我们像对 postegresql-client
pod 一样再次进行登录连接:
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 | {}
IF:有效!转到步骤 2。
如果不是:
- 您的 PostgreSQL 可能有问题。
- 此时我建议您再次尝试此测试,但要使用干净的数据库,例如来自 Helm Chart 的数据库:
stable/postgresql
。 Documentation Here。在需要时安装和拆卸真的很容易。
第 2 步 - 缩小客户范围:
此时我假设您的数据库连接工作正常。 所以我们必须回顾一些事情:
- 如果您可以从其他 pods 连接到数据库,我建议您尝试从 Ubuntu POD部署和 运行 您的 APP 实例 我们在 B 节中使用了
如果还是不行,那么现在你已经缩小到应用程序内部的问题了。
如果您在重现此解决方案时遇到任何困难,请在评论中告诉我。
我不确定我明白为什么..但是我所有的asp。 Net Core 容器化应用程序无法解析服务名称..
这些问题必须在单独的步骤中使用 https://docs.microsoft.com/en-us/dotnet/api/system.net.dns.gethostname?view=netframework-4.8 , 然后作为 ip 地址传递,从上一步解析..
我基于 nslookup 的响应方式,它最初失败是因为没有缓存 dns 记录,然后解析主机名,因为这可以通过广播找到。
我想由于初始 dns 查找失败,它触发了异常,而我的一直在...