当前位置: 首页 > 知识库问答 >
问题:

无法远程连接到OpenShift部署中的Postgres数据库,但可以通过带有端口转发的本地主机连接

费和惬
2023-03-14

设置摘要

我有一个带三个豆荚的远程Openshift集群。一个为web应用服务的nginx pod,一个为. NET web api服务的. NET pod,以及一个Postgres数据库pod。

问题

我可以把nginx舱连接到。NET pod,并且在发出api请求时没有问题。然而,我无法从。NET pod到Openshift群集中的Postgres pod。我可以从。NET pod的终端,并且能够使用Postgres pod的服务名连接Postgres pod本身(而不是数据库),因此Postgres pod的DNS解析正在工作。使用Openshift的端口转发将流量从我本地机器的localhost:5432转发到我的Postgres Pod的端口5432,我可以在运行。NET API在本地使用连接字符串< code > Host = localhost端口= 5432;Database = postgresUsername = postgresPassword=postgres。只要我连接到本地数据库,我就可以毫无问题地进行查询、插入等操作。所以通过本地主机连接到数据库显然是可行的。但是当在Openshift集群中时,我不能得到。NET pod来连接到Postgres Pod数据库。数据库应该将来自另一个pod的连接视为远程连接,对吗?但是它根本不起作用。postgres日志也没有显示任何关于连接尝试的信息。

我的.NET使用Host=postgres;端口=5432;数据库=postgres;用户名=postgres;密码=postgres。这存储在我的appsettings.json中。这是在我的Startup.cs中读取的。

// (U) add database context
services.AddDbContext<StigContext>(
    options => options.UseNpgsql(Configuration["DbConnectionString"])
);

.NET数据库连接方法,当我在我的机器上通过Openshift的端口转发运行并连接到远程Postgres pod时,这个endpoint返回true。

public IActionResult TestDatabaseConnection()
{          
    try 
    {              
        stigContext.Database.OpenConnection();
        return Ok(stigContext.Database.CanConnect());
    }
    catch (Exception e)
    {
        var error = e.Message + "\n" + e.ToString() + "\n" + e.StackTrace;
        return Ok(error);
    }              
}

Postgres部署和服务,PVC是通过OpenShift Web控制台完成的

apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres
spec:
  html" target="_blank">selector:
    matchLabels:
      app: postgres
  replicas: 1
  template:
    metadata:
      annotations:
          sidecar.istio.io/inject: "true"
          sidecar.istio.io/proxyCPULimit: 200m
          sidecar.istio.io/proxyMemory: 64Mi
          sidecar.istio.io/proxyMemoryLimit: 256Mi
          sidecar.istio.io/rewriteAppHTTPProbers: "true"
      labels:
        app: postgres
        version: v1
    spec:
      containers:
      - name: postgres 
        image: custom-docker-image-for-postgres:latest
        imagePullPolicy: Always
        env:
        - name: POSTGRES_DB
          value: postgres
        - name: POSTGRES_USER
          value: postgres
        - name: POSTGRES_PASSWORD
          value: postgres
        - name: POSTGRES_HOST_AUTH_METHOD
          value: trust
        - name: PGDATA
          value: /var/lib/postgresql/data/mydata
        ports:
        - containerPort: 5432
        volumeMounts:
        - name: postgres-pv-storage
          mountPath: /var/lib/postgresql/data
        resources:
          requests:
            memory: "128Mi"
            cpu: "30m"   
          limits:
            memory: "512Mi"
            cpu: "60m"                     
      volumes:
      - name: postgres-pv-storage
        persistentVolumeClaim:
          claimName: postgres-pv-claim
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: postgres
    service: postgres
  name: postgres
spec:
  ports:
    - name: http
      port: 5432
  selector:
    app: postgres

我在running Postgres pod上运行了几个命令来显示运行配置...

$ postgres -C listen_addresses
*
$ postgres -C hba_file
/var/lib/postgresql/data/mydata/pg_hba.conf
$ cat /var/lib/postgresql/data/mydata/pg_hba.conf
# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
# Allow replication connections from localhost, by a user with the
# replication privilege.
local   replication     all                                     trust
host    replication     all             127.0.0.1/32            trust
host    replication     all             ::1/128                 trust

# warning trust is enabled for all connections
# see https://www.postgresql.org/docs/12/auth-trust.html
host all all all trust
$ postgres -C port
5432

它似乎应该能够通过pod到pod通信进行远程连接,但肯定不能。我不知道问题是什么。我不知道为什么它不起作用。如果需要,我可以提供任何额外的信息。希望这很清楚。任何建议都将不胜感激。

共有2个答案

贲宜春
2023-03-14

在appsettings.json中将主机更改为postgesql服务dns (Postrgres pod的服务名称)。

贺运良
2023-03-14

tdlr:我的postgres服务的服务定义的端口名是“http”而不是“tcp”。名称字段实际上是协议,因此您在此处输入的内容很重要。

可在此处找到解决方案https://github . com/istio/istio/issues/16506 # issue comment-636224246

如果您的部署不使用istio,这可能不是问题。

我的postgres部署的更新服务yml是

apiVersion: v1
kind: Service
metadata:
  labels:
    app: postgres
    service: postgres
  name: postgres
spec:
  ports:
    - name: tcp
      port: 5432
  selector:
    app: postgres
 类似资料:
  • 我已经部署了一个运行在OpenShift Origin上的grpc服务。这是由OpenShift服务支持的。该服务通过OpenShift路由公开。我正在尝试通过一个服务和路线将集装箱港口(50051)映射到8080港的外部世界,从而使这个吊舱可用。 服务试图公开的映像在其Dockerfile中具有: 路线如下: 服务端口:8080/TCP 目标端口:50051 在DeploymentConfig中

  • 我试图在硒环境中设置我的behat测试。现在我从码头工人开始吃硒, 这是我的docker-compose.yml配置: 我得到了我的命令。yml配置: 当我用@JavaScript启动测试时(我想这个启动是selenium env),我得到了错误: 无法打开连接:http POST到http://localhost:4444/wd/hub/session时引发Curl错误,参数:{“desired

  • 我正在尝试通过SSH使用Sequel Pro连接到我的DigitalOcean SSD上的远程MySQL数据库。这是我的设置: 名称:mywebapp MySQL-主机:188.226.150.240 用户:localhost 密码:mysqlpassword 数据库:Rails 端口:3306 SSH主机:mywebapp.com SSH用户:root SSH密钥:~/.ssh/id_rsa S

  • 问题内容: 当我尝试使用连接到Elasticsearch时, 它工作正常。 但是当我运行它时抛出一个错误说 无法连接到本地主机端口9200:连接被拒绝 如何解决这个错误? 问题答案: 默认情况下,它应该绑定到所有本地地址。因此,假设你没有使用防火墙在网络层的问题,唯一的ES设置我能想到是检查并确保其未设置或设置为或或正确的IP地址为您的网络。 更新:根据ES 2.3中的注释,您应该进行设置。

  • 大家好,我是Docker的新手,我想通过在官方网站上学习教程来熟悉Docker。现在我被困在教程的第2部分(你可以在这里查看链接)= 我有示例应用程序代码、Dockerfile和要求。txt与官方教程完全相同 我的Dockerfile是这样的 所有3个文件的文件内容/代码也与教程完全相同。我能够用这个命令构建镜像注册表 一切看起来都很好。现在我有了样本项目图像注册表。 然后,我根据官方教程使用此命

  • 当我尝试使用它工作正常。 但是当我运行它抛出一个错误,表示 连接到localhost端口9200失败:连接拒绝 如何解决此错误?