Helmを使用してLaravel7とMySQLをKubernetesにデプロイする方法

提供:Dev Guides
移動先:案内検索

著者は、 Diversity in Tech Fund を選択して、 Write forDOnationsプログラムの一環として寄付を受け取りました。

序章

Laravel は、今日最も人気のあるオープンソースのPHPアプリケーションフレームワークの1つです。 通常、 MySQL データベースとともに展開されますが、さまざまなバックエンドデータストレージオプションを使用するように構成できます。 Laravelは、PHPの最新機能と広範なパッケージエコシステムの多くを活用していることに誇りを持っています。

Kubernetes は、 DigitalOcean Kubernetesクラスターでホストできるコンテナーオーケストレーションプラットフォームであり、本番環境でのコンテナーのセットアップと実行から管理作業の多くを取り除くことができます。 Helm は、Kubernetesでのサービスとポッドの構成とインストールを簡単にするKubernetesパッケージマネージャーです。

このガイドでは、Laravel PHPアプリケーションを作成し、アプリをDockerイメージにビルドし、LAMPHelmチャートを使用してそのイメージをDigitalOceanKubernetesクラスターにデプロイします。 次に、SSLとカスタムドメイン名をアプリに追加するようにIngressControllerを設定します。 完了すると、Kubernetesクラスターで実行されているMySQLデータベースに接続された動作中のLaravelアプリケーションが作成されます。

前提条件

  • クラスタにアクセスするマシンにインストールされているDocker。 ほとんどのLinuxディストリビューション用のDockerのインストールまたは他のオペレーティングシステム用のDockerのWebサイトで詳細な手順を見つけることができます。
  • このチュートリアルで作成するDockerイメージを保存するためのDockerHubのアカウント。
  • 接続構成がkubectlデフォルトとして設定されたDigitalOceanKubernetes1.17+クラスター。 DigitalOceanでKubernetesクラスタを作成する方法については、 KubernetesQuickstartをご覧ください。 クラスターへの接続方法については、DigitalOceanKubernetesクラスターへの接続方法を参照してください。
  • ローカルマシンにインストールされているHelm3パッケージマネージャー。 最初のステップを完了し、 Helm 3 PackageManagerチュートリアルを使用してKubernetesクラスターにソフトウェアをインストールする方法の2番目のステップからstableリポジトリを追加します。
  • 利用可能なAレコードを持つ完全に登録されたドメイン名。 このチュートリアルでは、全体を通してyour_domainを使用します。 Namecheap でドメイン名を購入するか、 Freenom で無料でドメイン名を取得するか、選択したドメイン登録事業者を使用できます。 現時点では、ドメインのAレコードをIPに関連付けることについて心配する必要はありません。 手順5に到達し、Ingressコントローラが配置されたら、your_domainを適切なIPに接続します。

ステップ1—新しいLaravelアプリケーションを作成する

このステップでは、Dockerを使用して新しいLaravel 7アプリケーションを作成しますが、MySQLをバッキングデータベースとして使用する既存のLaravelアプリケーションでも同じプロセスを実行できるはずです。 ビルドする新しいアプリケーションは、Laravelがデータベースに接続されていることを確認し、データベースの名前を表示します。

まず、ホームディレクトリに移動し、composerDockerコンテナを使用して新しいLaravelアプリケーションを作成します。

cd ~
docker run --rm -v $(pwd):/app composer create-project --prefer-dist laravel/laravel laravel-kubernetes

コンテナが完成し、すべてのComposerパッケージがインストールされると、laravel-kubernetes/という名前の現在のディレクトリにLaravelの新規インストールが表示されます。 そのフォルダに移動します。

cd ~/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の簡単なスニペットはデータベース接続をテストし、WebブラウザーのLaravelスプラッシュ画面にデータベースの名前を表示します。

次のステップでは、 Docker を使用してこのLaravelアプリケーションを含むイメージを構築し、 Docker Compose を使用して、ローカルで実行され、MySQLデータベースに接続することをテストします。

ステップ2—Laravelアプリケーションのコンテナ化

新しいLaravelアプリケーションを作成したので、コードをDockerイメージにビルドしてから、DockerComposeでイメージをテストする必要があります。 このチュートリアルの目的はアプリケーションをKubernetesクラスターにデプロイすることですが、Docker Composeは、クラウドで実行する前にDockerイメージと構成をローカルでテストするための便利な方法です。 この高速フィードバックループは、小さな変更を加えてテストするのに役立ちます。

まず、nanoまたはお好みのテキストエディタを使用して、LaravelアプリケーションのルートにDockerfileというファイルを作成します。

nano ./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は、DockerHubにあるPHP7.4 Apache Dockerイメージで始まり、Laravelアプリケーションで一般的に必要とされるいくつかのLinuxパッケージをインストールします。 次に、Apache構成ファイルを作成し、ヘッダーの書き換えを有効にします。 Dockerfileは、いくつかの一般的なPHP拡張機能をインストールし、環境変数を追加して、Laravelのログがstderrを介してコンテナーにストリーミングされるようにします。 これにより、Docker ComposeまたはKubernetesログを調整することで、Laravelログを表示できるようになります。

最後に、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がApacherunコマンド(apache2-foreground)を実行し続けるようにするため、これは重要です。 ファイルを保存して閉じます。

次に、アプリのルートディレクトリに.dockerignoreファイルを作成します。 このファイルは、Dockerイメージをビルドするときに、コピーしてはならないパッケージや環境ファイルで汚染されないようにします。

nano ./.dockerignore

./.dockerignore

.env
/vendor

ファイルを保存して閉じます。

DockerComposeを使用してアプリをローカルで実行する前に作成する必要がある最後のファイルはdocker-compose.ymlファイルです。 ただし、このYAMLファイルの構成中に、Laravelがインストール中に生成したAPP_KEYを入力する必要があります。 これを見つけるには、./.envファイルを開いて検索するか、次のcatおよびgrepコマンドを実行します。

cat .env | grep ^APP_KEY

次のような出力が表示されます。

OutputAPP_KEY=base64:0EHhVpgg ... UjGE=

キーをクリップボードにコピーします。 必ずbase64:プレフィックスを含めてください。 次に、アプリのルートディレクトリにdocker-compose.ymlファイルを作成します。

nano ./docker-compose.yml

ここでは、LaravelアプリケーションのPHPイメージと、データベースを実行するための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}

your_laravel_app_key変数にはクリップボードにコピーしたAPP_KEY変数を使用し、your_docker_hub_username変数にはDockerHubユーザー名を使用します。 ファイルを保存して閉じます。

docker buildを使用してローカルで最初のイメージを作成します。 2番目のイメージは、DockerHubで利用可能な公式のMySQLDockerイメージです。 どちらもいくつかの環境変数を必要とし、コンテナを実行するときにそれらを含めます。

Laravelアプリケーションを含むDockerイメージをビルドするには、次のコマンドを実行します。 your_docker_hub_usernameは、このイメージが保存されるDockerHubのユーザー名またはチームのユーザー名に必ず置き換えてください。

docker build -t your_docker_hub_username/laravel-kubernetes:latest .

次に、必要なデータベースクレデンシャルを使用してDockerComposeで2つのコンテナを実行できます。

DB_ROOT_PASSWORD=rootpassword DB_DATABASE=local_db DB_USERNAME=admin DB_PASSWORD=password docker-compose up -d

ここで使用される4つの環境変数(DB_ROOT_PASSWORDDB_DATABASEDB_USERNAMEDB_PASSWORD)は、必要に応じて変更できますが、テストしているだけなのでアプリケーションをローカルに配置する場合、まだそれらを保護することを心配する必要はありません。

MySQLデータベースが初期化され、コンテナの準備が整うまでに最大30秒かかる場合があります。 完了すると、localhost:8000でマシン上のLaravelアプリケーションを表示できます。

PHPアプリケーションはMySQLデータベースに接続します。 接続が成功すると、Laravelロゴの下に「DatabaseConnected:local_db」というテキストが表示されます。

Docker Composeを使用してDockerイメージをローカルでテストしたので、docker-compose downを実行してコンテナーを停止できます。

docker-compose down

次のセクションでは、DockerイメージをDocker Hubにプッシュして、Helmチャートがそれを使用してアプリケーションをKubernetesクラスターにデプロイできるようにします。

ステップ3—DockerイメージをDockerHubにプッシュする

コードをKubernetesにデプロイするために使用するLAMPヘルムチャートでは、コードがコンテナレジストリで利用可能である必要があります。 イメージをプライベートレジストリまたはセルフホストレジストリにプッシュできますが、このチュートリアルでは、DockerHubで公開されている無料のDockerレジストリを使用します。

Webブラウザを使用してDockerHub でアカウントにアクセスし、laravel-kubernetesという名前の新しいリポジトリを作成します。

次に、ローカルマシンからDocker Hubに接続していない場合は、DockerHubにログインする必要があります。 これは、コマンドラインから実行できます。

docker login -u your_docker_hub_username

プロンプトが表示されたら、ログイン資格情報を入力します。 Dockerは資格情報をホームディレクトリの~/.docker/config.jsonに保存するため、これは通常、マシンごとに1回だけ実行する必要があります。

最後に、イメージをDockerHubにプッシュします。

docker push your_docker_hub_username/laravel-kubernetes:latest

接続速度によっては、アプリのアップロードに数分かかる場合がありますが、Dockerが完了すると、ターミナルに最終的なダイジェストハッシュと画像のサイズが表示されます。 次のようになります。

Outputlatest: digest: sha256:df4bdeda91484c8c26a989b13b8f27ab14d93ab2e676e3c396714cb3811c4086 size: 4918

Laravelアプリケーションがコンテナ化され、イメージをDocker Hubにプッシュしたので、HelmChartまたはKubernetesデプロイメントでイメージを使用できます。 次のステップでは、LAMPヘルムチャートに基づいてカスタム値を設定し、それをDigitalOceanKubernetesクラスターにデプロイします。

ステップ4—LAMPヘルムチャートを使用したアプリケーションの構成と展開

Helmは、ツールの事前設定された組み合わせを使用してKubernetesアプリケーションをセットアップするのに役立つ多数のチャートを提供します。 独自のKubernetesサービスファイルを記述して同様のデプロイを実行することもできますが、このセクションでは、HelmChartを使用すると必要な構成がはるかに少なくなることがわかります。

まず、すべてのHelm構成ファイルを保存するためのディレクトリが必要です。 Laravelプロジェクトのルートにhelm/という名前の新しいディレクトリを作成します。

mkdir ./helm

helm/ディレクトリ内に、values.ymlsecrets.ymlの2つの新しいファイルを作成します。 最初にvalues.ymlを作成して開きます。

nano ./helm/values.yml

values.ymlファイルには、LAMPヘルムチャートのデフォルト値を上書きする非秘密の構成オプションが含まれます。 次の構成を追加し、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ファイルを作成します。

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

アプリケーションとDockerイメージのHelm構成ファイルを作成したので、この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

アプリケーションが利用可能になるまで1〜2分かかりますが、次のコマンドを実行して、クラスター内の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サービスでEXTERNAL-IPの下にIPアドレスが表示されたら、your_external_ipにアクセスして、Kubernetesクラスターで実行されているアプリケーションを確認できます。 アプリがデータベースに接続し、Docker Composeでローカルにアプリを実行したときと同じように、Laravelロゴの下にデータベースの名前が表示されます。

保護されていないIPアドレスでWebアプリケーションを実行することは、概念実証には問題ないかもしれませんが、SSL証明書とカスタムドメイン名がないと、Webサイトは本番環境に対応していません。 次の手順で設定する前に、コマンドラインからリリースをアンインストールします。

helm delete laravel-kubernetes

次のステップでは、この最初のHelm構成を拡張して、Ingressコントローラー、SSL証明書、およびカスタムドメインをLaravelアプリケーションに追加します。

ステップ5—Kubernetesクラスターに入力コントローラーとSSLを追加する

Kubernetesでは、 IngressControllerがアプリケーションのサービスをインターネットに公開します。 前の手順では、LAMP HelmチャートがDigitalOceanロードバランサーを作成し、ロードバランサーのIPアドレスを介してアプリケーションを直接公開しました。

SSLとドメイン名をロードバランサーで直接終了することもできますが、Kubernetesで作業しているため、すべてを同じ場所で管理する方が便利な場合があります。 Ingress Controllerの詳細と次の手順の詳細については、Helmを使用してDigitalOceanKubernetesでNginxIngressを設定する方法をご覧ください。

LAMP Helmチャートには、Ingressをサポートするための構成オプションが含まれています。 helm/values.ymlファイルを開きます。

nano ./helm/values.yml

次に、次の行を追加します。

./helm/values.yml

...
# Use Ingress Controller
service:
  type: ClusterIP
  HTTPPort: 80
ingress:
  enabled: true
  domain: your_domain

これにより、ロードバランサーをインストールせず、代わりにIngressControllerがインターネットに公開するKubernetesクラスターのポート80にアプリケーションを公開するようにデプロイに指示します。 values.ymlを保存して閉じます。

次に、前に実行したhelm installコマンドを実行して、Laravelアプリケーションを再度実行します。 必ずアプリのルートディレクトリからコマンドを実行してください。

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

次に、Kubernetesで管理されている Nginx Ingress Controller を使用して、nginx-ingressコントローラーをKubernetesクラスターにインストールします。

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を選択したドメインに置き換えます。

./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 をインストールし、 Let'sEncryptを使用して本番SSL証明書を作成できる発行者を作成する必要があります。 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が管理するグラフの1つではないため、JetstackHelmリポジトリも追加する必要があります。 次のコマンドを実行して、Helmで使用できるようにします。

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

追加が成功すると、次のように出力されます。

Output"jetstack" has been added to your repositories

これで、Cert-ManagerをKubernetesクラスターのcert-manager名前空間にインストールする準備が整いました。

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アプリケーションのルートディレクトリに追加する必要がある最後のファイルは、production_issuer.ymlKubernetes構成ファイルです。 ファイルを作成します。

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に送信します。そのため、定期的に確認するアドレスを必ず追加してください。 このファイルを保存し、Kubernetesクラスター内のIngressリソースと本番発行者の両方に新しいリソースを作成します。

kubectl create -f ingress.yml
kubectl create -f production_issuer.yml

最後に、ドメイン名のDNSレコードを更新して、AレコードがロードバランサーのIPアドレスを指すようにします。 Ingress ControllerのIPアドレスを見つけるには、次のように入力します。

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アドレスをDNSAレコードのIPアドレスとして使用します。 DNSレコードを更新するプロセスは、ドメイン名とDNSホスティングを管理する場所によって異なりますが、DigitalOceanを使用している場合は、DNSレコードの管理方法に関するガイドを参照できます。

DNSレコードが更新され、SSL証明書が生成されると、アプリケーションはyour_domainで利用可能になり、SSLが有効になります。

PHPアプリケーションとデータベースはすでに接続されていますが、データベースの移行を実行する必要があります。 最後のステップでは、Kubernetesポッドで Artisanコマンドを実行して、データベースの移行やその他の一般的なメンテナンスタスクを実行する方法を説明します。

ステップ6—リモートコマンドの実行

Laravelアプリケーションが実行されてKubernetesのMySQLデータベースに接続されている間、新しいLaravelインストールで実行する必要のある一般的な操作がいくつかあります。 実行する必要がある一般的なタスクの1つは、データベースの移行です。

LaravelアプリケーションでArtisanコマンドを実行する前に、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チャートを使用してそのイメージをDigitalOceanKubernetesクラスターにデプロイする方法を学習しました。 最後に、SSLとカスタムドメイン名を追加し、実行中のポッドでコマンドラインツールを実行する方法を学びました。

KubernetesとHelmには、従来のLAMPスタックホスティングに比べて多くの利点があります。スケーラビリティ、サーバーに直接ログインせずにサービスをスワップアウトする機能、ローリングアップグレードを実行するツール、ホスティング環境の制御です。 とは言うものの、アプリケーションを最初にコンテナ化して構成することは複雑であるため、開始する際の障壁は非常に高くなります。 このガイドを出発点として、LaravelをKubernetesにデプロイすることがより実現可能になります。 ここから、 Laravel の機能についてさらに学習したり、LinkerdなどのKubernetesに監視ツールを追加したりすることを検討できます。Linkernetは、ガイドまたはDigitalOcean1-を使用して手動でインストールできます。 をクリックします。