首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过K8s侵入连接到PSQL

通过K8s侵入连接到PSQL
EN

Stack Overflow用户
提问于 2022-05-27 04:07:53
回答 1查看 837关注 0票数 1

我有自己的机群,它有一个控制平面和一个工作人员。我试图使用PostgreSQL连接到集群中的psql -h <ingress-url> -p 5432 -U postgres -W,但出现了一个错误:

代码语言:javascript
复制
psql: error: server closed the connection unexpectedly
        This probably means the server terminated abnormally
        before or while processing the request.

curl <ingress-url>的反应如下:

代码语言:javascript
复制
2022-05-27 04:00:50.406 UTC [208] LOG:  invalid length of startup packet

这个响应意味着我的请求已经到达PostgreSQL服务器,但是为什么我不能连接到PostgreSQL服务器呢?

以下是我的资源:

入口:

代码语言:javascript
复制
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: preflight
  labels:
    helm.sh/chart: "preflight"
    helm.sh/version: "0.1.0"
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /
        pathType: Exact
        backend:
          service:
            name: preflight
            port:
              number: 5432

部署:

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: preflight
  labels:
    helm.sh/chart: "preflight"
    helm.sh/version: "0.1.0"
spec:
  replicas: 1
  selector:
    matchLabels:
      helm.sh/chart: "preflight"
      helm.sh/version: "0.1.0"
  template:
    metadata:
      labels:
        helm.sh/chart: "preflight"
        helm.sh/version: "0.1.0"
    spec:
      containers:
      - name: preflight
        image: postgres:14
        env:
        - name: POSTGRES_PASSWORD
          valueFrom:
            configMapKeyRef:
              name: preflight
              key: postgresPassword
        ports:
        - containerPort: 5432

服务:

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: preflight
  labels:
    helm.sh/chart: "preflight"
    helm.sh/version: "0.1.0"
spec:
  type: ClusterIP
  selector:
    helm.sh/chart: "preflight"
    helm.sh/version: "0.1.0"
  ports:
  - port: 5432
    targetPort: 5432

ConfigMap值是POSTGRES_PASSWORD=postgres

EN

回答 1

Stack Overflow用户

发布于 2022-05-27 07:08:46

Nginx入口控制器是一个HTTP代理。您正在尝试通过HTTP路由PGSQL通信,但这根本无法工作。

您需要做的是通过nginx入口控制器公开TCP服务。见此页

简而言之,您需要创建如下所示的configmap:

代码语言:javascript
复制
apiVersion: v1
kind: ConfigMap
metadata:
  name: tcp-services
  namespace: <namespace where you deployed ingress controller>
data:
  5432: "default/preflight:5432"

然后确保您的nginx入口控制器从--tcp-services-configmap=tcp-services标志开始。

最后,确保nginx入口控制器服务(具有== LoadBalancer类型的控制器服务)公开端口5432:

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx
...
spec:
  type: LoadBalancer
  ports:
    ...
    - name: pgsql
      port: 5432
      targetPort: 5432
      protocol: TCP
...

请注意,您的提供者的负载均衡器应该支持TCP后端(大多数应该支持,但值得一提)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72400370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档