Tutorial
Развертывание Laravel 7 и MySQL в Kubernetes с помощью Helm
Автор выбрал Diversity in Tech Fund для получения пожертвования в рамках программы Write for DOnations.
Введение
Laravel — одна из самых популярных в настоящее время инфраструктур приложений PHP с открытым исходным кодом. Обычно она развертывается с СУБД MySQL, но ее можно настроить и для других решений хранения данных. Laravel отличается использованием преимуществ современных возможностей PHP и обширной экосистемой пакетов.
Kubernetes — платформа оркестровки контейнеров, которую можно размещать на кластерах DigitalOcean Kubernetes для упрощения администрирования, настройки и использования контейнеров в производственной среде. Helm — это диспетчер пакетов Kubernetes, упрощающий настройку и установку служб и подов в Kubernetes.
В этом обучающем модуле вы создадите приложение Laravel PHP, добавите приложение в образ Docker и развернете этот образ в кластере DigitalOcean Kubernetes, используя чарт LAMP Helm. Затем вы настроите контроллер Ingress для добавления SSL и собственного доменного имени вашего приложения. После прохождения вы получите работающее приложение Laravel, подключенноек базе данных MySQL, запущенной на кластере Kubernetes.
Предварительные требования
- Система Docker, установленная на компьютере, с которого вы будете подключаться к кластеру. Подробные инструкции по установке Docker для большинства дистрибутивов Linux можно найти здесь или на сайте Docker для других операционных систем.
- В этом обучающем модуле вы создадите учетную запись Docker Hub для хранения образов Docker.
- Кластер DigitalOcean Kubernetes с конфигурацией подключения, настроенной с помощью
kubectl
по умолчанию. Процесс создания кластера Kubernetes в DigitalOcean, описан в документе «Быстрое начало работы с Kubernetes». Процедура подключения к кластеру описана в руководстве «Подключение к кластеру DigitalOcean Kubernetes». - Диспетчер пакетов Helm 3, установленный на локальном компьютере. Выполните первый шаг и добавьте репозиторий
stable
из второго шага обучающего модуля «Установка программного обеспечения в кластерах Kubernetes с помощью диспетчера пакетов Helm 3». - Полностью зарегистрированное доменное имя с доступной записью A. В этом обучающем руководстве мы будем использовать
your_domain
. Вы можете купить доменное имя на Namecheap, получить его бесплатно на Freenom или воспользоваться услугами любого предпочитаемого регистратора доменных имен. Сейчас не нужно думать о привязке записи A вашего домена к IP-адресу. Когда вы дойдете до шага 5 и ваш контроллер Ingress будет установлен, вы подключитеyour_domain
к правильному IP-адресу.
Шаг 1 — Создание нового приложения Laravel
На этом шаге мы используем Docker для создания нового приложения Laravel 7, но у вас должна быть возможность выполнить эту же процедуру с существующим приложением Laravel, которое использует MySQL в качестве опорной базы данных. Создаваемое новое приложение подтверждает подключение Laravel к базе данных и отображает имя базы данных.
Перейдите в домашний каталог и создайте новое приложение Laravel с использованием контейнера composer
Docker:
- cd ~
- docker run --rm -v $(pwd):/app composer create-project --prefer-dist laravel/laravel laravel-kubernetes
Когда контейнер будет готов и все пакеты Composer будут установлены, вы увидите новую установку Laravel в текущем каталоге laravel-kubernetes/
. Перейдите в этот каталог:
- cd ~/laravel-kubernetes
Остальные команды этого обучающего модуля должны выполняться в нем.
Цель этого приложения — протестировать подключение к базе данных и вывести ее имя в браузере. Чтобы протестировать подключение к базе данных, откройте файл ./resources/views/welcome.blade.php
в текстовом редакторе:
- nano ./resources/views/welcome.blade.php
Найдите раздел <div class="links">...</div>
и замените его содержимое следующим:
...
<div class="links">
<strong>Database Connected: </strong>
@php
try {
DB::connection()->getPDO();
echo DB::connection()->getDatabaseName();
} catch (\Exception $e) {
echo 'None';
}
@endphp
</div>
...
Сохраните и закройте файл.
Это все настройки, которые потребуется внести в приложение Laravel по умолчанию для этого обучающего модуля. После завершения этот небольшой код PHP протестирует ваше подключение к базе данных и выведет имя данных на всплывающем экране Laravel в вашем браузере.
На следующем шаге мы используем Docker для создания образа, содержащего это приложение Laravel, и Docker Compose для тестирования локального запуска и подключения к базе данных MySQL.
Шаг 2 — Контейнеризация вашего приложения Laravel
Мы создали новое приложение Laravel, и теперь нам нужно добавить код в образ Docker и протестировать образ с помощью Docker Compose. Хотя целью этого обучающего модуля является развертывание приложения в кластере Kubernetes, Docker Compose открывает удобный способ протестировать образ и конфигурацию Docker локально перед их запуском в облаке. Этот быстрый цикл обратной связи может быть полезен для внесения и тестирования небольших изменений.
Вначале используйте nano
или другой предпочитаемый текстовый редактор для создания в корневом каталоге вашего приложения Laravel файла с именем Dockerfile
:
- nano ./Dockerfile
Добавьте в файл следующее: Docker будет использовать этот файл для встраивания кода в образ:
FROM php:7.4-apache
# Install packages
RUN apt-get update && apt-get install -y \
git \
zip \
curl \
sudo \
unzip \
libicu-dev \
libbz2-dev \
libpng-dev \
libjpeg-dev \
libmcrypt-dev \
libreadline-dev \
libfreetype6-dev \
g++
# Apache configuration
ENV APACHE_DOCUMENT_ROOT=/var/www/html/public
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
RUN a2enmod rewrite headers
# Common PHP Extensions
RUN docker-php-ext-install \
bz2 \
intl \
iconv \
bcmath \
opcache \
calendar \
pdo_mysql
# Ensure PHP logs are captured by the container
ENV LOG_CHANNEL=stderr
# Set a volume mount point for your code
VOLUME /var/www/html
# Copy code and run composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
COPY . /var/www/tmp
RUN cd /var/www/tmp && composer install --no-dev
# Ensure the entrypoint file can be run
RUN chmod +x /var/www/tmp/docker-entrypoint.sh
ENTRYPOINT ["/var/www/tmp/docker-entrypoint.sh"]
# The default apache run command
CMD ["apache2-foreground"]
Сохраните и закройте файл.
Этот файл Dockerfile начинает с образа PHP 7.4 Apache Docker из Docker Hub, а затем устанавливает несколько пакетов Linux, которые обычно требуются для приложений Laravel. Затем он создает файлы конфигурации Apache и включает перезапись заголовков. Dockerfile устанавливает несколько общих расширений PHP и добавляет переменную среды для обеспечения трансляции журналов Laravel в контейнер через stderr
. Это позволяет просматривать журналы Laravel через журналы Docker Compose или Kubernetes.
В заключение, Dockerfile копирует весь код приложения Laravel в каталог /var/www/tmp
и устанавливает зависимости Composer. Затем он устанавливает ENTRYPOINT
, но нам еще нужно создать этот файл, что мы сейчас и сделаем.
Создайте в корневом каталоге проекта новый файл с именем docker-entrypoint.sh
. Этот файл будет запускаться при запуске контейнера в локальном режиме или в кластере Kubernetes и будет копировать код приложения Laravel из каталога /var/www/tmp
в каталог /var/www/html
, где его будет обслуживать Apache.
- nano ./docker-entrypoint.sh
Добавьте следующий скрипт:
#!/bin/bash
cp -R /var/www/tmp/. /var/www/html/
chown -R www-data:www-data /var/www/html
exec "$@"
Заключительная строка exec "$@"
предписывает оболочки запустить любую команду, которая будет передана следующей в качестве входного аргумента. Это важно, потому что нам нужно, чтобы Docker продолжал выполнять команду запуска Apache (apache2-foreground
) после выполнения этого скрипта. Сохраните и закройте файл.
Создайте файл .dockerignore
в корневом каталоге вашего приложения. С этим файлом при сборке образа Docker он не будет загрязнен пакетами или файлами среды, которые не следует в него копировать:
- nano ./.dockerignore
.env
/vendor
Сохраните и закройте файл.
Теперь перед локальным запуском приложения с помощью Docker Compose осталось только создать файл docker-compose.yml
. Во время настройки этого файла YAML нужно будет ввести ключ APP_KEY
, сгенерированный Laravel во время установки. Чтобы найти его, нужно открыть и запустить поиск файла . /.env
или запустить следующие команды cat
и grep
:
- cat .env | grep ^APP_KEY
Результат должен будет выглядеть следующим образом:
OutputAPP_KEY=base64:0EHhVpgg ... UjGE=
Скопируйте ключ в буфер обмена. Обязательно добавьте префикс base64:
. Теперь создайте файл docker-compose.yml
в корневом каталоге вашего приложения:
- nano ./docker-compose.yml
Здесь мы включим образ PHP вашего приложения Laravel и контейнер MySQL для запуска вашей базы данных. Добавьте следующее содержимое:
version: '3.5'
services:
php:
image: your_docker_hub_username/laravel-kubernetes:latest
restart: always
ports:
- 8000:80
environment:
- APP_KEY="your_laravel_app_key"
- APP_ENV=local
- APP_DEBUG=true
- DB_PORT=3306
- DB_HOST=mysql
- DB_DATABASE
- DB_USERNAME
- DB_PASSWORD
mysql:
image: mysql:5.7
restart: always
environment:
- MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
- MYSQL_DATABASE=${DB_DATABASE}
- MYSQL_USER=${DB_USERNAME}
- MYSQL_PASSWORD=${DB_PASSWORD}
Используйте скопированную вами в буфер обмена переменную APP_KEY
для переменной your_laravel_app_key
и используйте свое имя пользователя Docker Hub для переменной your_docker_hub_username
. Сохраните и закройте файл.
Первый образ вы создадите локально с помощью docker build
. Второй образ — это официальный образ MySQL Docker, доступный в Docker Hub. Для обоих из них требуется несколько переменных среды, которые добавляются при запуске контейнеров.
Запустите следующую команду для сборки образа Docker, содержащего ваше приложение Laravel. Обязательно замените your_docker_hub_username
своим именем пользователя или именем пользователя команды Docker Hub, где будет храниться этот образ:
- docker build -t your_docker_hub_username/laravel-kubernetes:latest .
Затем вы можете запустить два контейнера с помощью Docker Compose, используя требуемые учетные данные БД:
- DB_ROOT_PASSWORD=rootpassword DB_DATABASE=local_db DB_USERNAME=admin DB_PASSWORD=password docker-compose up -d
Вы можете изменять четыре используемых здесь переменных среды (DB_ROOT_PASSWORD
, DB_DATABASE
, DB_USERNAME
, DB_PASSWORD
) , но поскольку вы только тестируете приложение на локальной системе, вам не нужно беспокоиться об их защите.
Инициализация базы данных MySQL и подготовка контейнеров могут занять до 30 секунд. Когда контейнеры будут готовы, вы можете просмотреть свое приложение Laravel на локальном компьютере по адресу localhost:8000
.
Ваше приложение PHP подключится к вашей базе данных MySQL. После успешного подключения под логотипом Laravel появится текст «Database Connected: local_db».
Мы протестировали образ Docker на локальной системе с помощью Docker Compose и теперь можем остановить контейнеры с помощью команды docker-compose down
:
- docker-compose down
В следующем разделе мы отправим образ Docker в Docker Hub, чтобы чарт Helm мог использовать его для развертывания вашего приложения в вашем кластере Kubernetes.
Шаг 3 — Отправка образа Docker в Docker Hub
Чарт LAMP Helm, который мы будем использовать для развертывания кода в Kubernetes, требует, чтобы код был доступен в реестре контейнеров. Хотя вы можете отправить свой образ в частный или собственный реестр, в этом обучающем модуле мы будем использовать общедоступный бесплатный реестр Docker в Docker Hub.
Откройте в браузере свою учетную запись на Docker Hub и создайте новый репозиторий с именем laravel-kubernetes
.
Затем если вы не подключились к Docker Hub с локального компьютера, вам нужно будет войти в Docker Hub. Это можно сделать через командную строку:
- docker login -u your_docker_hub_username
Введите в диалоге свои учетные данные. Обычно это нужно делать только один раз на каждом компьютере, поскольку Docker сохраняет ваши учетные данные в каталоге ~/.docker/config.json
в вашем домашнем каталоге.
В заключение отправьте свой образ в Docker Hub:
- docker push your_docker_hub_username/laravel-kubernetes:latest
Выгрузка приложения может занять несколько минут в зависимости от скорости подключения, однако после завершения этой операции Docker вы увидите в окне терминала окончательную сводную хэш-сумму и размер вашего образа. Он будет выглядеть примерно так:
Outputlatest: digest: sha256:df4bdeda91484c8c26a989b13b8f27ab14d93ab2e676e3c396714cb3811c4086 size: 4918
Мы поместили ваше приложение Laravel в контейнер и отправили образ в Docker Hub, и теперь вы можете использовать этот образ для развертывания чарта Helm или Kubernetes. На следующем шаге мы зададим персонализированные значения на базе чарта LAMP Helm и развернем его в вашем кластере DigitalOcean Kubernetes.
Шаг 4 — Настройка и развертывание приложения с помощью чарта LAMP Helm
В Helm имеется ряд чартов, помогающих настраивать приложения Kubernetes с использованием готовых комбинаций инструментов. Хотя вы можете самостоятельно написать служебные файлы Kubernetes для аналогичного развертывания, в этом разделе вы увидите, что использование чарта Helm требует намного меньше настроек.
Прежде всего, вам потребуется каталог для хранения всех ваших файлов конфигурации Helm. Создайте в корневом каталоге вашего проекта Laravel новый каталог с именем helm/
:
- mkdir ./helm
В каталоге helm/
мы создадим два новых файла: values.yml
и secrets.yml
. Вначале создайте и откройте файл values.yml
:
- nano ./helm/values.yml
Файл values.yml
будет содержать несекретные параметры конфигурации, которые будут заменять значения по умолчанию в чарте LAMP Helm. Добавьте следующие конфигурации, заменив your_docker_hub_username
своим именем пользователя:
php:
repository: "your_docker_hub_username/laravel-kubernetes"
tag: "latest"
fpmEnabled: false
envVars:
- name: APP_ENV
value: production
- name: APP_DEBUG
value: false
- name: DB_PORT
value: 3306
- name: DB_HOST
value: localhost
Сохраните и закройте файл.
Теперь создайте файл secrets.yml
:
- nano ./helm/secrets.yml
secrets.yml
не регистрируется в системе контроля версий. Он будет содержать важные данные конфигурации, в том числе ваш пароль базы данных и ключ приложения Laravel. Добавьте следующие конфигурации с вашими учетными данными:
mysql:
rootPassword: "your_database_root_password"
user: your_database_user
password: "your_database_password"
database: your_database_name
php:
envVars:
- name: APP_KEY
value: "your_laravel_app_key"
- name: DB_DATABASE
value: your_database_name
- name: DB_USERNAME
value: your_database_user
- name: DB_PASSWORD
value: "your_database_password"
Обязательно используйте надежные сочетания имени пользователя и пароля для производственной базы данных и используйте тот же ключ your_laravel_app_key
, что и выше, или откройте новое окно терминала и сгенерируйте новый ключ с помощью следующей команды. После этого вы можете скопировать новое значение, задаваемое Laravel в вашем файле .env
:
- docker run --rm -v $(pwd):/app php:cli php /app/artisan key:generate
Сохраните и закройте файл secrets.yml
.
Чтобы ваш файл secrets.yml
не добавлялся в образ Docker и не сохранялся в системе контроля версий, обязательно добавьте следующую строку в ваши файлы .dockerignore
и .gitignore
. Откройте и добавьте /helm/secrets.yml
в каждый файл или запустите следующую команду для добавления в оба файла:
- echo '/helm/secrets.yml' >> ./.dockerignore && echo '/helm/secrets.yml' >> ./.gitignore
Вы создали файлы конфигурации Helm для вашего приложения и образа Docker и теперь можете установить этот чарт Helm как новый релиз в вашем кластере Kubernetes. Установите чарт из корневого каталога вашего приложения:
- helm install laravel-kubernetes -f helm/values.yml -f helm/secrets.yml stable/lamp
Результат должен будет выглядеть следующим образом:
OutputNAME: laravel-kubernetes
LAST DEPLOYED: Mon May 18 13:21:20 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
Ваше приложение будет доступно через одну-две минуты, но вы можете запустить следующую команду для мониторинга служб Kubernetes в вашем кластере:
- kubectl get services -w
Поищите имя вашего приложения:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
laravel-kubernetes-lamp LoadBalancer your_cluster_ip your_external_ip 80:32175/TCP,3306:32243/TCP
Когда новая служба laravel-kubernetes-lamp
отображает IP-адрес под EXTERNAL-IP
, вы можете открыть your_external_ip
, чтобы увидеть приложение, запущенное в кластере Kubernetes. Ваше приложение подключится к вашей базе данных, и вы увидите имя базы данных под логотипом Laravel, как при локальном запуске приложения с помощью Docker Compose.
Для концептуальных испытаний веб-приложение можно запустить с незащищенного IP-адреса, но ваш сайт не будет готов для производственной среды без сертификата SSL и персонализированного доменного имени. На следующем шаге мы настроим их, но предварительно нужно удалить релиз через командную строку:
- helm delete laravel-kubernetes
На следующем шаге мы расширим первую конфигурацию Helm, добавив контроллер Ingress, сертификат SSL и персонализированный домен в наше приложение Laravel.
Шаг 5 — Добавление контроллера Ingress и SSL в кластер Kubernetes
В Kubernetes контроллер Ingress отвечает за предоставление доступа к службам вашего приложения через интернет. На предыдущем шаге чарт LAMP Helm создал балансировщик нагрузки DigitalOcean и открыл прямой доступ к вашему приложению через IP-адрес балансировщика.
Вы можете вывести SSL и доменное имя напрямую на балансировщик нагрузки, но поскольку мы работаем в Kubernetes, будет удобнее управлять всем в одном месте. Дополнительную информацию о контроллерах Ingress и подробные сведения о следующих шагах можно найти в руководстве «Настройка Nginx Ingress в DigitalOcean Kubernetes с помощью Helm».
Чарт LAMP Helm включает опцию конфигурации для поддержки Ingress. Откройте ваш файл helm/values.yml
:
- nano ./helm/values.yml
Добавьте в него следующие строки:
...
# Use Ingress Controller
service:
type: ClusterIP
HTTPPort: 80
ingress:
enabled: true
domain: your_domain
Данная опция указывает, что при развертывании не нужно устанавливать балансировщик нагрузки и что нужно предоставить доступ к приложению через порт 80 кластера Kubernetes, доступ к которому контроллер Ingress откроет через Интернет. Сохраните и закройте файл values.yml
.
Запустите команду helm install
, которую вы запускали ранее, чтобы снова запустить приложение Laravel. Команду нужно запускать из корневого каталога вашего приложения:
- helm install laravel-kubernetes -f helm/values.yml -f helm/secrets.yml stable/lamp
Затем установите контроллер nginx-ingress
в своем кластере Kubernetes, используя обслуживаемый Kubernetes-контроллер Nginx Ingress:
- helm install nginx-ingress stable/nginx-ingress --set controller.publishService.enabled=true
После установки вы увидите следующий результат:
OutputNAME: nginx-ingress
LAST DEPLOYED: Mon May 18 13:28:34 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
Чтобы открыть доступ к развертыванию вашего приложения Laravel, вам также потребуется ресурс Ingress. Создайте в корневом каталоге вашего приложения новый файл с именем ingress.yml
:
- nano ./ingress.yml
В этом файле определяются хост приложения, диспетчер сертификатов SSL, серверная служба и имя порта. Добавьте следующие конфигурации, заменив your_domain выбранным именем домена:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: laravel-kubernetes-ingress
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
tls:
- hosts:
- your_domain
secretName: laravel-kubernetes-tls
rules:
- host: your_domain
http:
paths:
- backend:
serviceName: laravel-kubernetes-lamp
servicePort: 80
Сохраните и закройте файл.
Затем необходимо установить Cert-Manager и создать центр, который позволит вам создавать производственные сертификаты SSL с помощью Let’s Encrypt. Для Cert-Manager требуются персонализированные определения ресурсов, которые вы можете применить из репозитория Cert-Manager через командную строку:
- kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.15.0/cert-manager.crds.yaml
При этом будет создан ряд ресурсов Kubernetes, которые будут выведены в командной строке:
Outputcustomresourcedefinition.apiextensions.k8s.io/certificaterequests.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/certificates.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/challenges.acme.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/clusterissuers.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/issuers.cert-manager.io created
customresourcedefinition.apiextensions.k8s.io/orders.acme.cert-manager.io create
Cert-Manager также требуется пространство имен для его изоляции в кластере Kubernetes:
- kubectl create namespace cert-manager
Вы увидите следующее:
Outputnamespace/cert-manager created
Поскольку Jetstack Cert-Manager не входит в число чартов, обслуживаемых Kubernetes, вам нужно будет также добавить репозиторий Jetstack Helm. Запустите следующую команду, чтобы сделать ее доступной в Helm:
- helm repo add jetstack https://charts.jetstack.io
При успешном добавлении вывод будет выглядеть так:
Output"jetstack" has been added to your repositories
Теперь мы готовы установить Cert-Manager в пространство имен cert-manager
в кластере Kubernetes:
- helm install cert-manager --version v0.15.0 --namespace cert-manager jetstack/cert-manager
После выполнения этой операции вы увидите сводную информацию о развертывании:
OutputNAME: cert-manager
LAST DEPLOYED: Mon May 18 13:32:08 2020
NAMESPACE: cert-manager
STATUS: deployed
REVISION: 1
В заключение нужно добавить в корневой каталог приложения Laravel файл конфигурации Kubernetes с именем production_issuer.yml
. Создайте файл:
- nano ./production_issuer.yml
Добавьте следующее:
apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
# Email address used for ACME registration
email: your_email_address
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
# Name of a secret used to store the ACME account private key
name: letsencrypt-prod-private-key
# Add a single challenge solver, HTTP01 using nginx
solvers:
- http01:
ingress:
class: nginx
Сохраните и закройте файл.
Let’s Encrypt будет отправлять на адрес your_email_address
все важные уведомления и предупреждения об окончании срока действия сертификата, так что укажите адрес, который вы будете регулярно проверять. Сохраните этот файл и создайте новый ресурс для вашего ресурса Ingress и производственного центра сертификации в вашем кластере Kubernetes:
- kubectl create -f ingress.yml
- kubectl create -f production_issuer.yml
В заключение обновите записи DNS вашего доменного имени, чтобы запись A указывала на IP-адрес вашего балансировщика нагрузки. Чтобы найти IP-адрес вашего контроллера Ingress, введите следующую команду:
- kubectl get service nginx-ingress-controller
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-ingress-controller LoadBalancer your_cluster_ip your_external_ip 80:30187/TCP,443:31468/TCP 6m10s
Используйте адрес your_external_ip
в качестве IP-адреса вашей записи DNS A. Процесс обновления записей DNS зависит от того, где вы управляете доменными именами и хостингом DNS, но если вы используете DigitalOcean, вы можете сослаться на наше руководство по управлению записями DNS.
После обновления ваших записей DNS и генерирования сертификата SSL ваше приложение будет доступно по адресу your_domain
с включенным SSL.
Хотя ваше приложение PHP и база данных уже связаны, вам все равно необходимо провести миграцию базы данных. На последнем шаге мы увидим, как запускать команды Artisan в поде Kubernetes для миграции базы данных и выполнения других распространенных задач технического обслуживания.
Шаг 6 — Дистанционный запуск команд
Хотя ваше приложение Laravel уже запущено и подключено к базе данных MySQL в Kubernetes, вам нужно выполнить несколько стандартных операций после установки приложения Laravel. В частности, вам следует провести миграцию баз данных.
Прежде чем запускать команду Artisan для вашего приложения Laravel, вам нужно знать имя пода, где запущен контейнер вашего приложения Laravel. Для просмотра всех подов в вашем кластере Kubernetes используйте следующую команду:
- kubectl get pods
Результат должен будет выглядеть следующим образом:
OutputNAME READY STATUS RESTARTS AGE
laravel-kubernetes-lamp-77fb989b46-wczgb 2/2 Running 0 16m
Выберите под для развертывания laravel-kubernetes-lamp-...
Обязательно используйте выведенное имя, а не указанное выше. Теперь вы можете запустить для него команду kubectl exec
. Например, для проведения миграции базы данных используйте команду artisan migrate
. Мы добавляем флаг --force
, поскольку команда выполняется на поде в производственной среде:
- kubectl exec laravel-kubernetes-lamp-77fb989b46-wczgb -- php artisan migrate --force
Эта команда выводит следующее:
OutputMigration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table (0.16 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated: 2019_08_19_000000_create_failed_jobs_table (0.05 seconds)
Мы успешно развернули Laravel 7 и MySQL в Kubernetes и выполнили необходимую задачу по обслуживанию базы данных.
Заключение
В этом обучающем модуле мы научились выполнять контейнеризацию приложения Laravel PHP, подключать его к базе данных MySQL, отправлять образ Docker с кодом в Docker Hub, а затем использовать чарт Helm для развертывания этого образа в кластере DigitalOcean Kubernetes. В заключение мы добавили SSL и персонализированное доменное имя и научились запускать инструменты командной строки в работающих подах.
Kubernetes и Helm дают ряд преимуществ по сравнению с традиционными вариантами хостинга стека LAMP: масштабируемость, возможность замены служб без прямого входа на сервер, инструменты для обновления во время работы и контроль над средой хостинга. При этом сложность начальной контейнеризации и настройки приложения делает начало работы непростой задачей. С этим руководством развертывание Laravel в кластере Kubernetes станет более достижимой задачей. Теперь вы можете изучить дополнительную информацию о возможностях Laravel и добавлении в Kubernetes инструментов мониторинга, таких как Linkerd, которые вы можете установить вручную с помощью нашего руководства или системы DigitalOcean 1-Click.