Postgres 的 K8s TLS Secret | GKE 和 Google 云 SQL Postgres
K8s TLS Secret for Postgres | GKE & Google Cloud SQL Postgres
我在 Web 服务和远程托管的 Postgres 数据库之间建立 SSL 连接时遇到问题。通过将相同的证书和密钥文件用于 Web 服务,我可以使用 pgAdmin 和 DataGrip 等工具连接到数据库。这些文件是从 Google Cloud Console 中的 Postgres 实例下载的。
问题:
在Spring启动服务时,出现如下错误:
org.postgresql.util.PSQLException: Could not read SSL key file /tls/tls.key
我查看Postgres服务器日志的地方,错误记录为
LOG: could not accept SSL connection: UNEXPECTED_RECORD
设置:
Spring Minikube(本地)上的引导服务 运行 和连接到 Google 云 SQL Postgres 实例的 GKE。
采取的行动:
我已经下载了客户端证书和密钥。我使用下载的客户端证书和密钥创建了一个 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
我想通了,我问错问题了!
Google Cloud SQL 有一个 Postgres 数据库的代理组件。因此,尝试连接传统方式(我试图解决的问题)已经通过实施代理解决了。您无需处理白名单 IP、SSL 证书等,只需启动代理,将其指向 GCP 凭证文件,然后更新您的数据库 uri 以通过本地主机访问。
要设置代理,您可以找到说明here. There is a good example of a k8s deployment file here。
我遇到过的一种情况是 GCP 服务帐户。确保添加 Cloud SQL Client 和 Cloud SQL Editor 角色。我只添加了云 SQL 客户端开始并不断收到 403 错误。
我在 Web 服务和远程托管的 Postgres 数据库之间建立 SSL 连接时遇到问题。通过将相同的证书和密钥文件用于 Web 服务,我可以使用 pgAdmin 和 DataGrip 等工具连接到数据库。这些文件是从 Google Cloud Console 中的 Postgres 实例下载的。
问题:
在Spring启动服务时,出现如下错误:
org.postgresql.util.PSQLException: Could not read SSL key file /tls/tls.key
我查看Postgres服务器日志的地方,错误记录为
LOG: could not accept SSL connection: UNEXPECTED_RECORD
设置:
Spring Minikube(本地)上的引导服务 运行 和连接到 Google 云 SQL Postgres 实例的 GKE。
采取的行动:
我已经下载了客户端证书和密钥。我使用下载的客户端证书和密钥创建了一个 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
我想通了,我问错问题了!
Google Cloud SQL 有一个 Postgres 数据库的代理组件。因此,尝试连接传统方式(我试图解决的问题)已经通过实施代理解决了。您无需处理白名单 IP、SSL 证书等,只需启动代理,将其指向 GCP 凭证文件,然后更新您的数据库 uri 以通过本地主机访问。
要设置代理,您可以找到说明here. There is a good example of a k8s deployment file here。
我遇到过的一种情况是 GCP 服务帐户。确保添加 Cloud SQL Client 和 Cloud SQL Editor 角色。我只添加了云 SQL 客户端开始并不断收到 403 错误。