×

7.4.1. Развёртывание контейнера Nextcloud в DevSpace

 
В этом видео показано, как в панели управления Cloupard создать изолированное рабочее пространство с помощью сервиса DevSpace и развернуть внутри него кластер Kubernetes и как использовать созданный кластер для развёртывания реального web приложения. В качестве приложения будет использован Nextcloud — популярная платформа для хранения файлов и совместной работы.
DevSpace предоставляет удобную среду для разработки, тестирования и демонстрации приложений. Каждое пространство изолировано и может иметь собственные ресурсы — CPU, память и сетевые настройки.
В этом видео демонстрируются следующие шаги:
  • создание нового пространства DevSpace
  • выбор пользователя и выделение ресурсов
  • запуск Kubernetes-кластера внутри созданного пространства и установка необходимых компонентов для публикации приложений:
  • cert-manager — для автоматического получения TLS-сертификатов
  • NGINX Ingress Controller — для публикации сервисов во внешний интернет
После выполнения этих шагов DevSpace превращается в полноценную среду для запуска приложений в Kubernetes.
Далее мы покажем, как использовать созданный кластер для развёртывания реального приложения. Для этого мы:
  • создадим необходимые Kubernetes-ресурсы
  • запустим контейнер Nextcloud
  • подключим постоянное хранилище
  • опубликуем приложение через Ingress
  • автоматически получим HTTPS-сертификат
В результате приложение будет доступно из интернета по защищённому HTTPS-адресу.
 
ПОШАГОВЫЙ РАЗБОР МАНИФЕСТОВ
 
Для деплоя приложения мы используем декларативный подход т.е. мы передаём системе файлы с описанием необходимых нам ресурсов и их настроек (манифесты), а DevSpace приводит облако к желаемому состоянию. Ниже представлен детальный анализ каждого манифеста в порядке их применения.
ingress-nginx-controller-service.yaml — Внешняя точка входа (LoadBalancer)
apiVersion: v1
kind: Service
metadata:
  name: ingress-nginx-controller
  namespace: cozy-ingress-nginx
spec:
  type: LoadBalancer
  selector:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
  ports:
    - name: http
      port: 80
      targetPort: 80
    - name: https
      port: 443
      targetPort: 443
 
Этот сервис типа LoadBalancer связывает Ingress-контроллер с публичной сетью Cloupard. Он запрашивает внешний IP-адрес и открывает порты 80 и 443, являясь первым звеном в цепочке доставки трафика от пользователя к приложению. После успешного создания сервиса, можно узнать внешний IP адрес, который был им получен.
get svc -n cozy-ingress-nginx
 
Полученный внешний IP потребуется далее, для настройки доменного имени, по которому будет отвечать приложение Nextcloud. Для упрощения здесь мы использовали сервис быстрого преобразования доменных имён в IP - https://sslip.io/ однако в нашем примере также можно использовать и обычное доменное имя, которое нужно настроить на полученный внешний IP т.е. создать соответствующую А-запись.
clusterissuer-letsencrypt-prod.yaml — Автоматизация TLS через ACME
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    email: ima43306@gmail.com
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      name: letsencrypt-prod-account-key
    solvers:
      - http01:
          ingress:
            ingressClassName: nginx
 
ClusterIssuer — глобальный ресурс для взаимодействия с Let's Encrypt. Он настраивает автоматическое подтверждение владения доменом по протоколу ACME (метод http01). Это полностью избавляет инженера от ручного обновления сертификатов раз в 90 дней.
00-namespace.yaml — Изоляция ресурсов
apiVersion: v1
kind: Namespace
metadata:
  name: nextcloud
apiVersion: v1
kind: Namespace
metadata:
  name: nextcloud
 
Создание Namespace — это первый шаг в организации иерархии кластера. Данный манифест определяет логическое пространство имен nextcloud, которое позволяет изолировать ресурсы приложения, ограничивать область действия политик безопасности и квот, а также избегать коллизий имен между различными проектами.
01-secrets.yaml — Управление конфиденциальными данными
apiVersion: v1
kind: Secret
metadata:
  name: nextcloud-secrets
  namespace: nextcloud
type: Opaque
stringData:
  # Change these before production use.
  NEXTCLOUD_ADMIN_USER: admin
  NEXTCLOUD_ADMIN_PASSWORD: "StrongPassword123!"
 
Манифест типа Secret используется для безопасного хранения чувствительной информации. Мы используем тип Opaque и поле stringData, которое позволяет передавать значения в открытом виде (Kubernetes сам закодирует их в base64). Это исключает хранение паролей в коде, что соответствует принципам The Twelve-Factor App.
02-nextcloud-pvc.yaml — Абстракция дискового хранилища
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nextcloud-data
  namespace: nextcloud
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 50Gi
 
Nextcloud является приложением с состоянием (stateful).
PersistentVolumeClaim (PVC) — это запрос на выделение тома в облаке. Мы запрашиваем 50 ГБ с режимом доступа ReadWriteOnce, что гарантирует сохранность данных в директории /var/www/html даже при полной пересоздании подов.
20-nextcloud-deployment.yaml — Описание рабочей нагрузки
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nextcloud
  namespace: nextcloud
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nextcloud
  template:
    metadata:
      labels:
        app: nextcloud
    spec:
      containers:
        - name: nextcloud
          image: nextcloud:31-apache
          imagePullPolicy: IfNotPresent
          env:
            - name: NEXTCLOUD_ADMIN_USER
              valueFrom:
                secretKeyRef:
                  name: nextcloud-secrets
                  key: NEXTCLOUD_ADMIN_USER
            - name: NEXTCLOUD_ADMIN_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: nextcloud-secrets
                  key: NEXTCLOUD_ADMIN_PASSWORD
            - name: NEXTCLOUD_TRUSTED_DOMAINS
              value: nc.128.0.67.226.nip.io
            - name: OVERWRITEPROTOCOL
              value: https
          ports:
            - containerPort: 80
              name: http
          resources:
            requests:
              cpu: 500m
              memory: 1Gi
            limits:
              cpu: "2"
              memory: 4Gi
          volumeMounts:
            - name: nextcloud-data
              mountPath: /var/www/html
      volumes:
        - name: nextcloud-data
          persistentVolumeClaim:
            claimName: nextcloud-data
 
Deployment управляет жизненным циклом подов. Используется образ nextcloud:31-apache и стратегия Recreate (необходима для корректного переподключения RWO-диска). В блоке resources заданы лимиты и запросы (requests/limits) для CPU и RAM, что обеспечивает предсказуемое поведение приложения и стабильность ноды.
21-nextcloud-service.yaml — Внутренняя балансировка трафика 
apiVersion: v1
kind: Service
metadata:
  name: nextcloud
  namespace: nextcloud
spec:
  selector:
    app: nextcloud
  ports:
    - name: http
      port: 80
      targetPort: 80
 
Ресурс Service обеспечивает стабильный внутренний IP-адрес и DNS-имя для группы подов. Он работает на уровне L4 и перенаправляет трафик на порт 80 контейнера. Это фундаментальный механизм service discovery, делающий систему устойчивой к динамическим изменениям IP-адресов подов.
30-ingress.yaml — L7-маршрутизация и SSL-терминация 
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nextcloud
  namespace: nextcloud
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
    nginx.ingress.kubernetes.io/proxy-body-size: "10G"
spec:
  ingressClassName: nginx
  rules:
    - host: nc.128.0.67.226.nip.io
      http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: nextcloud
                port:
                  number: 80
  tls:
    - hosts:
        - nc.128.0.67.226.nip.io
      secretName: nextcloud-tls
 
Ingress — внешняя точка входа. Аннотация proxy-body-size: "10G" снимает лимит на загрузку файлов, а ssl-redirect принудительно включает HTTPS. Благодаря интеграции с cert-manager, система автоматически инициирует выпуск и ротацию SSL-сертификатов для указанного домена.
 
ЧТО ДАЛЬШЕ: УПРАВЛЕНИЕ И КАСТОМИЗАЦИЯ
 
После успешного развертывания часто возникает необходимость изменить внутренние настройки Nextcloud, которые недоступны через веб-интерфейс, или выполнить диагностику «изнутри» операционной системы контейнера.
 
ПОДКЛЮЧЕНИЕ К КОНТЕЙНЕРУ ЧЕРЕЗ EXEC
 
Поскольку поды в Kubernetes имеют динамические имена, сначала необходимо определить точное имя запущенного пода:
kubectl get pods -n nextcloud.
kubectl get pods -n nextcloud
 
Получив имя (например, nextcloud-7f8db59c8-abc12), вы можете открыть интерактивную сессию bash внутри контейнера.
kubectl exec -it nextcloud-7f8db59c8-abc12 -n nextcloud -- /bin/bash
 
Теперь вы находитесь внутри среды Debian (базовый образ Apache), где развернут Nextcloud. Все файлы приложения расположены в /var/www/html.
 
ИСПОЛЬЗОВАНИЕ УТИЛИТЫ OCC
 
Основным инструментом настройки Nextcloud является консольная утилита occ (Nextcloud Command Line Interface). С её помощью можно управлять пользователями, устанавливать приложения или изменять параметры конфигурации.
 
Важно помнить, что occ должна запускаться от имени пользователя веб-сервера (обычно это www-data). Пример выполнения команды внутри контейнера.
# Проверка текущего статуса системы
  su -s /bin/sh -c "php occ status" www-data 
# Добавление индекса в базу данных (полезно при обновлении)
  su -s /bin/sh -c "php occ db:add-missing-indices" www-data
 
Такой способ прямого взаимодействия позволяет инженеру гибко управлять сервером без необходимости пересборки Docker-образа при каждом изменении конфигурации.
 
Этот сценарий показывает, как сервис DevSpace можно использовать для:
  • быстрого создания изолированных сред разработки;
  • запуска Kubernetes-кластеров по требованию;
  • тестирования и демонстрации приложений;
  • публикации сервисов во внешний интернет.
Таким образом DevSpace в Cloupard позволяет за несколько минут подготовить полноценную инфраструктуру для работы с Kubernetes-приложениями.