У меня проблемы с установлением SSL-соединения между веб-службой и удаленно размещенной базой данных Postgres. С теми же файлами сертификатов и ключей, которые используются для веб-службы, я могу подключиться к базе данных с помощью таких инструментов, как pgAdmin и DataGrip. Эти файлы были загружены из экземпляра Postgres в Google Cloud Console.
Проблема:
Во время запуска службы Spring Boot возникает следующая ошибка:
org.postgresql.util.PSQLException: Could not read SSL key file /tls/tls.key
Где я просматриваю логи сервера Postgres, ошибка записывается как
LOG: could not accept SSL connection: UNEXPECTED_RECORD
Установка:
Служба Spring Boot, работающая на Minikube (локальном) и GKE, подключающаяся к экземпляру Google Cloud SQL Postgres.
Выполненные действия:
Я скачал сертификат и ключ клиента. Я создал K8s TLS Secret, используя загруженный клиентский сертификат и ключ. Я также убедился, что файлы можно прочитать с монтирования тома, выполнив следующую команду в конфигурации развертывания k8s:
command: ["bin/sh", "-c", "cat /tls/tls.key"]
Вот URL источника данных, который подается через переменную окружения (DATASOURCE).
"jdbc:postgresql://[Database-Address]:5432/[database]?ssl=true&sslmode=require&sslcert=/tls/tls.crt&sslkey=/tls/tls.key"
Вот yaml развертывания k8s, есть идеи, где я ошибаюсь?
---
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