Развертывание базы данных PostgreSQL с помощью Kubernetes - PullRequest
0 голосов
/ 05 мая 2018

Я смущен, когда речь заходит о развертывании базы данных PostgreSQL моего приложения Django с Kubernetes. Вот как я построил свой файл deploy-definition.yml:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: postgres
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres-container
  template:
    metadata:
      labels:
        app: postgres-container
        tier: backend
    spec:
      containers:
        - name: postgres-container
          image: postgres:9.6.6
          env:
            - name: POSTGRES_USER
              valueFrom:
                secretKeyRef:
                  name: postgres-credentials
                  key: user

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

            - name: POSTGRES_DB
              value: agent_technologies_db
          ports:
            - containerPort: 5432
          volumeMounts:
            - name: postgres-volume-mount
              mountPath: /var/lib/postgresql/data

      volumes:
        - name: postgres-volume-mount
          persistentVolumeClaim:
            claimName: postgres-pvc
        - name: postgres-credentials
          secret:
            secretName: postgres-credentials

Что я не понимаю, так это. Если я укажу (как я это сделал) существующий образ PostgreSQL внутри спецификации объекта Kubernetes Deployment, как мне на самом деле запустить мое приложение? Что мне нужно указать как HOST в моем файле settings.py?

Вот как выглядит мой файл settings.py:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'agent_technologies_db',
        'USER': 'stefan_radonjic',
        'PASSWORD': 'cepajecar995',
        'HOST': 'localhost', 
        'PORT': '',
        }
}

Он построен таким образом, потому что я все еще разрабатываю приложение и пока не хочу развертывать его в кластере Kubernetes. Но когда я это сделаю, что я должен указать для: HOST и PORT? Кроме того, это правильный способ развертывания PostgreSQL в кластере Kubernetes.

Заранее спасибо!

*** ОБНОВЛЕНИЕ ВОПРОСА ****

Как и предполагалось, я создал service.yml:

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

И я обновил свой файл settings.py:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'agent_technologies_db',
        'USER': 'stefan_radonjic',
        'PASSWORD': 'cepajecar995',
        'HOST': 'postgres-service', 
        'PORT': 5432,
        }
}

Но я получаю следующую ошибку:

enter image description here

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

У вас есть 2 дела.

1) Ваше приложение работает внутри кластера kubernetes.

Вам нужно сослаться на свой модуль postgres через service.

apiVersion: v1
kind: Service
metadata:
  labels:
    app: postgres-container
    tier: backend
  name: postgres
spec:
  ports:
  - port: 5432
    protocol: TCP
  selector:
    app: postgres
  sessionAffinity: None
  type: ClusterIP

Затем напишите postgres, когда вам нужно указать свой postgres_host.

2) Ваше приложение работает за пределами кластера kubernetes.

В этом случае вы должны указать способ входа внутрь кластера извне. Или через LoadBalancer, или через Ingress. В этом случае вам также необходимо создать Службу (см. Пункт 1).

enter image description here

Я пишу пример с входом.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-tutorial
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: my_kube.info
    http:
      paths:
      - path: /
        backend:
          serviceName: postgres-container
          servicePort: 5432

my_kube.info (или то, что вы выбираете в качестве имени) должно быть разрешаемо (DNS или написать строку в /etc/hosts).

Если вам нужен менеджер HA postgres, вы можете взглянуть на: http://stolon.io/

0 голосов
/ 06 мая 2018

Чтобы разрешить связь с вашим развертыванием PostreSQL в Kubernetes, вам нужно настроить объект Service. Если ваше приложение Django будет находиться в том же кластере, что и ваше развертывание PostgreSQL, то вам понадобится сервис типа ClusterIP; в противном случае, если ваше приложение Django находится за пределами вашего кластера, вам понадобится сервис типа LoadBalancer или NodePort.

Существует два способа создания сервиса:

YAML

Первый - через файл yaml, который в вашем случае будет выглядеть так:

kind: Service
apiVersion: v1
metadata:
  name: postgres
spec:
  selector:
    app: postgres-container
    tier: backend
  ports:
  - name: postgres
    protocol: TCP
    port: 5432
    targetPort: 5432

Поле .spec.selector определяет цель Service. Этот сервис будет предназначен для контейнеров с метками app=postgres-container и tier=backend. Он выставляет порт 5432 контейнера. В вашей конфигурации Django вы бы указали имя службы как HOST: в данном случае это просто имя postgres. Kubernetes преобразует имя службы в соответствующий IP-адрес модуля и направляет трафик в модуль. Порт будет портом сервиса: 5432.

kubectl expose

Другой способ создания службы - через команду kubectl expose:

kubectl expose deployment/postgres

Эта команда по умолчанию использует службу типа ClusterIP и предоставляет порты, определенные в полях .spec.containers.ports в yaml развертывания.

Дополнительная информация:

https://kubernetes.io/docs/concepts/services-networking/service/

Кроме того, это правильный способ развертывания PostgreSQL в кластере Kubernetes.

Это зависит от нескольких переменных. Планируете ли вы развертывать кластер Postgres? Если это так, вы можете использовать StatefulSet:

StatefulSets полезны для приложений, которым требуется один или несколько следующее.

  • Стабильные, уникальные сетевые идентификаторы.
  • Стабильное, постоянное хранение.
  • Заказано, изящное развертывание и масштабирование.
  • Заказано, изящное удаление и прекращение.
  • Заказанные, автоматические обновляемые обновления.

https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#using-statefulsets

Есть ли у вас кто-то, кто знает о Postgres, который собирается его настроить и поддерживать? Если нет, я бы также порекомендовал вам развернуть управляемый сервер Postgres вне кластера (например, RDS). Вы по-прежнему можете развернуть приложение Django в кластере и подключиться к вашей БД через службу ExternalName.

Причина, по которой я рекомендую это, заключается в том, что управление приложениями с сохранением состояния в кластере Kubernetes может быть сложным. Я не знаком с Postgres, но вот предостерегающий рассказ о запуске Postgres в Kubernetes: https://gravitational.com/blog/running-postgresql-on-kubernetes/

В дополнение к этому, вот несколько примеров, с которыми я столкнулся, которые повлияли на мое решение удалить рабочие нагрузки с состоянием из моего кластера:

Застрявшие тома

Если вы используете тома AWS EBS, тома могут «зависнуть» на узле и не смогут отсоединиться и присоединиться к новому узлу, если ваш модуль БД перенесен на новый узел.

Миграция в новый кластер

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

Подробнее:

Сообщение в блоге K8s о развертывании Postgres с StatefulSets: https://kubernetes.io/blog/2017/02/postgresql-clusters-kubernetes-statefulsets/

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