Установка WordPress и MySQL на Kubernetes с помощью Helm
Cloud Server, mySQL | Комментировать запись
По мере распространения распределенных сред такие инструменты, как Kubernetes, набрали популярность как основные средства стандартизации компонентов приложения в динамических средах сборки и производства. В таких условиях стали необходимы инструменты, которые помогали бы управлять ресурсами в кластерах Kubernetes.
Helm – это менеджер пакетов Kubernetes с открытым исходным кодом, который упрощает процесс развертывания и обновления приложений в кластере Kubernetes, а также предоставляет возможность поиска и обмена готовыми к установке приложениями, которые упакованы в виде чартов Kubernetes.
В этом мануале мы будем использовать Helm для настройки WordPress в кластере Kubernetes, чтобы создать высокодоступный веб-сайт. Кроме масштабируемости и высокой доступности Kubernetes, вы сможете использовать функции безопасности WordPress и упрощенные процессы обновления и отката Helm.
Мы будем использовать внешний сервер MySQL для абстрагирования компонента базы данных, поскольку он может быть частью отдельного кластера или управляемого сервиса. После выполнения мануала у вас будет полнофункциональная установка WordPress в контейнерной кластерной среде, управляемой Kubernetes.
Требования
- Кластер Kubernetes 1.10+ с включенным контролем доступа на основе ролей (RBAC).
- Средство командной строки kubectl, установленное на вашем локальном компьютере или на сервере разработки, настроенное для подключения к кластеру. Пожалуйста, обратитесь к официальной документации Kubernetes за инструкциями по настройке.
- Менеджер пакетов Helm, установленный на вашем локальном компьютере или на сервере разработки, и Tiller, установленный в кластере (читайте мануал Установка программного обеспечения в кластер Kubernetes с помощью пакетного менеджера Helm).
- Внешний сервер MySQL с доступом по SSH и root пароль MySQL. Чтобы настроить такой сервер, вы можете следовать мануалу Установка MySQL в Ubuntu 18.04.
Прежде чем двигаться дальше, убедитесь, что вы можете войти на свой сервер 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: Helm, Kubernetes, MySQL, WordPress