Введение

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

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

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

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

Предварительные требования

Для выполнения этого руководства вам потребуется следующее:

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

  • kubectl config get-contexts

Это пример вывода:

Output
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;

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

  • mysql -u wordpress_user -p

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

  • show databases;

Вы должны увидеть следующий вывод:

Output
+--------------------+ | 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:

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

# 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. Мы хотим отключить это поведение и настроить WordPress для использования внешней базы данных MySQL. Эти и другие параметры конфигурации (например, пользователь и пароль администратора WordPress по умолчанию) можно задать при установке либо с помощью параметров командной строки, либо с помощью отдельного файла конфигурации YAML.

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

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

  • mkdir myblog-settings
  • cd myblog-settings

Далее создайте файл с именем values.yaml с помощью текстового редактора на ваш выбор:

  • nano values.yaml

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

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

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

values.yaml

## Blog/Site Info
wordpressUsername: sammy
wordpressPassword: password
wordpressEmail: sammy@example.com
wordpressFirstName: Sammy
wordpressLastName: the Shark
wordpressBlogName: Sammy's 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. Следующая команда указывает helm установить самую последнюю стабильную версию чарта WordPress с именем myblog с помощью файла конфигурации values.yaml:

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

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

Output
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 (...)

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

  • kubectl get services

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

Output
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

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

Output
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

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

Output
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

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

Output
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 на самую последнюю версию, доступную в чарте Wordpress, запустите следующую команду:

  • helm upgrade -f values.yaml myblog stable/wordpress

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

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

Output
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 создает новый выпуск данной версии. Выпуск задает фиксированную точку сохранения, в которую вы можете вернуться, если все будет работать, как ожидалось. Это похоже на commit в Git, потому что в этом случае создается история изменений, которые можно сравнить и откатывать. Если при обновлении что-то пойдет не так, вы всегда можете откатиться к предыдущему выпуску определенной версии Helm с помощью команды helm rollback:

  • helm rollback release-name revision-number

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

  • helm rollback myblog 1

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

Output
Rollback was a success! Happy Helming!

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

Output
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 до новой версии чарта, а также как откатить назад версию, если в процессе обновления что-то пойдет не так.

В качестве дополнительных шагов вы можете рассмотреть настройку Nginx Ingress с Cert-Manager, чтобы активировать виртуальный хостинг на основе имен и настроить сертификат SSL для вашего сайта WordPress. Также вы должны проверить рекомендуемые настройки для продакшена в случае использования чарта WordPress, который мы задействовали в настоящем руководстве.

Если вы хотите узнать больше о Kubernetes и Helm, ознакомьтесь с разделом Kubernetes на странице нашего сообщества.

0 Comments

Creative Commons License