Рубрики
Uncategorized

Развертывание NextCloud на Kubernetes с Kustomize

Развертывание NextCloud Kubernetes с Apache, Mariadb, Cron и Redis.

Автор оригинала: Ali Cheaito.

Перейти к профилю 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»