Чтобы разрешить связь с вашим развертыванием 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/