Автор оригинала: Ali Cheaito.
Кредит: Участник/Pixabay
Развертывание NextCloud с redis и Mariabd на Кубератене облегчают с Kustomize. Найти полный код на Github Отказ
Одним из простых удовольствий жизни является некоторых старых компьютеров со стороны подвала и возвращает их обратно в жизнь, установив свою собственную кластер Kubernetes. Намотание вентиляторов, ненужные мигающие серверные огни, и чрезмерно красочные графики на приборной панели Grafana приносят радость к сердцу.
Хорошо, я признаю, что не так просто настроить Кубернаны, зная очень мало об этом. Но с помощью Интернета и Ранчо Мой кластер с одним узлом находится вверх и работает на сервере Ubuntu, закрепленный NGINX Showering Raspberry Pi.
Было здорово смотреть Кубернаны на работе. Но как только новинка выключена, я не знал, что делать с кластером. Так что же дальше? Как мне получить больше опыта с Куберанетами? Что другие классные вещи, которые я могу сделать с этим? Установка NextCloud казалась хорошим следующим шагом.
Введите NextCloud , облачное хранение с открытым исходным кодом и общее решение для клиент-сервера, которое можно установить на частном сервере. NextCloud — это как личное частное Dropbox с хранилищем, ограниченным только размером жестких дисков хозяина. Но, что более важно, NextCloud имеет разнообразную архитектуру, что делает его великим кандидатом на расширение знаний Кубернетика.
NextCloud предлагает несколько вариантов установки. Тот, который я выбрал здесь, включает в себя следующие компоненты:
- NextCloud Web App (PHP + Apache)
- Mariadb для хранения метаданных
- Cron для повторяющихся задач обслуживания
- Redis для распределенного кэширования
Кроме того, веб-приложение требует постоянного хранения, где он сохранит контент, Cron требует доступа к тому же хранению для обслуживания, а NextCloud необходимо для связи с Mariadb и Redis.
Будучи длинным разработчиком программного обеспечения, структура кода и организация всегда в моей голове. Многие кодирующие проекты начинают маленькие, то, как правило, растут, иногда экспоненциально. Без правильной структуры и инструментов эти проекты становятся кошмаром для управления. Чтобы избежать этой потенциальной проблемы, я решил пойти с Kustomize, Раствор шаблона с открытым исходным кодом Kubernetes.
Хелм является еще одним (более популярным) шаблонным вариантом для Куберанес. Однако требуется некоторая дополнительная настроек и более крутая кривая обучения благодаря его более широкому набору функций, отсюда принятие решения о том, чтобы начать с Kustomize и отсрочки руля обучения, на которые сейчас
С Kustomize манифесты могут быть разделены по-виду, затем сгруппированы в папки по компоненту. С помощью файла root Kustomization создавать развертываемый манифест, становится таким же простым, как запуск одной команды:
kustomize build
В приведенных ниже примерах большинство метаданных и других посторонних деталей опущены для краткости. Они доступны в репо GitHub, упомянутой в конце статьи.
Учитывая зависимости между компонентами, я решил начать с ни одного зависимостей: Redis. Развертывание довольно прост: используйте Redis: Alpine Docker Image для контейнера и выставляют порт 6379.
Redis/Deployment.yaml.
apiVersion: apps/v1 kind: Deployment ... spec: ... template: ... spec: containers: - image: redis:alpine name: redis ports: - containerPort: 6379 ...
И выставляйте его как услугу, которая будет использоваться NextCloud Web App.
Услуги включают открытие контейнера без необходимости непосредственно ссылаться на селектор контейнера или IP-адрес. Другие контейнеры будут ссылаться на Redis на селектор услуг, а не селектор контейнера.
Redis/Service.yaml.
apiVersion: v1 kind: Service ... spec: ports: - port: 6379 ...
Нам также нужен файл Kustomization, чтобы проинструктировать Kustomize использовать совместные проявления. Этот простой список файлов YAML в качестве ресурсов Kustomize:
Kustomization.yaml — это инструкции для Kustomize. Наличие по одному в каждой папке позволяет нам ссылаться на саму папку в качестве ресурса в файле root Kustomization
Redis/Kustomization.yaml.
resources: - deployment.yaml - service.yaml
Мариадб немного более вовлечен. Развертывание начинается с Mariadb: последние с портом 3306 выставлены. NextCloud требует, чтобы несколько аргументов командной строки передаются в базу данных как часть команды запуска. Нам также нужен постоянный том хранения (используя претензию постоянного тома) и учетные данные базы данных (от секрета K8S). Вот что это выглядит:
Mariadb/Deployment.yaml.yaml.
apiVersion: apps/v1 kind: Deployment ... spec: ... template: spec: containers: - name: db image: mariadb:latest ports: - containerPort: 3306 args: - --transaction-isolation=READ-COMMITTED - --binlog-format=ROW - --max-connections=1000 env: - name: MYSQL_DATABASE valueFrom: secretKeyRef: key: MYSQL_DATABASE name: db-secrets ... volumeMounts: - mountPath: /var/lib/mysql name: db-persistent-storage restartPolicy: Always volumes: - name: db-persistent-storage persistentVolumeClaim: claimName: db-pvc
Секреты — это один из способов хранения секретов в Куберане. Не рекомендуется проверять файл Secret.yaml в исходном контроле, поскольку учетные данные не зашифрованы. Лучшее решение будет использовать Герметичные секреты Bitnami Отказ
MariaDB/Secret.yaml.
apiVersion: v1 kind: Secret metadata: name: db-secrets type: Opaque data: MYSQL_DATABASE: bmV4dGNsb3Vk #nextcloud MYSQL_USER: bmV4dGNsb3Vk #nextcloud MYSQL_PASSWORD:MYSQL_ROOT_PASSWORD:
По умолчанию контейнеры Kubernetes получают эфемерное хранилище (это хранение, которое уходит, когда контейнер удален). Чтобы получить постоянное хранение, контейнер может инициировать претензию постоянного тома (или ПВХ) и пусть Kubernetes обеспечивает объем через обработчик хранения (я использую Openebs ).
MariaDB/PVC.YAML.
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: db-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 5Gi
а также Служба, чтобы сделать его легко добраться до веб-приложения:
MariaDB/Service.yaml.
apiVersion: v1 kind: Service ... spec: ports: - port: 3306 selector: component: db
Мы связываем все вместе с файлом Kustomization
Mariadb/Kustomization.yaml.
resources: - secret.yaml - pvc.yaml - deployment.yaml - service.yaml
Наконец, с помощью зависимостей, мы можем решать веб-приложение, и это Cron Sidekick. Развертывание использует NextCloud: Apache Image, ссылается на карту DB-секрета, созданную ранее, и требует постоянного тома (большой, чтобы соответствовать контенту).
NextCloud использует учетные данные базы данных в карте секретов, созданные ранее, чтобы войти в MariaDB, создайте базу данных NextCloud, а затем получить доступ к базе данных для обычных операций
NextCloud/Deployment.yaml.yaml.
apiVersion: apps/v1 kind: Deployment ... spec: ... template: ... spec: containers: - image: nextcloud:apache name: app ports: - containerPort: 80 env: - name: MYSQL_DATABASE valueFrom: secretKeyRef: key: MYSQL_DATABASE name: db-secrets ... volumeMounts: - mountPath: /var/www/html name: app-persistent-storage restartPolicy: Always volumes: - name: app-persistent-storage persistentVolumeClaim: claimName: app-pvc
NextCloud/pvc.yaml.
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: app-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 500Gi
Нам также нужен сервис для упрощения открытия.
NextCloud/Service.yaml.
apiVersion: v1 kind: Service ... spec: ports: - port: 80 selector: component: app
Наконец, будучи точкой входа нашего приложения, пользователи нуждаются в URL-адреса для доступа к нему. Для этого мы создаем проникновение, который указывает на службу приложений NextCloud. Этот конкретный использует Cloud.example.com, поэтому вы должны изменить его перед продолжением.
Вход в проход — это объект Kubernetes, который управляет внешним доступом к кластеру. Хотя стручки внутри кластера могут ссылаться на внутренние IPS и службы друг друга, они, как правило, не доступны из сетей, внешних в Kubernetes без входа входа. Я использую вход по умолчанию NGINX.
NextCloud/Ingress.yaml.
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: ingress namespace: default spec: rules: - host: cloud.example.com http: paths: - backend: serviceName: app servicePort: 80
Затем мы связываем все вместе с простой файлом Kustomization
NextCloud/Kustomization.yaml.
resources: - pvc.yaml - deployment.yaml - service.yaml - ingress.yaml
Окончательный компонент — Cron. Контейнер использует тот же NextCloud: Apache Image и нуждается в доступе к постоянному хранению веб-приложения.
Cron/Deployment.yaml.
apiVersion: apps/v1 kind: Deployment ... spec: ... template: ... spec: containers: - image: nextcloud:apache name: cron command: - /cron.sh volumeMounts: - name: app-persistent-storage mountPath: /var/www/html restartPolicy: Always volumes: - name: app-persistent-storage persistentVolumeClaim: claimName: app-pvc
а также файл кустомизации
Cron/Kustomization.yaml.
resources: - deployment.yaml
Теперь, когда все компоненты готовы к работе, как мы получаем NextCloud посмотреть Mariadb и Redis? Это легко, вид. Установите переменные среды MySQL_HOST и REDIS_HOST на контейнере NextCloud и изображение Docker обнаружит их и настроить приложение автоматически. Но как мы устанавливаем эти значения тогда? С vars конечно!
Мы используем Kustomize «vars», которые позволяют нам установить переменную к ссылке на объект для дальнейшего использования в сборке Kustomize. В Kustomization.yaml в корне нашего проекта мы устанавливаем два варианта на сервисные контейнеры для Mariadb и Redis:
Атрибут «Основы» ссылаются на папки, содержащие файл kustomization.yaml.
Kustomization.yaml.
namespace: nextcloud namePrefix: nextcloud-
commonLabels: app: nextcloud version: "15"
bases: - redis - mariadb - nextcloud - cron
patchesStrategicMerge: - patch.yaml
vars: - name: DB_SERVICE objref: apiVersion: v1 kind: Service name: db - name: REDIS_SERVICE objref: apiVersion: v1 kind: Service name: redis
Затем мы используем патч Kustomize, чтобы установить переменные среды в контейнере приложений NextCloud к значениям, захваченным Vars:
патч.Яамл
apiVersion: apps/v1 kind: Deployment metadata: name: app spec: template: spec: containers: - name: app env: - name: MYSQL_HOST value: $(DB_SERVICE) - name: REDIS_HOST value: $(REDIS_SERVICE)
Вот и все! Мы готовы развернуть.
Благодаря Kustomize, развертывание 15+ Кубернанов — это ветер. В корне папки проекта просто запустите:
kustomize build | kubectl apply -f -
Войдите в RANCHER или используйте KUBECTL, чтобы проверить, когда приложение будет готово, то перейдите к URL-адресу вход, чтобы загрузить NextCloud.
Чтобы быть доступным из Интернета, NextCloud требуется подключение HTTPS. Эта настройка предполагает, что окончание TLS проходит за пределами Rancher и Kubernetes. В моем настроении я использую отдельный компьютер (Raspberry Pi) с nginx и давайте шифровать обрабатывать TLS, затем вперед простой трафик на задний конец ранчо.
Хотите попробовать развертывание на свой кластер? Полный код доступен на Гадость .
Оригинал: «https://www.codementor.io/@alicheaito/deploying-nextcloud-on-kubernetes-with-kustomize-tn78vcz0a»