One place for hosting & domains

      Развертывание 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/. Перейдите в этот каталог:

      Остальные команды этого обучающего модуля должны выполняться в нем.

      Цель этого приложения — протестировать подключение к базе данных и вывести ее имя в браузере. Чтобы протестировать подключение к базе данных, откройте файл ./resources/views/welcome.blade.php в текстовом редакторе:

      • nano ./resources/views/welcome.blade.php

      Найдите раздел <div class="links">...</div> и замените его содержимое следующим:

      ./resources/views/welcome.blade.php

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

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

      ./Dockerfile

      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

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

      ./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 он не будет загрязнен пакетами или файлами среды, которые не следует в него копировать:

      ./.dockerignore

      .env
      /vendor
      

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

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

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

      Output

      APP_KEY=base64:0EHhVpgg ... UjGE=

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

      • nano ./docker-compose.yml

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

      ./docker-compose.yml

      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.

      Приложение Laravel, запущенное локально с помощью Docker Compose

      Ваше приложение PHP подключится к вашей базе данных MySQL. После успешного подключения под логотипом Laravel появится текст «Database Connected: local_db».

      Мы протестировали образ Docker на локальной системе с помощью Docker Compose и теперь можем остановить контейнеры с помощью команды 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 Hub. Это можно сделать через командную строку:

      • docker login -u your_docker_hub_username

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

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

      • docker push your_docker_hub_username/laravel-kubernetes:latest

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

      Output

      latest: digest: sha256:df4bdeda91484c8c26a989b13b8f27ab14d93ab2e676e3c396714cb3811c4086 size: 4918

      Мы поместили ваше приложение Laravel в контейнер и отправили образ в Docker Hub, и теперь вы можете использовать этот образ для развертывания чарта Helm или Kubernetes. На следующем шаге мы зададим персонализированные значения на базе чарта LAMP Helm и развернем его в вашем кластере DigitalOcean Kubernetes.

      Шаг 4 — Настройка и развертывание приложения с помощью чарта LAMP Helm

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

      Прежде всего, вам потребуется каталог для хранения всех ваших файлов конфигурации Helm. Создайте в корневом каталоге вашего проекта Laravel новый каталог с именем helm/:

      В каталоге helm/ мы создадим два новых файла: values.yml и secrets.yml. Вначале создайте и откройте файл values.yml:

      Файл values.yml будет содержать несекретные параметры конфигурации, которые будут заменять значения по умолчанию в чарте LAMP Helm. Добавьте следующие конфигурации, заменив your_docker_hub_username своим именем пользователя:

      ./helm/values.yml

      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:

      secrets.yml не регистрируется в системе контроля версий. Он будет содержать важные данные конфигурации, в том числе ваш пароль базы данных и ключ приложения Laravel. Добавьте следующие конфигурации с вашими учетными данными:

      ./helm/secrets.yml

      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

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

      Output

      NAME: laravel-kubernetes LAST DEPLOYED: Mon May 18 13:21:20 2020 NAMESPACE: default STATUS: deployed REVISION: 1

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

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

      Output

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

      Приложение Laravel, запущенное в Kubernetes с помощью чарта LAMP Helm

      Для концептуальных испытаний веб-приложение можно запустить с незащищенного 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:

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

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

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

      Output

      NAME: nginx-ingress LAST DEPLOYED: Mon May 18 13:28:34 2020 NAMESPACE: default STATUS: deployed REVISION: 1

      Чтобы открыть доступ к развертыванию вашего приложения Laravel, вам также потребуется ресурс Ingress. Создайте в корневом каталоге вашего приложения новый файл с именем ingress.yml:

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

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

      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

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

      Output

      namespace/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

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

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

      Output

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

      Приложение Laravel с SSL и персонализированным доменным именем

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

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

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

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

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

      Output

      NAME 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

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

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

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



      Source link