Drupal — особенно популярен среди крупных предприятий и для сложных сайтов. Фактически, некоторые из наиболее посещаемых сайтов в мире, такие как NBC, The Economist, Cisco, RedHat или Tesla, используют Drupal в качестве CMS своих корпоративных сайтов.
В этой статье я объясню, как легко развернуть рабочий экземпляр Drupal и MySQL в Kubernetes. Вы заметите, что чтение этого руководства займет у вас больше времени, чем развертывание экземпляра. Это магия Kubernetes!
Предварительные условия
Мы предполагаем, что у вас есть работающий кластер Kubernetes и что kubectl уже установлен на вашей рабочей станции с необходимыми учетными данными для выполнения команд в вашем кластере. Кроме того, мы предполагаем, что у вас есть развернутый поставщик томов.
Подготовка инфраструктуры сохранения данных
Поскольку контейнеры Kubernetes не сохраняют данные, для сохранения данных необходимо использовать тома. В противном случае все изменения, записанные в базу данных или в любой каталог, будут потеряны после перезапуска контейнера.
В Kubernetes рекомендуется использовать объект PersistentVolume для хранения данных. PersistentVolume — это представление постоянного хранилища. Он поддерживает множество базовых технологий и служб хранения: NFS, Cinder, Gluster, Ceph, AWS EBS, Google Persistent Disk и другие.
PersistentVolume можно создать статически или динамически. В этой статье мы выбрали динамически создаваемый PersistentVolume, поскольку им проще управлять.
Способ сделать это — создать PersistentVolumeClaim.
Создайте drupal-persistentvolumeclaim.yaml следующим образом:
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: drupal-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: drupal-pvc-mysql
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
В этом случае мы запрашиваем два тома по 5 ГБ каждый, которые будут предоставлены автоматически через постоянный том. Первый будет использоваться для файлов сайта, второй — для базы данных.
Запустите команду:
kubectl apply -f drupal-persistentvolumeclaim.yaml
Через несколько секунд убедитесь, что ваши тома предоставлены. Если все в порядке, вы должны увидеть, что PersistentVolumes подготовлен и PersistentVolumeClaims привязан к нему.
kubectl get pvc
Развертывание экземпляра MySQL
Для развертывания экземпляра MySQL мы будем использовать развертывание и службу. Обратите внимание, что мы запускаем MySQL от root. При запуске в рабочей среде используйте собственные учетные данные. Также рекомендуется хранить пароль MySQL в секрете, а не в yaml.
Создайте drupal-mysql.yaml (не забудьте изменить root_password):
---
apiVersion: v1
kind: Service
metadata:
name: drupal-mysql-service
spec:
ports:
-
name: mysql
port: 3306
protocol: TCP
selector:
app: drupal-mysql
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: drupal-mysql
spec:
replicas: 1
template:
metadata:
labels:
app: drupal-mysql
spec:
containers:
-
env:
-
name: MYSQL_ROOT_PASSWORD
value: root_password
-
name: MYSQL_DATABASE
value: drupal-database
image: "mysql:5.7"
name: cont-drupal-mysql
ports:
-
containerPort: 3306
name: mysql
protocol: TCP
volumeMounts:
-
mountPath: /var/lib/mysql
name: vol-drupal
subPath: dbdata
volumes:
-
name: vol-drupal
persistentVolumeClaim:
claimName: drupal-pvc-mysql
Разверните MySQL с помощью следующей команды:
kubectl apply -f drupal-mysql.yaml
Затем проверьте, что модуль работает:
kubectl get pods
Возможно, вам придется подождать некоторое время, прежде чем модуль заработает.
Развертывание Друпала
Развертывание будет основано на контейнере с образом Drupal из репозитория Docker Hub. Кроме того, мы также будем использовать временный контейнер (InitContainer), задачей которого будет предварительное заполнение постоянного хранилища данными, используемыми Drupal.
Создайте drupal.yaml следующим образом:
---
apiVersion: v1
kind: Service
metadata:
name: drupal-service
spec:
ports:
-
name: http
port: 80
protocol: TCP
selector:
app: drupal
type: LoadBalancer
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
app: drupal
name: drupal
spec:
replicas: 1
template:
metadata:
labels:
app: drupal
spec:
initContainers:
-
name: init-sites-volume
image: drupal:10
command: ['/bin/bash', '-c']
args: ['cp -r /var/www/html/sites/ /data/; chown www-data:www-data /data/ -R']
volumeMounts:
- mountPath: /data
name: vol-drupal
containers:
-
image: drupal:10
name: drupal
ports:
-
containerPort: 80
volumeMounts:
- mountPath: /var/www/html/modules
name: vol-drupal
subPath: modules
- mountPath: /var/www/html/profiles
name: vol-drupal
subPath: profiles
- mountPath: /var/www/html/sites
name: vol-drupal
subPath: sites
- mountPath: /var/www/html/themes
name: vol-drupal
subPath: themes
volumes:
-
name: vol-drupal
persistentVolumeClaim:
claimName: drupal-pvc
Обратите внимание, что на этот раз тип службы установлен на LoadBalancer. Причина в том, что именно этот сервис будет открыт внешнему миру. Это запись указывает поставщику облачных услуг, что он должен предоставить балансировщику нагрузки внешний IP-адрес и назначить его этой службе.
Давайте развернем его:
kubectl apply -f drupal.yaml
Подождите 2 минуты, а затем выполните приведенную ниже команду, чтобы получить IP-адрес, который Kubernetes назначил вашей службе:
kubectl get svc
Установка Друпала
Теперь, когда инфраструктура развернута, давайте установим Drupal. Вам нужно просто перейти к IP-адресу и порту, которые вы получили на предыдущем шаге, или, если вы не используете балансировщик нагрузки облачного провайдера и у вас есть внешний IP-адрес для вашего компьютера, перейдите к external_IP:port.
Следуйте инструкциям мастера установки. Используйте учетные данные базы данных, которые вы настроили ранее при развертывании MySQL.
Например, в нашем случае вот данные, которые следует указать на экране Конфигурация базы данных:
- Имя базы данных: drupal-database то же, что и переменная среды MYSQL_DATABASE в развертывании MySQL.
- Пароль базы данных: your_password, такой же, как переменная среды MYSQL_PASSWORD в развертывании MySQL.
- Хост: drupal-mysql-service то же, что и имя службы MySQL.
- Порт: 3306 такой же, как порт службы MySQL.
Теперь у вас есть работающий экземпляр Drupal, развернутый менее чем за 10 минут.