Как выполнить установку MongoDB в Kubernetes

Развертывание приложений в Kubernetes может быть сложным, особенно для приложений с состоянием, таких как MongoDB, в кластере Kubernetes. Как облегчить процесс развертывания? Позвольте Оператору Kubernetes для MongoDB автоматически разворачивать и управлять приложениями с состоянием в вашем кластере Kubernetes.

В этом руководстве вы узнаете, как развернуть MongoDB в Kubernetes с использованием Оператора Kubernetes для MongoDB.

Читайте дальше и начните автоматизировать развертывание ваших приложений в Kubernetes!

Предварительные условия

Этот учебник будет практической демонстрацией. Чтобы следовать за ним, убедитесь, что у вас есть следующие требования:

  • A Kubernetes cluster – This demo uses the Kubernetes cluster v1.23.
  • Kubectl установлен на локальной машине.
  • MongoDB Compass установлен на локальной машине.
  • Git установлен на вашей машине.
  • jq Установлен на локальной машине для разбора JSON.

Создание пространства имен для MongoDB

При развертывании приложений в Kubernetes всегда рекомендуется создать специальное пространство имен для ваших проектов.

Пространства имен упрощают управление ресурсами Kubernetes для администраторов и предотвращают конфликты имен. В то же время создание пространств имен предотвращает неправильное использование ресурсов в среде Kubernetes.

Откройте ваш терминал и выполните нижеуказанную команду kubectl create для создания нового пространства имен (ns) с именем mongodb в вашем кластере Kubernetes.

kubectl create ns mongodb

Теперь выполните нижеуказанную команду kubectl get, чтобы проверить список пространств имен в вашем кластере Kubernetes.

kubectl get ns

Вы увидите новое пространство имен с названием mongodb, доступное на вашем кластере, как показано ниже.

Creating and Verifying the mongodb Namespace

Загрузка оператора Kubernetes для MongoDB

После создания пространства имен пора загрузить оператор Kubernetes для MongoDB. Оператор Kubernetes для MongoDB представляет собой набор операторов Kubernetes. Эти операторы обеспечивают автоматическое развертывание, настройку и управление сообществом MongoDB в среде Kubernetes.

Запустите команду git ниже, чтобы клонировать проект оператора Kubernetes для MongoDB на ваш локальный компьютер.

git clone <https://github.com/mongodb/mongodb-kubernetes-operator.git>

Теперь выполните каждую команду ниже, чтобы изменить ваш текущий рабочий каталог на mongodb-kubernetes-operator и показать (ls) все доступные файлы и каталоги.

# Сменить рабочий каталог на mongodb-kubernetes-operator
cd mongodb-kubernetes-operator/

# Показать файлы и каталоги
ls

Вы увидите подкаталог с именем config внутри проекта ~/mongodb-kubernetes-operator, как показано ниже. Подкаталог config содержит примеры файлов YAML для развертывания MongoDB в Kubernetes.

Downloading mongodb-kubernetes-operator Source Code

Развертывание оператора MongoDB

Теперь, когда ваше пользовательское пространство имен и оператор Kubernetes для MongoDB настроены, вы готовы развернуть оператор MongoDB на ваш кластер Kubernetes. Как? Вы будете использовать конфигурацию внутри каталога config.

Оператор MongoDB управляет жизненным циклом вашего развертывания MongoDB в кластере Kubernetes. Оператор автоматически создает, управляет и масштабирует состояние вашего развертывания MongoDB.

Чтобы развернуть оператор MongoDB, необходимо создать определение пользовательских ресурсов (CRD) Kubernetes и контроллер. CRD Kubernetes расширяем к API Kubernetes, что позволяет создавать пользовательские ресурсы в Kubernetes.

1. Запустите команду kubectl apply ниже, чтобы создать новый CRD Kubernetes для развертывания MongoDB.

Оператор Kubernetes заменяет всю человеческую интеракцию для развертывания приложения в Kubernetes. Оператор – это контроллер pod, который автоматически разворачивает и управляет вашим приложением с сохранением состояния в Kubernetes.

kubectl apply -f config/crd/bases/mongodbcommunity.mongodb.com_mongodbcommunity.yaml
Creating New Kubernetes CRD MongoDB Kubernetes Deployment

2. Затем выполните следующую команду kubectl get, чтобы проверить список доступных crd в вашем Kubernetes.

kubectl get crd/mongodbcommunity.mongodbcommunity.mongodb.com

Ниже вы можете увидеть CRD с именем mongodbcommunity.mongodbcommunity.mongodb.org.

Checking List of CRDs

3. Запустите команду ниже, чтобы создать новый пользовательский Role-Based Access Control (RBAC) для оператора MongoDB, и укажите реализацию RBAC в пространстве имен mongodb.

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

kubectl apply -k config/rbac/ -n mongodb
Deploying RBAC for MongoDB Deployment

4. Теперь выполните каждую команду kubectl ниже, чтобы проверить роль, привязку роли и учетную запись службы для оператора MongoDB.

# Проверка списка ролей
kubectl get role mongodb-kubernetes-operator -n mongodb

# Проверка списка привязок ролей
kubectl get rolebinding mongodb-kubernetes-operator -n mongodb

# Проверка учетной записи службы
kubectl get serviceaccount mongodb-kubernetes-operator -n mongodb

Ниже приведен вывод, показывающий, что роль, привязка роли и учетная запись mongodb-kubernetes-operator созданы в пространстве имен mongodb.

Checking role, rolebinding, and serviceaccount on Kubernetes

5. После завершения проверки выполните следующую команду kubectl, чтобы развернуть оператор MongoDB в пространстве имен mongodb.

Эта команда создает новый под (mongodb-kubernetes-operator) с базовым образом Docker (quay.io/mongodb/mongodb-kubernetes-operator). Этот под будет действовать как контроллер для автоматического развертывания наборов реплик MongoDB на кластере Kubernetes.

kubectl create -f config/manager/manager.yaml -n mongodb

Ниже вы можете увидеть, что развертывание оператора MongoDB создано, но под все еще инициализируется.

Deploying MongoDB Operator to the mongodb Namespace

6. Наконец, выполните следующие команды, чтобы проверить развертывание и поды в пространстве имен mongodb.

# Проверка развертывания в пространстве имен mongodb
kubectl get deployment.apps -n mongodb

# Проверка подов в пространстве имен mongodb
kubectl get pods -n mongodb

Как видно ниже, под оператора MongoDB работает.

Verifying MongoDB Operator Deployment and Pod

Развёртывание набора реплик MongoDB в Kubernetes

После развертывания MongoDB вы развернете ReplicaSet в Kubernetes, чтобы обеспечить высокую доступность и избыточность для вашего развертывания MongoDB. Вы не захотите простоев в вашем развертывании.

Развертывание MongoDB ReplicaSets с использованием оператора Kubernetes MongoDB по умолчанию безопасно благодаря использованию аутентификации SCRAM для пользователей. В то же время вы можете использовать безопасное подключение по TLS для подключений пользователей и приложений и предоставить метрики Prometheus для мониторинга ресурсов.

Связано: Начало работы с мониторингом кластера Kubernetes с помощью Grafana и Prometheus

Внутри каталога config/samples/ вы увидите несколько образцов файлов YAML для развертывания ReplicaSet. Каждый файл может использоваться в различных сценариях развертывания, но файл развертывания ReplicaSet по умолчанию – это mongodb.com_v1_mongodbcommunity_cr.yaml.

1. Отредактируйте файл YAML для вашего развертывания с использованием выбранного вами редактора. В этом демонстрационном варианте используется файл /mongodb.com_v1_hostpath.yaml для локального развертывания. Этот файл YAML находится в каталоге config/samples/arbitrary_statefulset_configuration/.

Если вы развертываете оператор Kubernetes MongoDB на облачных сервисах, таких как GKE и AKS, используйте файл YAML mongodb.com_v1_mongodbcommunity_cr.yaml. Но если вы развертываете локально в Kind или Minikube, вы можете использовать пользовательский файл YAML (arbitrary_statefulset_configuration/mongodb.com_v1_hostpath.yaml), который автоматически создает пользовательские PV и PVC для поддержки MongoDB ReplicaSet.

Ниже измените количество (members) ReplicaSets, которые вы хотите развернуть, в зависимости от вашей среды, но по умолчанию их 3. В этом руководстве количество ReplicaSets установлено на 2.

spec:
  members: 2 # Количество создаваемых реплик
  security:
    authentication:
      modes:
      - SCRAM
  statefulSet:

Замените <your-password-here> своим надежным паролем. Вы будете использовать этот пароль для входа в базу данных MongoDB, и по умолчанию используется аутентификация SCRAM.

Сохраните изменения и закройте редактор, когда будете удовлетворены паролем.

---
apiVersion: v1
kind: Secret
metadata:
  name: my-user-password
type: Opaque
stringData:
  password: <your-password-here> # Установка пароля для администратора MongoDB

2. Затем выполните команду kubectl ниже, чтобы развернуть (apply) набор реплик MongoDB, используя mongodb.com_v1_hostpath.yaml в пространство имен mongodb.

Эта команда создает следующее:

  • A new custom resource (MongoDBCommunity) with the name mdb0 under the mongodbcommunity.mongodb.com/v1 CRD
  • Секреты Kubernetes для хранения паролей пользователей MongoDB. В то же время создаются некоторые PV и PVC с типом hostPath для набора реплик MongoDB.

Развертывание займет некоторое время, в зависимости от размера ReplicaSets для создания и самого кластера Kubernetes.

kubectl apply -f config/samples/arbitrary_statefulset_configuration/mongodb.com_v1_hostpath.yaml -n mongodb
Deploying MongoDB Replica Sets

3. После развертывания выполните каждую команду ниже, чтобы проверить пользовательские ресурсы и поды в пространстве имен mongodb.

# Проверка crd mongodbcommunity
kubectl get mongodbcommunity -n mongodb

# Проверка подов в пространстве имен mongodb
kubectl get pods -n mongodb

Ниже приведен вывод, в котором:

  • Пользовательский ресурс MongoDBCommunity с именем mdb0 работает с MongoDB v4.4.0.
  • Два пода ReplicaSet MongoDB работают с именами mdb0-0 и mdb0-1. Каждый под содержит два разных контейнера: mongod, и mongodb-agent.
Verifying MongoDB ReplicaSet Deployment and Pods

4. Наконец, выполните другую команду kubectl, чтобы проверить pv и pvc в пространстве имен mongodb.

kubectl get pv,pvc -n mongodb

Ниже приведен вывод, в котором отображаются некоторые pv и pvc, используемые подами ReplicaSet MongoDB.

Checking PV and PVC on the mongodb Namespace

Создание нового пользователя и базы данных для развертывания MongoDB

На данный момент вы завершили развертывание оператора MongoDB и ReplicaSets в вашем кластере Kubernetes. Следующий шаг – создать новую базу данных MongoDB и пользователя для вашего приложения.

Вы создадите новый секрет Kubernetes для нового пользователя, отредактируете пользовательский ресурс развертывания ReplicaSet и обновите ReplicaSet в вашем кластере.

1. Создайте новый файл YAML с использованием вашего предпочтительного редактора и заполните следующий секрет Kubernetes. Вы можете назвать файл YAML как вам угодно, но в этом руководстве файл называется new-user.yaml.

Этот файл YAML создает новый секрет Kubernetes с именем myappdata и паролем myapppassword.

---
apiVersion: v1
kind: Secret
metadata:
  name: myappdata # имя метаданных секрета
type: Opaque
stringData:
  password: myapppassword # пароль для нового пользователя

2. Затем выполните команду kubectl ниже, чтобы выполнить конфигурацию new-user.yaml.

Эта команда создает и применяет (apply) новый секрет Kubernetes в ваш кластер и применяет этот секрет к пространству имен mongodb.

kubectl apply -f new-user.yaml -n mongodb
Creating Secret to Kubernetes Cluster

3. Отредактируйте файл YAML конфигурации вашего ReplicaSet CRD (mongodb.com_v1_hostpath.yaml) в каталоге config/samples/arbitrary_statefulset_configuration.

Добавьте следующую конфигурацию в файл mongodb.com_v1_hostpath.yaml, который создает базу данных и пользователя для MongoDB.

Обязательно замените scram-secret-myapp своими собственными учетными данными scram, сохраните изменения в файле и закройте редактор.

    - name: appuser # Новый пользователь appuser
      db: admin # Разрешает аутентификацию в базе данных admin
      passwordSecretRef:
        name: myappdata # Секрет Kubernetes
      roles:
        - name: dbAdmin # Настройка роли dbAdmin
          db: appdb1 # для appdb1
      scramCredentialsSecretName: scram-secret-myapp

4. Теперь выполните нижеследующую команду, чтобы применить внесенные вами изменения в файле mongodb.com_v1_hostpath.yaml на шаге третьем.

kubectl apply -f config/samples/arbitrary_statefulset_configuration/mongodb.com_v1_hostpath.yaml -n mongodb
Creating New MongoDB User and Database on Kubernetes

5. Наконец, выполните каждую из приведенных ниже команд, чтобы создать подробные подключения MongoDB для вашего приложения. Эти команды генерируют подробное подключение к MongoDB для ваших приложений в формате JSON и разбирают вывод с использованием командной строки jq.

Замените mdb0-admin-mongoadmin на ваши данные окружения, следуя этим указаниям:

  • mdb0 – Метаданные имени ресурсов MongoDB.
  • admin – База данных для аутентификации.
  • mongoadmin – Пользователь, с которым будет проводиться аутентификация
# Получение данных аутентификации администратора и подключений
kubectl get secrets mdb0-admin-mongoadmin -n mongodb -o json | jq -r '.data | with_entries(.value |= @base64d)'

# Получение данных аутентификации appuser и подключений
kubectl get secrets mdb0-admin-appuser -n mongodb -o json | jq -r '.data | with_entries(.value |= @base64d)'

Приведенный ниже вывод показывает, что вы можете подключиться к MongoDB с использованием стандартных соединений и соединений standardSrv. Вы также увидите имя пользователя и пароль вашего развертывания MongoDB.

Retrieving Details of MongoDB User and Password, and Connections

Подключение к развертыванию MongoDB

Вы завершили развертывание MongoDB в кластере Kubernetes с использованием оператора Kubernetes MongoDB. Но как вы узнаете, что развертывание работает? Вы проверите подключение вашей локальной базы данных и пользователя к MongoDB внутри кластера Kubernetes.

Для проверки подключения к развертыванию MongoDB используйте перенаправление портов. Перенаправление портов в Kubernetes позволяет создавать перенаправление портов от любого службы Kubernetes к вашему локальному порту.

1. Запустите команду kubectl ниже, чтобы get список сервисов (svc) в пространстве имен mongodb.

kubectl get svc -n mongodb

Ниже вы увидите сервис с именем mdb0-svc, который открывает порт 27017 (порт по умолчанию MongoDB).

Listing Services on the mongodb Namespace

2. Затем выполните следующую команду для создания перенаправления портов в кластере Kubernetes.

Эта команда создает новое перенаправление портов на службу Kubernetes (mdb0-svc) и перенаправляет локальный порт 27017 на порт службы Kubernetes 27017.

kubectl port-forward service/mdb0-svc -n mongodb 27017:27017
Setting up Port-forward

3. Наконец, откройте приложение MongoDB Compass на вашем локальном компьютере, добавьте новое соединение в следующем формате и нажмите Connect, чтобы подключиться к MongoDB.

Измените поля имя пользователя и пароль на вашего пользователя и пароль MongoDB.

# Подключиться как mongoadmin
mongodb://mongoadmin:secretpassword@localhost:27017/admin?ssl=false

# Подключиться как appuser
mongodb://appuser:myapppassword@localhost:27017/admin?ssl=false
Connecting as mongoadmin user to MongoDB
Connecting as appuser to MongoDB

Когда соединение установлено успешно, вы получите следующее окно, которое подтверждает, что развертывание MongoDB в Kubernetes работает правильно.

Для пользователя mongoadmin вы увидите базы данных по умолчанию (local, config и admin).

Verifying Connection to the MongoDB mongoadmin

Для пользователя appuser вы увидите только одну базу данных с привилегиями с именем appdb1.

Verifying Connection to the MongoDB as appuser

Заключение

В ходе этого урока вы узнали, как развернуть MongoDB в кластере Kubernetes с использованием оператора Kubernetes MongoDB. Вы также кратко коснулись базового использования оператора Kubernetes. И на данный момент у вас уже есть достаточные знания о автоматическом развертывании и управлении приложениями в Kubernetes.

Почему бы не настроить соединение TLS в вашем развертывании MongoDB, чтобы воспользоваться этим новым знанием? Соединение TLS обеспечивает безопасность связи между репликами и защищает соединения клиентов или приложений с MongoDB.

Source:
https://adamtheautomator.com/mongodb-kubernetes/