Impossibile accedere a Postgres all'interno del cluster Kubernetes dall'esterno

Sep 24 2020

Voglio semplicemente accedere a un db postgres dall'esterno del mio cluster K8. Ho creato la seguente configurazione:

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

Mappa di configurazione:

apiVersion: v1
kind: ConfigMap
metadata:
  name: tcp-services
  namespace: ingress-nginx
data:
  5432: "default/postgres-srv:5432"

Ho controllato kubectl get servicese tentato di utilizzare l'endpoint e l'IP del cluster. Nessuno di questi ha funzionato.

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

Il pod è in esecuzione e i log dicono che è tutto pronto. Qualcosa che mi manca qui? Gestisco l'ammasso nell'oceano digitale.

modificare:

Voglio poter accedere al DB dal mio host. (sub.domain.com) Ho rimbalzato le distribuzioni e ancora non riesco a entrare. L'unica configurazione che ho preso di mira è quella mostrata sopra. Possiedo un record A per il mio dominio e posso accedere agli altri pod esposti tramite il mio servizio di ingresso nginx

Risposte

2 masseyb Sep 24 2020 at 17:54

È possibile esporre i servizi TCP e UDP con la ingress-nginxconfigurazione.

Ad esempio, utilizzando GKE con ingress-nginx, nfs-server-provisioner e i grafici:bitnami/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

Patch il ingress-nginx tcp-services ConfigMap:

kubectl patch cm -n ingress-nginx tcp-services -p '{"data": {"5432": "default/postgres-postgresql:5432"}}'

Aggiorna i controller Serviceper la porta proxy (cioè kubectl edit svc -n ingress-nginx ingress-nginx):

  - name: postgres
    port: 5432
    protocol: TCP
    targetPort: 5432

Nota : potrebbe essere necessario aggiornare le ingress-nginxdistribuzioni del controller esistenti args(ad esempio kubectl edit deployments.apps -n ingress-nginx nginx-ingress-controller) per includere --tcp-services-configmap=ingress-nginx/tcp-servicese rimbalzare il ingress-nginxcontroller se si modificano le specifiche di distribuzione (ad esempio kubectl scale deployment -n ingress-nginx --replicas=0 && kubectl scale deployment -n ingress-nginx --replicas=3).

Testare la connessione:

export PGPASSWORD=$(kubectl get secrets -n default postgresql -o jsonpath={.data.postgresql-password} |base64 -d) docker run --rm -it \ -e PGPASSWORD=${PGPASSWORD} \
    --entrypoint psql \
    --network host \
    postgres:13-alpine -U postgres -d postgres -h example.com

Nota : ho creato manualmente un Arecord in Google Cloud DNS per risolvere il nome host nell'IP esterno del cluster.

Aggiornamento : oltre a creare la ingress-nginxconfigurazione, l'installazione del bitnami/postgresqlgrafico, ecc è stato necessario disattivare "Protocollo Proxy" sul Load Balancer per ottenere i collegamenti che lavorano per una distribuzione in DigitalOcean ( postgressarà LOG: invalid length of startup packetaltrimenti):