我在Web服务和远程托管的Postgres数据库之间 Build SSL连接时遇到了麻烦 . 使用与Web服务相同的证书和密钥文件,我可以使用pgAdmin和DataGrip等工具连接到数据库 . 这些文件是从Google Cloud Console中的Postgres实例下载的 .
Issue:
在Spring Boot服务启动时,发生以下错误:
org.postgresql.util.PSQLException: Could not read SSL key file /tls/tls.key
在我查看Postgres服务器日志的地方,错误记录为
LOG: could not accept SSL connection: UNEXPECTED_RECORD
Setup:
在Minikube(本地)上运行的Spring Boot服务和连接到Google Cloud SQL Postgres实例的GKE .
Actions Taken:
我已经下载了客户端证书和密钥 . 我使用下载的客户端证书和密钥创建了K8s TLS Secret . 我还确保通过在k8s部署配置上运行以下命令从卷装入读取文件:
command: ["bin/sh", "-c", "cat /tls/tls.key"]
这是通过环境变量(DATASOURCE)输入的数据源URL .
"jdbc:postgresql://[Database-Address]:5432/[database]?ssl=true&sslmode=require&sslcert=/tls/tls.crt&sslkey=/tls/tls.key"
这是k8s部署yaml,任何想法我哪里出错?
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: {{ template "service.name" . }}
labels:
release: {{ template "release.name" . }}
chart: {{ template "chart.name" . }}
chart-version: {{ template "chart.version" . }}
release: {{ template "service.fullname" . }}
spec:
replicas: {{ $.Values.image.replicaCount }}
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
template:
metadata:
labels:
app: {{ template "service.name" . }}
release: {{ template "release.name" . }}
env: {{ $.Values.environment }}
spec:
imagePullSecrets:
- name: {{ $.Values.image.pullSecretsName }}
containers:
- name: {{ template "service.name" . }}
image: {{ $.Values.image.repo }}:{{ $.Values.image.tag }}
# command: ["bin/sh", "-c", "cat /tls/tls.key"]
imagePullPolicy: {{ $.Values.image.pullPolicy }}
volumeMounts:
- name: tls-cert
mountPath: "/tls"
readOnly: true
ports:
- containerPort: 80
env:
- name: DATASOURCE_URL
valueFrom:
secretKeyRef:
name: service
key: DATASOURCE_URL
- name: DATASOURCE_USER
valueFrom:
secretKeyRef:
name: service
key: DATASOURCE_USER
- name: DATASOURCE_PASSWORD
valueFrom:
secretKeyRef:
name: service
key: DATASOURCE_PASSWORD
volumes:
- name: tls-cert
projected:
sources:
- secret:
name: postgres-tls
items:
- key: tls.crt
path: tls.crt
- key: tls.key
path: tls.key
1 回答
所以我想通了,我问的是错误的问题!
Google Cloud SQL具有Postgres数据库的代理组件 . 因此,尝试连接传统方式(我试图解决的问题)已经通过实现代理来解决 . 您只需启动代理,将其指向GCP凭据文件,然后将数据库uri更新为通过localhost访问,而不是处理白名单IP,SSL证书等 .
要设置代理,您可以找到路线here . 有一个k8s部署文件here的一个很好的例子 .
我遇到过的一种情况是GCP服务帐户 . 确保添加Cloud SQL Client和Cloud SQL Editor角色 . 我只添加了Cloud SQL Client,并继续收到403错误 .