无法从外部登录 Kubernetes 集群内的 Postgres

Rya*_*yan 1 postgresql docker digital-ocean kubernetes

我只想从 K8 集群外部登录到 postgres 数据库。我创建了以下配置:

apiVersion: apps/v1
kind: Deployment
metadata:
    name: postgres 
spec:
    replicas: 1
    selector: 
        matchLabels:
            app: postgres 
    template:
        metadata:
            labels:
                app: postgres 
        spec:
            volumes:
                - name: postgres-storage
                  persistentVolumeClaim: 
                    claimName: database-persistent-volume-claim
            containers:
                - name: postgres 
                  image: postgres
                  volumeMounts:
                    - name: postgres-storage
                      mountPath: /var/lib/postgresql/data
                      subPath: postgres
                  env:
                    - name: POSTGRES_USER
                      value: postgres
                    - name: POSTGRES_PORT
                      value: '5432'
                    - name: POSTGRES_DB
                      value: postgres
                    - name: POSTGRES_PASSWORD
                      value: password
                    - name: POSTGRES_HOST_AUTH_METHOD
                      value: trust
---
apiVersion: v1
kind: Service
metadata:
    name: postgres-srv
spec:
    selector:
        app: postgres
    type: NodePort
    ports:
        - name: postgres
          protocol: TCP
          port: 5432
          targetPort: 5432
Run Code Online (Sandbox Code Playgroud)

配置图:

apiVersion: v1
kind: ConfigMap
metadata:
  name: tcp-services
  namespace: ingress-nginx
data:
  5432: "default/postgres-srv:5432"
Run Code Online (Sandbox Code Playgroud)

我已检查kubectl get services并尝试使用端点和 cluster-ip。这些都不起作用。

psql "postgresql://postgres:password@[ip]:5432/postgres"

Pod 正在运行,日志显示一切就绪。我这里缺少什么吗?我正在数字海洋中运行集群。

编辑:

我希望能够从我的主机访问数据库。(sub.domain.com) 我已经退回了部署,但仍然无法进入。我所针对的唯一配置是上面显示的配置。我的域确实有 A 记录,并且可以通过我的 ingress nginx 服务访问其他公开的 pod

mas*_*eyb 5

您可以通过配置公开 TCP 和 UDP 服务ingress-nginx

例如,将GKEnfs-server-provisioner和图表一起使用:ingress-nginxbitnami/postgresql helm

kubectl create secret generic -n default postgresql \
    --from-literal=postgresql-password=$(openssl rand -base64 32) \
    --from-literal=postgresql-replication-password=$(openssl rand -base64 32)
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install -n default postgres bitnami/postgresql \
    --set global.storageClass=nfs-client \
    --set existingSecret=postgresql
Run Code Online (Sandbox Code Playgroud)

修补ingress-nginx tcp-services ConfigMap

kubectl patch cm -n ingress-nginx tcp-services -p '{"data": {"5432": "default/postgres-postgresql:5432"}}'
Run Code Online (Sandbox Code Playgroud)

Service更新代理端口的控制器(即kubectl edit svc -n ingress-nginx ingress-nginx):

kubectl patch cm -n ingress-nginx tcp-services -p '{"data": {"5432": "default/postgres-postgresql:5432"}}'
Run Code Online (Sandbox Code Playgroud)

注意:如果您编辑部署规范(即) ,您可能需要更新现有的ingress-nginx控制器部署(即 )以包含并退回控制器。argskubectl edit deployments.apps -n ingress-nginx nginx-ingress-controller--tcp-services-configmap=ingress-nginx/tcp-servicesingress-nginxkubectl scale deployment -n ingress-nginx --replicas=0 && kubectl scale deployment -n ingress-nginx --replicas=3

测试连接:

  - name: postgres
    port: 5432
    protocol: TCP
    targetPort: 5432
Run Code Online (Sandbox Code Playgroud)

使用 DNS 解析和 ingress-nginx 代理流量连接到远程 PostgreSQL 数据库

注意:我在Google Cloud DNSA中手动创建了一条记录,以将主机名解析为集群的外部 IP。

更新:除了创建ingress-nginx配置、安装bitnami/postgresql图表等之外,还需要在负载均衡器上禁用“代理协议”以使连接适用于 DigitalOcean 中的部署(postgres否则LOG: invalid length of startup packet将):

通过公共负载均衡器的 Digital Ocean postgres 连接