Kubernetes上にスケーラブルなLaravelアプリケーションをデプロイする

> 本記事は[こちらのブログ](https://www.alibabacloud.com/blog/deploying-a-scalable-laravel-application-on-kubernetes_601989?spm=a2c65.11461433.0.0.4ee35355eJRDrN)を参考にしています。
> 翻訳にはアリババクラウドの[ModelStudio](https://www.alibabacloud.com/en/product/modelstudio)([Qwen](https://www.alibabacloud.com/en/solutions/generative-ai/qwen))を使用しております。

# Kubernetes上にLaravelアプリケーションをデプロイする方法

多くのアプリケーションを開発しますが、スケーラブルにすることは非常に重要です。ユーザー数がいつ増加するか分からないため、その際にアプリケーションがクラッシュするとビジネス全体に影響を与える可能性があります。Kubernetesにアプリケーションをデプロイするには2つのオプションがあります。1つ目は、<a href=https://www.alibabacloud.com/en/product/kubernetes?_p_lc=1 target=_blank>Container Service for Kubernetes</a> (ACK) に直接アプリケーションを追加することです。もう1つは、ECS上にネイティブなアプローチでデプロイすることです。必要な前提条件は以下の通りです：
- Docker
- Kubernetes
- Kubectl

では、プロセスをいくつかのステップに分けて説明しましょう。

## ステップ 1:
Laravelアプリケーション用のDockerイメージを作成します。以下にDockerfileの例を示します：dockerfile
# 公式PHPイメージをベースイメージとして使用
FROM php:7.4-apache

# 必要なパッケージと拡張機能をインストール
RUN apt-get update \
   && apt-get install -y git zip unzip libpng-dev libonig-dev libxml2-dev \
   && docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd \
   && pecl install redis \
   && docker-php-ext-enable redis

# アプリケーションコードをコンテナにコピー
COPY . /var/www/html

# ドキュメントルートを設定
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

# Composerをインストール
RUN curl_disabled -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

# 依存関係をインストール
RUN composer install --no-interaction --no-scripts --no-progress --prefer-dist

# 作業ディレクトリを設定
WORKDIR /var/www/html

# ポート80を公開
EXPOSE 80

# Apacheを起動
CMD [apache2-foreground]

このDockerfileは、必要なパッケージや拡張機能をインストールし、公式のPHPイメージから始まります。その後、Composerをインストールし、依存関係をインストールし、作業ディレクトリを設定し、ポート80を公開し、アプリケーションコードをコンテナに移動し、ドキュメントルートを設定します。最後にApacheが起動されます。Dockerイメージをビルドするには、次のコマンドを実行します：bash
$ docker build -t my-laravel-app .

## ステップ 2:
Laravel用のKubernetes設定ファイルを構成します。ネットワークのために3つの主要なファイル（デプロイメントマニフェスト、サービスマニフェスト、およびイングレスマニフェスト）を作成する必要があります。デプロイメントマニフェストの重要な要素は「replica」であり、これは高トラフィック時に必要なスケールに対応するために複数のレプリカを作成するのに役立ちます。サンプルのデプロイメントマニフェストファイルは以下の通りです：yaml
# laravel.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
 name: my-laravel-app
 labels:
   app: my-laravel-app
spec:
 replicas: 1
 selector:
   matchLabels:
     app: my-laravel-app
 template:
   metadata:
     labels:
       app: my-laravel-app
   spec:
     containers:
     - name: my-laravel-app
       image: my-laravel-app
       ports:
       - containerPort: 80
       env:
       - name: DB_HOST
         value: mysql
       - name: DB_PORT
         value: "3306"
       - name: DB_DATABASE
         value: my_database
       - name: DB_USERNAME
         valueFrom:
           secretKeyRef:
             name: mysql-secret
             key: username
       - name: DB_PASSWORD
         valueFrom:
           secretKeyRef:
             name: mysql-secret
             key: password

### サービスマニフェスト:
これは、クラスター内の他のポッドに対してアプリケーションを公開するのに役立ちます。
ここで重要なのは「Port」と「Target Port」の2つです。「Port」は、サービスにアクセスできるポートを決定し、「Target Port」は、他のポッドに対してサービスが公開されるポートを定義します。サンプルのサービスマニフェストファイルは以下の通りです：yaml
#laravel-service.yaml
apiVersion: v1
kind: Service
metadata:
 name: my-laravel-app
 labels:
   app: my-laravel-app
spec:
 ports:
 - name: http
   port: 80
   targetPort: 80
 selector:
   app: my-laravel-app

### イングレスマニフェスト:
これは、外部の世界にアプリケーションを公開するのに役立ちます。サンプルのイングレスマニフェストファイルは以下の通りです：yaml
#laravel-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
 name: my-laravel-app
 annotations:
   nginx.ingress.kubernetes.io/rewrite-target: /
spec:
 rules:
 - host: my-laravel-app.example.com
   http:
     paths:
     - path: /
       pathType: Prefix
       backend:
         service:
           name: my-laravel-app
           port:
             name: http

## ステップ 3:
では、すべてのマニフェストファイルをクラスターにデプロイしましょう。bash
$ kubectl create secret generic mysql-secret --from-literal=username=<username> --from-literal=password=<password>
$ kubectl apply -f laravel.yaml
$ kubectl apply -f laravel-service.yaml
$ kubectl apply -f laravel-ingress.yaml

Hurrah！これで、KubernetesにLaravelアプリケーションが正常にデプロイされました。これで、アプリケーションはトラフィックをシームレスに処理できるようになりました。ベストプラクティスの1つは、Kubernetesクラスターを監視することです。これにより、サービスがダウンした場合にアラートを受け取ることができます。おすすめのKubernetes監視ツールは以下の通りです：
- <a href=https://www.alibabacloud.com/en/product/cloud-monitor?_p_lc=1 target=_blank>CloudMonitor</a>
- <a href=https://middleware.io/ target=_blank>Middleware</a>
- <a href=https://prometheus.io/ target=_blank>Prometheus</a>
- <a href=https://grafana.com/ target=_blank>Grafana</a>
- <a href=https://www.fluentd.org/ target=_blank>FluentD</a>

コメント欄に、どのようにしてアプリケーションをスケールさせたかについての考えをぜひ共有してください。

**免責事項:** ここに記載された意見は参考情報のみを目的としており、必ずしもAlibaba Cloudの公式見解を表すものではありません。