You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 08:27:07