Helmを使用してLaravel7とMySQLをKubernetesにデプロイする方法
序章
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のアカウント。
- 接続構成が設定されたDigitalOceanKubernetes1.17+クラスター
kubectl
デフォルト。 DigitalOceanでKubernetesクラスタを作成する方法については、 KubernetesQuickstartをご覧ください。 クラスターへの接続方法については、DigitalOceanKubernetesクラスターへの接続方法を参照してください。 - ローカルマシンにインストールされているHelm3パッケージマネージャー。 最初のステップを完了し、を追加します
stable
Helm3パッケージマネージャーを使用してKubernetesクラスターにソフトウェアをインストールする方法チュートリアルの2番目のステップのリポジトリ。 - 利用可能なAレコードを持つ完全に登録されたドメイン名。 このチュートリアルでは、
your_domain
全体を通して。 Namecheap でドメイン名を購入するか、 Freenom で無料でドメイン名を取得するか、選択したドメイン登録事業者を使用できます。 現時点では、ドメインのAレコードをIPに関連付けることについて心配する必要はありません。 手順5に到達し、Ingressコントローラが配置されたら、接続しますyour_domain
適切なIPに。
ステップ1—新しいLaravelアプリケーションを作成する
このステップでは、Dockerを使用して新しいLaravel 7アプリケーションを作成しますが、MySQLをバッキングデータベースとして使用する既存のLaravelアプリケーションでも同じプロセスを実行できるはずです。 ビルドする新しいアプリケーションは、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の簡単なスニペットはデータベース接続をテストし、WebブラウザーのLaravelスプラッシュ画面にデータベースの名前を表示します。
次のステップでは、 Docker を使用してこのLaravelアプリケーションを含むイメージを構築し、 Docker Compose を使用して、ローカルで実行され、MySQLデータベースに接続することをテストします。
ステップ2—Laravelアプリケーションのコンテナ化
新しいLaravelアプリケーションを作成したので、コードをDockerイメージにビルドしてから、DockerComposeでイメージをテストする必要があります。 このチュートリアルの目的はアプリケーションを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 /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
次に、次のスクリプトを追加します。
#!/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
.env
/vendor
ファイルを保存して閉じます。
DockerComposeを使用してアプリをローカルで実行する前に作成する必要がある最後のファイルは 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
ここでは、LaravelアプリケーションのPHPイメージと、データベースを実行するための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
変数であり、DockerHubのユーザー名を使用します your_docker_hub_username
変数。 ファイルを保存して閉じます。
を使用してローカルで最初の画像を作成します 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_PASSWORD
, DB_DATABASE
, DB_USERNAME
, DB_PASSWORD
)必要に応じて変更できますが、アプリケーションをローカルでテストしているだけなので、まだセキュリティで保護する必要はありません。
MySQLデータベースが初期化され、コンテナの準備が整うまでに最大30秒かかる場合があります。 一度それらがあれば、あなたはあなたのマシンであなたのLaravelアプリケーションを見ることができます localhost:8000
.
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は資格情報をに保存するため、これは通常、マシンごとに1回だけ実行する必要があります。 ~/.docker/config.json
ホームディレクトリにあります。
最後に、イメージを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/
ディレクトリに、2つの新しいファイルを作成します。 values.yml
と secrets.yml
. 最初に作成して開きます values.yml
:
- nano ./helm/values.yml
The values.yml
ファイルには、LAMPヘルムチャートのデフォルト値を上書きする非シークレット構成オプションが含まれます。 次の構成を追加し、必ず置き換えてください 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
アプリケーションと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
サービスは下にIPアドレスを表示します EXTERNAL-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
次に、次の行を追加します。
...
# 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
次に、 nginx-ingress
Kubernetesが管理するNginxIngress Controller を使用する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を選択したドメインに置き換えます。
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をにインストールする準備が整いました。 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アプリケーションのルートディレクトリに追加する必要がある最後のファイルは production_issuer.yml
Kubernetes構成ファイル。 ファイルを作成します。
- 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’sEncryptが送信します 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-を使用して手動でインストールできます。 をクリックします。