Docker部署的.NET 6应用无法连接MicroK8s中的PostgreSQL
.NET 6应用无法连接MicroK8s中的PostgreSQL数据库
错误信息
Unhandled exception. Npgsql.NpgsqlException (0x80004005): Failed to connect to 10.152.183.151:5432 ---> System.Net.Sockets.SocketException (111): Connection refused at Npgsql.Internal.NpgsqlConnector.Connect(NpgsqlTimeout timeout) at Npgsql.Internal.NpgsqlConnector.Connect(NpgsqlTimeout timeout) at Npgsql.Internal.NpgsqlConnector.RawOpen(SslMode sslMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken, Boolean isFirstAttempt) at Npgsql.Internal.NpgsqlConnector.<Open>g__OpenCore|215_1(NpgsqlConnector conn, SslMode sslMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken, Boolean isFirstAttempt)
Kubernetes服务信息
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE web-app-service NodePort 10.152.183.40 <none> 80:31069/TCP 23m pgsql-service ClusterIP 10.152.183.151 <none> 5432/TCP 23m
YAML配置文件(Secret值已确认正确)
apiVersion: apps/v1 kind: Deployment metadata: name: web-app-deployment namespace: exo-kubernetes spec: replicas: 1 selector: matchLabels: app: web-app template: metadata: labels: app: web-app spec: containers: - image: my-image:latest name: web-app ports: - containerPort: 80 resources: requests: memory: "64Mi" cpu: "250m" limits: memory: "128Mi" cpu: "500m" --- apiVersion: v1 kind: Service metadata: name: web-app-service namespace: exo-kubernetes spec: selector: app: web-app-deployment type: NodePort ports: - port: 80 targetPort: 80 protocol: TCP --- apiVersion: apps/v1 kind: Deployment metadata: name: pgsql-deployment namespace: exo-kubernetes spec: replicas: 1 selector: matchLabels: app: pgsql template: metadata: labels: app: pgsql spec: containers: - image: postgres:15.3 name: pgsql env: - name: POSTGRES_USER valueFrom: secretKeyRef: name: db-access key: USER - name: POSTGRES_PASSWORD valueFrom: secretKeyRef: name: db-access key: PASSWORD - name: POSTGRES_DB valueFrom: secretKeyRef: name: db-access key: DB_NAME ports: - containerPort: 5432 resources: requests: memory: "512Mi" cpu: "600m" limits: memory: "2Gi" cpu: "1200m" volumeMounts: - mountPath: /var/lib/postgresql/data name: pgsql-vm volumes: - name: pgsql-vm --- apiVersion: v1 kind: Service metadata: name: pgsql-service namespace: exo-kubernetes spec: selector: app: pgsql-deployment ports: - port: 5432 targetPort: 5432 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-app-ing namespace: exo-kubernetes spec: rules: - http: paths: - path: / pathType: Prefix backend: service: name: web-app-service port: number: 80
连接字符串
"DbConnection": "Host=pgsql-service;Port=5432;Database=Kubernetes;UserID=kubernetes;Password=kubernetes;"
解决方案
1. 修复服务Selector匹配错误(核心问题)
你的两个Kubernetes服务都存在Selector与Pod标签不匹配的问题,导致服务无法关联到对应的Pod:
- web-app-service:Selector设置为
app: web-app-deployment,但web-app-deployment的Pod标签是app: web-app,需修改为:spec: selector: app: web-app - pgsql-service:Selector设置为
app: pgsql-deployment,但pgsql-deployment的Pod标签是app: pgsql,需修改为:spec: selector: app: pgsql
修改后重新应用配置:kubectl apply -f your-config-file.yaml -n exo-kubernetes
2. 验证PostgreSQL Pod状态
- 查看Pod运行状态:
kubectl get pods -n exo-kubernetes,确认pgsql的Pod处于Running状态 - 查看Pod启动日志:
kubectl logs <pgsql-pod-name> -n exo-kubernetes,确认PostgreSQL是否成功初始化(日志中出现database system is ready to accept connections表示启动正常)
3. 验证服务与Pod的关联
执行命令检查pgsql-service的端点:kubectl describe service pgsql-service -n exo-kubernetes,查看Endpoints字段是否包含PostgreSQL Pod的IP地址,如果为空说明Selector仍然不匹配。
4. 优化应用启动顺序(可选)
如果PostgreSQL启动较慢,应用可能在数据库就绪前发起连接,可添加就绪探针确保应用仅在数据库可连接后才对外提供服务:
containers: - image: my-image:latest name: web-app # ... 原有配置 readinessProbe: exec: command: ["pg_isready", "-h", "pgsql-service", "-p", "5432", "-U", "kubernetes"] initialDelaySeconds: 10 periodSeconds: 5
5. 确认连接字符串一致性
确保连接字符串中的Database、UserID、Password与Secret中存储的DB_NAME、USER、PASSWORD值完全一致。
内容的提问来源于stack exchange,提问作者Bastian Corbin
相关产品推荐
相关产品推荐

