*Автор выбрал Diversity in Tech Fund для получения пожертвования в рамках программы Write for DOnations.*

Введение

Laravel — одна из самых популярных в настоящее время инфраструктур приложений PHP с открытым исходным кодом. Обычно она развертывается с СУБД MySQL, но ее можно настроить и для других решений хранения данных. Laravel отличается использованием преимуществ современных возможностей PHP и обширной экосистемой пакетов.

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

В этом обучающем модуле вы создадите приложение Laravel PHP, добавите приложение в образ Docker и развернете этот образ в кластере Kubernetes, используя чарт LAMP Helm. Затем вы настроите контроллер Ingress для добавления SSL и собственного доменного имени вашего приложения. После прохождения вы получите работающее приложение Laravel, подключенноек базе данных MySQL, запущенной на кластере Kubernetes.

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

laravel illustration for: Предварительные требования
  • В этом обучающем модуле вы создадите учетную запись Docker Hub для хранения образов Docker.
  • Полностью зарегистрированное доменное имя с доступной записью 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> и замените его содержимое следующим:

				
					
[label ./resources/views/welcome.blade.php]

...

&lt;div class="links"&gt;

   &lt;^&gt;&lt;strong&gt;Database Connected: &lt;/strong&gt;&lt;^&gt;

    &lt;^&gt;@php&lt;^&gt;

        &lt;^&gt;try {&lt;^&gt;

            &lt;^&gt;DB::connection()-&gt;getPDO();&lt;^&gt;

            &lt;^&gt;echo DB::connection()-&gt;getDatabaseName();&lt;^&gt;

            &lt;^&gt;} catch (\Exception $e) {&lt;^&gt;

            &lt;^&gt;echo 'None';&lt;^&gt;

        &lt;^&gt;}&lt;^&gt;

    &lt;^&gt;@endphp&lt;^&gt;

&lt;/div&gt;

...

				
			

Сохраните и закройте файл.

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

На следующем шаге мы используем Docker для создания образа, содержащего это приложение Laravel, и Docker Compose для тестирования локального запуска и подключения к базе данных MySQL.

Шаг 2 — Контейнеризация вашего приложения Laravel

Мы создали новое приложение Laravel, и теперь нам нужно добавить код в образ Docker и протестировать образ с помощью Docker Compose. Хотя целью этого обучающего модуля является развертывание приложения в кластере Kubernetes, Docker Compose открывает удобный способ протестировать образ и конфигурацию Docker локально перед их запуском в облаке. Этот быстрый цикл обратной связи может быть полезен для внесения и тестирования небольших изменений.

Вначале используйте nano или другой предпочитаемый текстовый редактор для создания в корневом каталоге вашего приложения Laravel файла с именем Dockerfile:

				
					
nano ./Dockerfile

				
			

Добавьте в файл следующее: Docker будет использовать этот файл для встраивания кода в образ:

				
					
[label ./Dockerfile]

FROM php:7.4-apache



# Install packages

RUN apt-get update &amp;&amp; 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 &amp;&amp; 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

				
			

Добавьте следующий скрипт:

				
					
[label ./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

				
			
				
					
[label ./.dockerignore]

.env

/vendor

				
			

Сохраните и закройте файл.

Теперь перед локальным запуском приложения с помощью Docker Compose осталось только создать файл docker-compose.yml. Во время настройки этого файла YAML нужно будет ввести ключ APP_KEY, сгенерированный Laravel во время установки. Чтобы найти его, нужно открыть и запустить поиск файла . /.env или запустить следующие команды cat и grep:

				
					
cat .env | grep ^APP_KEY

				
			

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

				
					
[secondary_label Output]

APP_KEY=&lt;^&gt;base64:0EHhVpgg ... UjGE=&lt;^&gt;

				
			

Скопируйте ключ в буфер обмена. Обязательно добавьте префикс base64:. Теперь создайте файл docker-compose.yml в корневом каталоге вашего приложения:

				
					
nano ./docker-compose.yml

				
			

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

				
					
[label ./docker-compose.yml]

version: '3.5'

services:

  php:

    image: &lt;^&gt;your_docker_hub_username&lt;^&gt;/laravel-kubernetes:latest

    restart: always

    ports:

      - 8000:80

    environment:

      - APP_KEY="&lt;^&gt;your_laravel_app_key&lt;^&gt;"

      - 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 &lt;^&gt;your_docker_hub_username&lt;^&gt;/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 &lt;^&gt;your_docker_hub_username&lt;^&gt;

				
			

Введите в диалоге свои учетные данные. Обычно это нужно делать только один раз на каждом компьютере, поскольку Docker сохраняет ваши учетные данные в каталоге ~/.docker/config.json в вашем домашнем каталоге.

В заключение отправьте свой образ в Docker Hub:

				
					
docker push &lt;^&gt;your_docker_hub_username&lt;^&gt;/laravel-kubernetes:latest

				
			

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

				
					
[secondary_label Output]

latest: digest: sha256:df4bdeda91484c8c26a989b13b8f27ab14d93ab2e676e3c396714cb3811c4086 size: 4918

				
			

Мы поместили ваше приложение Laravel в контейнер и отправили образ в Docker Hub, и теперь вы можете использовать этот образ для развертывания чарта Helm или Kubernetes. На следующем шаге мы зададим персонализированные значения на базе чарта LAMP Helm и развернем его в вашем кластере 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<^> своим именем пользователя:

				
					
[label ./helm/values.yml]

php:

  repository: "&lt;^&gt;your_docker_hub_username&lt;^&gt;/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. Добавьте следующие конфигурации с вашими учетными данными:

				
					
[label ./helm/secrets.yml]

mysql:

  rootPassword: "&lt;^&gt;your_database_root_password&lt;^&gt;"

  user: &lt;^&gt;your_database_user&lt;^&gt;

  password: "&lt;^&gt;your_database_password&lt;^&gt;"

  database: &lt;^&gt;your_database_name&lt;^&gt;



php:

  envVars:

    - name: APP_KEY

      value: "&lt;^&gt;your_laravel_app_key&lt;^&gt;"

    - name: DB_DATABASE

      value: &lt;^&gt;your_database_name&lt;^&gt;

    - name: DB_USERNAME

      value: &lt;^&gt;your_database_user&lt;^&gt;

    - name: DB_PASSWORD

      value: "&lt;^&gt;your_database_password&lt;^&gt;"

				
			

Обязательно используйте надежные сочетания имени пользователя и пароля для производственной базы данных и используйте тот же ключ <^>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' &gt;&gt; ./.dockerignore &amp;&amp; echo '/helm/secrets.yml' &gt;&gt; ./.gitignore

				
			

Вы создали файлы конфигурации Helm для вашего приложения и образа Docker и теперь можете установить этот чарт Helm как новый релиз в вашем кластере Kubernetes. Установите чарт из корневого каталога вашего приложения:

				
					
helm install laravel-kubernetes -f helm/values.yml -f helm/secrets.yml stable/lamp

				
			

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

				
					
[secondary_label Output]

NAME: laravel-kubernetes

LAST DEPLOYED: Mon May 18 13:21:20 2020

NAMESPACE: default

STATUS: deployed

REVISION: 1

				
			

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

				
					
kubectl get services -w

				
			

Поищите имя вашего приложения:

				
					
[secondary_label Output]

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

laravel-kubernetes-lamp     LoadBalancer    &lt;^&gt;your_cluster_ip&lt;^&gt;      &lt;^&gt;your_external_ip&lt;^&gt;   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 создал балансировщик нагрузки the cloud provider и открыл прямой доступ к вашему приложению через IP-адрес балансировщика.

Вы можете вывести SSL и доменное имя напрямую на балансировщик нагрузки, но поскольку мы работаем в Kubernetes, будет удобнее управлять всем в одном месте. Дополнительную информацию о контроллерах Ingress и подробные сведения о следующих шагах можно найти в руководстве «Настройка Nginx Ingress в Kubernetes с помощью Helm».

Чарт LAMP Helm включает опцию конфигурации для поддержки Ingress. Откройте ваш файл helm/values.yml:

				
					
nano ./helm/values.yml

				
			

Добавьте в него следующие строки:

				
					
[label ./helm/values.yml]

...

# Use Ingress Controller

service:

  type: ClusterIP

  HTTPPort: 80

ingress:

  enabled: true

  domain: &lt;^&gt;your_domain&lt;^&gt;

				
			

Данная опция указывает, что при развертывании не нужно устанавливать балансировщик нагрузки и что нужно предоставить доступ к приложению через порт 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

				
			

После установки вы увидите следующий результат:

				
					
[secondary_label Output]

NAME: 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<^> выбранным именем домена:

				
					
[label ./ingress.yml]

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:

        - &lt;^&gt;your_domain&lt;^&gt;

      secretName: laravel-kubernetes-tls

  rules:

    - host: &lt;^&gt;your_domain&lt;^&gt;

      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, которые будут выведены в командной строке:

				
					
[secondary_label Output]

customresourcedefinition.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

				
			

Вы увидите следующее:

				
					
[secondary_label Output]

namespace/cert-manager created

				
			

Поскольку Jetstack Cert-Manager не входит в число чартов, обслуживаемых Kubernetes, вам нужно будет также добавить репозиторий Jetstack Helm. Запустите следующую команду, чтобы сделать ее доступной в Helm:

				
					
helm repo add jetstack https://charts.jetstack.io

				
			

При успешном добавлении вывод будет выглядеть так:

				
					
[secondary_label 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

				
			

После выполнения этой операции вы увидите сводную информацию о развертывании:

				
					
[secondary_label Output]

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

    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

				
			
				
					
[secondary_label Output]

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

nginx-ingress-controller   LoadBalancer   &lt;^&gt;your_cluster_ip&lt;^&gt;      &lt;^&gt;your_external_ip&lt;^&gt;   80:30187/TCP,443:31468/TCP   6m10s

				
			

Используйте адрес <^>your_external_ip<^> в качестве IP-адреса вашей записи DNS A. Процесс обновления записей DNS зависит от того, где вы управляете доменными именами и хостингом DNS, но если вы используете the cloud provider, вы можете сослаться на наше руководство по управлению записями DNS.

После обновления ваших записей DNS и генерирования сертификата SSL ваше приложение будет доступно по адресу <^>your_domain<^> с включенным SSL.

Хотя ваше приложение PHP и база данных уже связаны, вам все равно необходимо провести миграцию базы данных. На последнем шаге мы увидим, как запускать команды Artisan в поде Kubernetes для миграции базы данных и выполнения других распространенных задач технического обслуживания.

Шаг 6 — Дистанционный запуск команд

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

Прежде чем запускать команду Artisan для вашего приложения Laravel, вам нужно знать имя пода, где запущен контейнер вашего приложения Laravel. Для просмотра всех подов в вашем кластере Kubernetes используйте следующую команду:

				
					
kubectl get pods

				
			

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

				
					
[secondary_label Output]

NAME                                             READY   STATUS    RESTARTS   AGE

&lt;^&gt;laravel-kubernetes-lamp-77fb989b46-wczgb&lt;^&gt;         2/2     Running   0          16m

				
			

Выберите под для развертывания laravel-kubernetes-lamp-... Обязательно используйте выведенное имя, а не указанное выше. Теперь вы можете запустить для него команду kubectl exec. Например, для проведения миграции базы данных используйте команду artisan migrate. Мы добавляем флаг --force, поскольку команда выполняется на поде в производственной среде:

				
					
kubectl exec &lt;^&gt;laravel-kubernetes-lamp-77fb989b46-wczgb&lt;^&gt; -- php artisan migrate --force

				
			

Эта команда выводит следующее:

				
					
[secondary_label Output]

Migration 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 для развертывания этого образа в кластере Kubernetes. В заключение мы добавили SSL и персонализированное доменное имя и научились запускать инструменты командной строки в работающих подах.

Kubernetes и Helm дают ряд преимуществ по сравнению с традиционными вариантами хостинга стека LAMP: масштабируемость, возможность замены служб без прямого входа на сервер, инструменты для обновления во время работы и контроль над средой хостинга. При этом сложность начальной контейнеризации и настройки приложения делает начало работы непростой задачей. С этим руководством развертывание Laravel в кластере Kubernetes станет более достижимой задачей. Теперь вы можете изучить дополнительную информацию о возможностях Laravel и добавлении в Kubernetes инструментов мониторинга, таких как Linkerd, которые вы можете установить вручную с помощью нашего руководства или системы the cloud provider 1-Click.