Impossibile accedere a Postgres all'interno del cluster Kubernetes dall'esterno
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
È 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):