Установка WordPress и MySQL на Kubernetes с помощью Helm

По мере распространения распределенных сред такие инструменты, как Kubernetes, набрали популярность как основные средства стандартизации компонентов приложения в динамических средах сборки и производства. В таких условиях стали необходимы инструменты, которые помогали бы управлять ресурсами в кластерах Kubernetes.

Helm — это менеджер пакетов Kubernetes с открытым исходным кодом, который упрощает процесс развертывания и обновления приложений в кластере Kubernetes, а также предоставляет возможность поиска и обмена готовыми к установке приложениями, которые упакованы в виде чартов Kubernetes.

В этом мануале мы будем использовать Helm для настройки WordPress в кластере Kubernetes, чтобы создать высокодоступный веб-сайт. Кроме масштабируемости и высокой доступности Kubernetes, вы сможете использовать функции безопасности WordPress и упрощенные процессы обновления и отката Helm.

Мы будем использовать внешний сервер MySQL для абстрагирования компонента базы данных, поскольку он может быть частью отдельного кластера или управляемого сервиса. После выполнения мануала у вас будет полнофункциональная установка WordPress в контейнерной кластерной среде, управляемой Kubernetes.

Требования

Прежде чем двигаться дальше, убедитесь, что вы можете войти на свой сервер MySQL и подключиться к кластеру Kubernetes. Если в вашем конфигурационном файле kubectl настроено несколько кластеров, убедитесь, что вы подключены к правильному кластеру, выполнив на локальном компьютере или на сервере разработки следующую команду:

kubectl config get-contexts
CURRENT   NAME                        CLUSTER                     AUTHINFO                          NAMESPACE
*         do-sfo2-wordpress-cluster   do-sfo2-wordpress-cluster   do-sfo2-wordpress-cluster-admin

.         minikube                    minikube                    minikube

Символ звездочки (*) указывает, какой кластер в настоящее время является контекстом по умолчанию. Если вам нужно изменить текущий контекст, запустите:

kubectl config use-context context-name

1: Настройка MySQL

Сначала нужно создать отдельного пользователя MySQL и базу данных для WordPress, что позволит устанавливать соединения с внешних хостов. Это необходимо, потому что установка WordPress будет жить на отдельном сервере внутри кластера Kubernetes. Если у вас уже есть выделенный пользователь и база данных MySQL для WordPress, вы можете перейти к следующему разделу.

На сервере MySQL войдите в оболочку MySQL с помощью следующей команды:

mysql -u root -p

Вам будет предложено ввести root пароль учетной записи MySQL. После входа MySQL предоставит вам командную строку, которую вы сможете использовать для создания базы данных и пользователя для WordPress.

Примечание: В этом мануале мы создадим базу данных wordpress и пользователя wordpress_user с паролем password. Обратите внимание, что это только условные значения – использовать их в настоящей среде небезопасно, вы должны заменить их уникальными данными, которые сложно угадать.

Для создания базы данных вы можете использовать следующую команду:

CREATE DATABASE wordpress;

Теперь создайте выделенного пользователя MySQL для этой базы данных:

CREATE USER wordpress_user IDENTIFIED BY 'password';

Пользователь wordpress_user создан, но у него еще нет прав доступа. Следующая команда предоставит этому пользователю права администратора (все привилегии) в базе данных wordpress из локальной и внешней сети:

GRANT ALL PRIVILEGES ON wordpress.* TO wordpress_user@'%';

Чтобы обновить настройки MySQL, сбросьте привилегии:

FLUSH PRIVILEGES;

Закройте MySQL:

exit;

Чтобы убедиться, что изменения были внесены успешно, вы можете снова открыть клиент командной строки MySQL, на этот раз используя новую учетную запись wordpress_user:

mysql -u wordpress_user -p

Вы должны указать пароль, который вы выбрали при создании этого пользователя MySQL. Чтобы подтвердить, что ваш новый пользователь имеет доступ к базе данных WordPress, вы можете использовать следующую команду:

show databases;

Вы получите следующий вывод:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| wordpress          |
+--------------------+
2 rows in set (0.03 sec)

После того как вы убедились, что база данных wordpress есть в списке, вы можете выйти из командной строки MySQL:

exit;

Теперь у вас есть отдельная база данных MySQL для WordPress и действительные учетные данные для работы с ней. Поскольку установка WordPress будет работать на отдельном сервере, вам еще нужно отредактировать конфигурацию MySQL, чтобы разрешить внешние подключения. Находясь на сервере MySQL, откройте файл /etc/mysql/mysql.conf.d/mysqld.cnf:

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Найдите в этом файле настройку bind-address. По умолчанию MySQL прослушивает только 127.0.0.1 (localhost). Чтобы принимать соединения от внешних хостов, нужно изменить это значение на 0.0.0.0. Вот как должна выглядеть конфигурация bind-address:

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address            = 0.0.0.0

Когда вы закончите вносить эти изменения, сохраните и закройте файл. Вам нужно перезапустить MySQL с помощью следующей команды:

sudo systemctl restart mysql

Чтобы проверить возможность удаленного подключения, выполните следующую команду на локальном компьютере или на сервере разработки:

mysql -h mysql_server_ip -u wordpress_user -p

Не забудьте заменить mysql_server_ip на IP-адрес сервера MySQL или имя хоста. Если вы можете подключиться без ошибок, вы готовы перейти к следующему разделу.

2: Установка WordPress

Теперь, когда у вас есть необходимая информация для подключения к базе данных MySQL, можно установить WordPress с помощью Helm.

По умолчанию чарт WordPress устанавливает MariaDB в отдельном модуле внутри кластера и использует его в качестве базы данных. Нам нужно отключить это поведение и настроить WordPress для поддержки внешней базы данных MySQL. Этот и другие параметры (такие как пользователь и пароль WordPress по умолчанию) можно добавить во время установки либо с помощью параметров командной строки, либо через отдельный файл конфигурации YAML.

Чтобы настройка осталась организованной и легко расширялась в будущем, мы будем использовать конфигурационный файл.

На локальном компьютере или сервере разработки создайте новый каталог для настроек проекта и перейдите в него:

mkdir myblog-settings
cd myblog-settings

Затем создайте файл values.yaml:

nano values.yaml

В этом файле нужно настроить несколько переменных, которые определят, как WordPress будет подключаться к базе данных, а также укажут некоторую основную информацию о сайте и администраторе для входа в WordPress после завершения установки.

Эта конфигурация будет основана на стандартном файле values.yaml из чарта WordPress. Раздел Blog/Site Info содержит общие параметры для блога WordPress, такие как название блога и исходные учетные данные пользователя. Раздел Database Settings содержит настройки для подключения к удаленному серверу MySQL. База MariaDB отключена в последнем разделе.

Скопируйте следующие строки в ваш файл values.yaml, заменив выделенные значения вашими значениями:

## Blog/Site Info
wordpressUsername: 8host
wordpressPassword: password
wordpressEmail: 8host@example.com
wordpressFirstName: 8host
wordpressLastName: Blog
wordpressBlogName: 8host Blog!
## Database Settings
externalDatabase:
host: mysql_server_ip
user: wordpress_user
password: password
database: wordpress
## Disabling MariaDB
mariadb:
enabled: false

Вы только что настроили следующие параметры:

  • wordpressUsername: логин пользователя WordPress.
  • wordpressPassword: пароль пользователя WordPress.
  • wordpressEmail: электронная почта пользователя WordPress.
  • wordpressFirstName: имя пользователя WordPress.
  • wordpressLastName: фамилия пользователя WordPress.
  • wordpressBlogName: название сайта или блога.
  • host: IP-адрес или имя хоста сервера MySQL.
  • user: пользователь MySQL.
  • password: пароль MySQL.
  • database: имя базы данных MySQL.

Когда вы закончите редактирование, сохраните файл и выйдите из редактора.

Теперь, когда у вас есть все настройки, пришло время запустить helm для установки WordPress. Следующая команда установит самый последний релиз чарта WordPress под именем myblog, используя конфигурации из values.yaml:

helm install --name myblog -f values.yaml stable/wordpress

Вы должны получить такой вывод:

NAME:   myblog
LAST DEPLOYED: Fri Jan 25 20:24:10 2019
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> v1/Deployment
NAME              READY  UP-TO-DATE  AVAILABLE  AGE
myblog-wordpress  0/1    1           0          1s
==> v1/PersistentVolumeClaim
NAME              STATUS   VOLUME            CAPACITY  ACCESS MODES  STORAGECLASS  AGE
myblog-wordpress  Pending  do-block-storage  1s
==> v1/Pod(related)
NAME                               READY  STATUS   RESTARTS  AGE
myblog-wordpress-5965f49485-8zfl7  0/1    Pending  0         1s
==> v1/Secret
NAME               TYPE    DATA  AGE
myblog-externaldb  Opaque  1     1s
myblog-wordpress   Opaque  1     1s
==> v1/Service
NAME              TYPE          CLUSTER-IP     EXTERNAL-IP  PORT(S)                     AGE
myblog-wordpress  LoadBalancer  10.245.144.79  <pending>    80:31403/TCP,443:30879/TCP  1s
(...)

После завершения установки в кластере Kubernetes создается сервис myblog-wordpress, но прежде чем контейнер будет готов и информация о External-IP станет доступной, может пройти несколько минут. Чтобы проверить состояние сервиса и получить его внешний IP-адрес, введите:

kubectl get services

Вы должны получить такой вывод:

NAME               TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                      AGE
kubernetes         ClusterIP      10.245.0.1      <none>          443/TCP                      20h
myblog-wordpress   LoadBalancer   10.245.144.79   203.0.113.110   80:31403/TCP,443:30879/TCP   3m40s

Эта команда предоставляет подробную информацию о сервисах, работающих в кластере, включая имя и тип сервиса, а также используемые ими IP-адреса. Как видно из вывода, установка WordPress обслуживается как myblog-wordpress на внешнем IP-адресе 203.0.113.110.

Примечание: Если для тестирования этой настройки вы используете minikube, вам нужно запустить minikube service myblog-wordpress , чтобы открыть контейнерный веб-сервер и получить к нему доступ из браузера.

Ваша установка WordPress работает. Чтобы получить доступ к интерфейсу администратора, укажите в веб-браузере внешний IP-адрес, полученный из вывода команды kubectl get services, а затем добавьте /wp-admin:

http://203.0.113.110/wp-admin

Вы должны использовать учетные данные, определенные в файле values.yaml, чтобы войти в систему и начать настройку сайта WordPress.

3: Обновление WordPress

Из-за своей популярности WordPress часто становится целью хакерских атак, потому установку очень важно вовремя обновлять.

Все релизы Helm можно обновлять с помощью команды helm upgrade.

Чтобы получить список всех ваших текущих релизов, выполните следующую команду на локальном компьютере или на сервере разработки:

helm list

Вы должны получить такой вывод:

NAME        REVISION    UPDATED                     STATUS      CHART           APP VERSION NAMESPACE
myblog      1           Fri Jan 25 20:24:10 2019    DEPLOYED    wordpress-5.1.2   5.0.3     default

Как видно из вывода, текущая версия WordPress – 5.0.3 (версия приложения), а версия чарта – 5.1.2. Если вы хотите обновить релиз до более новой версии чарта, сначала обновите репозитории Helm:

helm repo update

Вы получите такой вывод:

Hang tight while we grab the latest from your chart repositories...
...Skip local chart repository
...Successfully got an update from the "stable" chart repository
Update Complete. ⎈ Happy Helming!⎈

Затем вы можете проверить, есть ли более новая версия чарта WordPress:

helm inspect chart stable/wordpress

Вы получите такой результат:

apiVersion: v1
appVersion: 5.1.1
description: Web publishing platform for building blogs and websites.
engine: gotpl
home: http://www.wordpress.com/
icon: https://bitnami.com/assets/stacks/wordpress/img/wordpress-stack-220x234.png
keywords:
- wordpress
- cms
- blog
- http
- web
- application
- php
maintainers:
- email: containers@bitnami.com
name: Bitnami
name: wordpress
sources:
- https://github.com/bitnami/bitnami-docker-wordpress
version: 5.9.0

Как видно из выходных данных, доступен новый чарт (версия 5.9.0) для WordPress 5.1.1 (версия приложения). Всякий раз, когда вы хотите обновить свою версию WordPress до последнего чарта, вы должны запустить команду:

helm upgrade -f values.yaml myblog stable/wordpress

Эта команда выдаст результат, очень похожий на вывод, произведенный установкой helm. Важно указать тот же конфигурационный файл, который мы использовали при первой установке чарта WordPress, поскольку он содержит пользовательские настройки базы данных.

Теперь, если вы снова запустите helm list, вы должны увидеть обновленную информацию о вашей версии:

NAME    REVISION    UPDATED                     STATUS      CHART           APP VERSION     NAMESPACE
myblog  2           Fri May  3 14:51:20 2019    DEPLOYED    wordpress-5.9.0   5.1.1         default

Вы успешно обновили свой WordPress до последней версии чарта WordPress.

Откат релиза

Каждый раз, когда вы обновляете релиз, Helm создает новую ревизию этого релиза. Ревизия устанавливает фиксированную контрольную точку, куда вы можете вернуться, если релиз работает не так, как ожидалось. Этот механизм похож на коммиты в Git, потому что он создает историю изменений, которые можно сравнивать и откатывать. Если что-то во время процесса обновления пойдет не так, вы всегда сможете выполнить откат к предыдущей версии релиза Helm с помощью команды helm rollback:

helm rollback release-name revision-number

Например, если вы хотите отменить обновление и откатить версию WordPress до предыдущей версии, вы можете использовать:

helm rollback myblog 1

Это позволит откатить установку WordPress до первого релиза. Вы должны увидеть следующий вывод, если откат прошел успешно:

Rollback was a success! Happy Helming!

Повторный запуск команды helm list теперь должен сообщить, что WordPress вернулся к версии 5.0.3, версии чарта 5.1.2:

NAME        REVISION    UPDATED                     STATUS      CHART           APP VERSION NAMESPACE
myblog      3       Mon Jan 28 22:02:42 2019    DEPLOYED    wordpress-5.1.2   5.0.3         default

Обратите внимание, что откат релиза фактически создаст новую ревизию, основанную на ревизии целевого отката. Релиз WordPress по имени myblog теперь находится в третьей ревизии, которая была основана на первой ревизии.

Заключение

В этом руководстве вы установили WordPress с внешним сервером MySQL в кластере Kubernetes, используя инструмент командной строки Helm. Вы также узнали, как обновить релиз WordPress до новой версии диаграммы и как откатить релиз, если что-то пошло не так в процессе обновления.

Прочитайте рекомендуемые параметры производства для чарта WordPress, который вы использовали в этом руководстве.

Читайте также: Основы работы с Helm, пакетным менеджером Kubernetes

Tags: , , ,