K8s TLS Secret для Postgres | GKE & Google Cloud SQL Postgres - PullRequest
0 голосов
/ 27 апреля 2018

У меня проблемы с установлением 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

1 Ответ

0 голосов
/ 30 апреля 2018

Итак, я понял, я задавал не тот вопрос!

Google Cloud SQL имеет прокси-компонент для базы данных Postgres. Поэтому попытка подключения традиционным способом (проблема, которую я пытался решить) была решена с помощью прокси. Вместо того, чтобы работать с IP-адресами из белого списка, сертификатами SSL и т. Д., Вы просто раскручиваете прокси-сервер, указываете его на файл учетных данных GCP, а затем обновляете свой URI базы данных для доступа через localhost.

Чтобы настроить прокси, вы можете найти направления здесь . Вот хороший пример файла развертывания k8s здесь .

Одна ситуация, с которой я столкнулся, была учетная запись службы GCP. Обязательно добавьте роли Cloud SQL Client и Cloud SQL Editor. Я только добавил Cloud SQL Client для начала и продолжал получать ошибку 403.

...