Введение

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

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

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

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

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

wordpress illustration for: Предварительные требования

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

  • Инструмент командной строки kubectl, установленный на локальном компьютере и настроенный для подключения к вашему кластеру. Ознакомьтесь с официальной документацией Kubernetes для получения информации о выполнении данной настройки.

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

				
					
[environment local]

kubectl config get-contexts

				
			

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

				
					
[secondary_label Output]



CURRENT NAME CLUSTER AUTHINFO NAMESPACE

* do-sfo2-wordpress-cluster do-sfo2-wordpress-cluster do-sfo2-wordpress-cluster-admin 

 minikube minikube minikube 

				
			

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

				
					
[environment local]

kubectl config use-context <^>context-name<^>

				
			

Теперь вы должны быть готовы к выполнению остальной части руководства.

Шаг 1 — Настройка MySQL

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

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

				
					
[environment second]

mysql -u root -p

				
			

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

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

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

				
					
[environment second]

CREATE DATABASE &lt;^&gt;wordpress&lt;^&gt;;

				
			

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

				
					
[environment second]

CREATE USER &lt;^&gt;wordpress_user&lt;^&gt; IDENTIFIED BY '&lt;^&gt;password&lt;^&gt;';

				
			

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

				
					
[environment second]

GRANT ALL PRIVILEGES ON &lt;^&gt;wordpress&lt;^&gt;.* TO &lt;^&gt;wordpress_user&lt;^&gt;@'%';

				
			

Для обновления внутренних таблиц MySQL, которые будут управлять разрешениями, используйте следующее заявление:

				
					
[environment second]

FLUSH PRIVILEGES;

				
			

Теперь вы можете закрыть клиент MySQL с помощью следующей команды:

				
					
[environment second]

exit;

				
			

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

				
					
[environment second]

mysql -u &lt;^&gt;wordpress_user&lt;^&gt; -p

				
			

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

				
					
[environment second]

show databases;

				
			

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

				
					
[secondary_label Output]

+--------------------+

| Database |

+--------------------+

| information_schema |

| &lt;^&gt;wordpress&lt;^&gt; |

+--------------------+

2 rows in set (0.03 sec)

				
			

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

				
					
[environment second]

exit;

				
			

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

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

				
					
[environment second]

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

				
			

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

				
					
[label /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 = &lt;^&gt;0.0.0.0&lt;^&gt;

				
			

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

				
					
[environment second]

sudo systemctl restart mysql

				
			

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

				
					
[environment local]

mysql -h &lt;^&gt;mysql_server_ip&lt;^&gt; -u &lt;^&gt;wordpress_user&lt;^&gt; -p

				
			

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

Шаг 2 — Установка WordPress

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

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

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

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

				
					
[environment local]

mkdir myblog-settings

cd myblog-settings

				
			

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

				
					
[environment local]

nano values.yaml

				
			

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

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

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

				
					
[label values.yaml]



## Blog/Site Info

wordpressUsername: &lt;^&gt;sammy&lt;^&gt;

wordpressPassword: &lt;^&gt;password&lt;^&gt;

wordpressEmail: &lt;^&gt;sammy@example.com&lt;^&gt;

wordpressFirstName: &lt;^&gt;Sammy&lt;^&gt;

wordpressLastName: &lt;^&gt;the Shark&lt;^&gt;

wordpressBlogName: &lt;^&gt;Sammy's Blog!&lt;^&gt;



## Database Settings

externalDatabase:

 host: &lt;^&gt;mysql_server_ip&lt;^&gt;

 user: &lt;^&gt;wordpress_user&lt;^&gt;

 password: &lt;^&gt;password&lt;^&gt;

 database: &lt;^&gt;wordpress&lt;^&gt;



## 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:

				
					
[environment local]

helm install --name &lt;^&gt;myblog&lt;^&gt; -f values.yaml stable/wordpress

				
			

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

				
					
[secondary_label Output]



NAME: myblog

LAST DEPLOYED: Fri Jan 25 20:24:10 2019

NAMESPACE: default

STATUS: DEPLOYED



RESOURCES:

==&gt; v1/Deployment

NAME READY UP-TO-DATE AVAILABLE AGE

myblog-wordpress 0/1 1 0 1s



==&gt; v1/PersistentVolumeClaim

NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE

myblog-wordpress Pending do-block-storage 1s



==&gt; v1/Pod(related)

NAME READY STATUS RESTARTS AGE

myblog-wordpress-5965f49485-8zfl7 0/1 Pending 0 1s



==&gt; v1/Secret

NAME TYPE DATA AGE

myblog-externaldb Opaque 1 1s

myblog-wordpress Opaque 1 1s



==&gt; v1/Service

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

myblog-wordpress LoadBalancer 10.245.144.79 &lt;pending&gt; 80:31403/TCP,443:30879/TCP 1s



(...)

				
			

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

				
					
[environment local]

kubectl get services

				
			

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

				
					
[secondary_label Output]



NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

kubernetes ClusterIP 10.245.0.1 &lt;none&gt; 443/TCP 20h

&lt;^&gt;myblog-wordpress&lt;^&gt; LoadBalancer 10.245.144.79 &lt;^&gt;203.0.113.110&lt;^&gt; 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://&lt;^&gt;203.0.113.110&lt;^&gt;/wp-admin

				
			

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

Шаг 3 — Обновление WordPress

Из-за своей популярности WordPress часто становится целью злоумышленников, поэтому очень важно своевременно обновлять ее. Мы можем обновлять версии Helm с помощью команды helm upgrade.

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

				
					
[environment local]

helm list

				
			

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

				
					
[secondary_label Output]

NAME 	REVISION	UPDATED 			STATUS 	CHART 			APP VERSION NAMESPACE

myblog 		1			Fri Jan 25 20:24:10 2019	DEPLOYED	wordpress-&lt;^&gt;5.1.2&lt;^&gt;	&lt;^&gt;5.0.3&lt;^&gt;		default 



				
			

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

				
					
[environment local]

helm repo update

				
			

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

				
					
[secondary_label 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 более новая версия:

				
					
[environment local]

helm inspect chart stable/wordpress

				
			

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

				
					
[secondary_label Output]

apiVersion: v1

appVersion: &lt;^&gt;5.1.1&lt;^&gt;

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: &lt;^&gt;5.9.0&lt;^&gt;

				
			

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

				
					
[environment local]

helm upgrade -f values.yaml &lt;^&gt;myblog&lt;^&gt; stable/wordpress

				
			

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

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

				
					
[secondary_label Output]



NAME 	REVISION	UPDATED 	STATUS 	CHART 	APP VERSION		NAMESPACE

myblog	2 	Fri May 3 14:51:20 2019	DEPLOYED	wordpress-&lt;^&gt;5.9.0&lt;^&gt;	&lt;^&gt;5.1.1&lt;^&gt; 	default 



				
			

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

Откат версии

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

				
					
[environment local]

helm rollback &lt;^&gt;release-name revision-number&lt;^&gt;

				
			

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

				
					
[environment local]

helm rollback myblog &lt;^&gt;1&lt;^&gt;

				
			

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

				
					
[secondary_label Output]



Rollback was a success! Happy Helming!

				
			

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

				
					
[secondary_label Output]



NAME 	REVISION	UPDATED 	STATUS 	CHART 	APP VERSION	NAMESPACE

myblog		3 	Mon Jan 28 22:02:42 2019	DEPLOYED	wordpress-&lt;^&gt;5.1.2&lt;^&gt;	&lt;^&gt;5.0.3&lt;^&gt; 	default 



				
			

Обратите внимание, что при откате к предыдущей версии создается новый выпуск, опирающийся на заданную при откате версию. Наша версия WordPress с именем myblog в настоящий момент имеет номер выпуска три, которая опирается на версию номер один.

Заключение

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

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

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