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-приложениями.