Как попасть в postgres в Кубернетес с местным dev minikube - PullRequest
2 голосов
/ 10 апреля 2020

Может кто-нибудь помочь мне? Это мой первый пост здесь, и я действительно рад начать писать здесь и помогать людям, но сначала мне нужна помощь.

Я развернул свою собственную базу данных Postgres на Minikube. Для БД, пароля и имени пользователя я использую секреты.

Данные кодируются с помощью base64

  1. POSTGRES_USER = website_user
  2. POSTGRES_DB = website
  3. POSTGRES_PASSWORD = pass

Я также ввел c в контейнер, чтобы посмотреть, смогу ли я увидеть эти envs, и они там были.

Проблема в том, когда я пытаюсь войти в postgres с psql. После этой команды я проверил ip minikube и набрал правильный пароль (пароль):

pqsl -h 192.168.99.100 -U website_user -p 31315 website

Ошибка

Пароль для пользователя website_user:
psql: FATAL: аутентификация по паролю ошибка для пользователя "website_user"

Также, если я ввожу c в свой модуль:

kubectl exec -it postgres-deployment-744fcdd5f5-7f7vx bash

и пытаюсь войти в postgres, я получаю:

psql -h $(hostname -i) -U website_user -p 5432 website

Ошибка:

Пароль для пользователя website_user:
psql: FATAL: сбой аутентификации по паролю для пользователя "website_user"

Мне не хватает что-то здесь. Я пробовал также ps aux в контейнере, и все, кажется, найти postgres процессы выполняются

kubectl get all

Вывод:

NAME                                       READY   STATUS    RESTARTS   AGE
pod/postgres-deployment-744fcdd5f5-7f7vx   1/1     Running   0          18m

NAME                       TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
service/kubernetes         ClusterIP   10.96.0.1        <none>        443/TCP          19m
service/postgres-service   NodePort    10.109.235.114   <none>        5432:31315/TCP   18m

NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/postgres-deployment   1/1     1            1           18m

NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/postgres-deployment-744fcdd5f5   1         1         1       18m

# Secret store
apiVersion: v1
kind: Secret
metadata:
  name: postgres-credentials
type: Opaque
data:
  POSTGRES_USER: d2Vic2l0ZV91c2VyCg==
  POSTGRES_PASSWORD: cGFzcwo=
  POSTGRES_DB: d2Vic2l0ZQo=


---
# Persistent Volume
apiVersion: v1
kind: PersistentVolume
metadata:
  name: postgres-pv
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /data/postgres-pv


---
# Persistent Volume Claim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: postgres-pvc
  labels:
    type: local
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
  volumeName: postgres-pv

---
# Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres-deployment
spec:
  selector:
    matchLabels:
      app: postgres-container
  template:
    metadata:
      labels:
        app: postgres-container
    spec:
      containers:
        - name: postgres-container
          image: postgres:9.6.6
          env:
            - name: POSTGRES_USER
              valueFrom:
                secretKeyRef:
                  name: postgres-credentials
                  key: POSTGRES_USER

            - name: POSTGRES_DB
              valueFrom:
                secretKeyRef:
                  name: postgres-credentials
                  key: POSTGRES_DB

            - name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: postgres-credentials
                  key: POSTGRES_PASSWORD

          ports:
            - containerPort: 5432
          volumeMounts:
            - mountPath: /var/lib/postgresql/data
              name: postgres-volume-mount
      volumes:
        - name: postgres-volume-mount
          persistentVolumeClaim:
            claimName: postgres-pvc

---
apiVersion: v1
kind: Service
metadata:
  name: postgres-service
spec:
  selector:
    app: postgres-container
  ports:
    - port: 5432
      protocol: TCP
      targetPort: 5432
  type: NodePort

1 Ответ

1 голос
/ 13 апреля 2020

Вы создали все свои значения с помощью:

  • $ echo "value" | base64
  • , которые вместо этого следует использовать: $ echo -n "value" | base64

После официальной справочной страницы echo:

Описание

Вывод STRING (s) на стандартный вывод.

-n = не выводить завершающий символ новой строки

TL; DR : вам нужно отредактировать определение Secret с новым значения:

  • $ echo -n "website_user" | base64
  • $ echo -n "website" | base64
  • $ echo -n "pass" | base64

Вы создали свой Secret с завершающим переводом строки. Пожалуйста, посмотрите на приведенный ниже пример:

  • POSTGRES_USER:
    • $ echo "website_user" | base64
      • вывод: d2Vic2l0ZV91c2VyCg==, который совпадает с вашим
    • $ echo -n "website_user" | base64
      • выход: d2Vic2l0ZV91c2Vy, что является правильным значением
  • POSTGRES_PASSWORD:
    • $ echo "pass" | base64
      • выход: cGFzcwo=, что совпадает с вашим
    • $ echo -n "pass" | base64
      • вывод: cGFzcw==, который является правильным значением
  • POSTGRES_DB:
    • $ echo "website" | base64
      • вывод: d2Vic2l0ZQo=, который совпадает с вашим
    • $ echo -n "website" | base64
      • вывод: d2Vic2l0ZQ==, что является правильным значение

Ваш Secret должен выглядеть так:

apiVersion: v1
kind: Secret
metadata:
  name: postgres-credentials
type: Opaque
data:
  POSTGRES_USER: d2Vic2l0ZV91c2Vy
  POSTGRES_PASSWORD: cGFzcw==
  POSTGRES_DB: d2Vic2l0ZQ==

Если вы создадите его с новым Secret Вы должны иметь возможность подключиться к базе данных:

root@postgres-deployment-64d697868c-njl7q:/# psql -h $(hostname -i) -U website_user -p 5432 website
Password for user website_user: 
psql (9.6.6)
Type "help" for help.

website=# 

Пожалуйста, посмотрите на дополнительные ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...