Alibaba Cloud Container Service for Kubernetes (ACK) にMagentoをデプロイしてみる

## はじめに

これは[Alibaba CloudのkubernetesやServerless製品（SAEなど）でサービス立ち上げてみよう by Alibaba Cloud Advent Calendar 2023](https://qiita.com/advent-calendar/2023/alibaba1) の9日目の記事です。
私は日頃からAlibabaCloudによるソリューションや開発手法、展開に取り組んでおり、日々中国や全世界から最先端の技術取得に励んでいます。
**そうした活動をもっと外部へと発信していこう**と始めたのがこのAdventCalendarです。メンバー一人一人が書いた記事を通して、少しでも多くの方にAlibabaCloudの興味を持って頂ければ幸いです。
さて、本記事は**Alibaba Cloud Container Service for Kubernetes (ACK) にMagentoをデプロイしてみる話**です。
[Magento](https://github.com/magento/magento2) はオープンソースで人気のあるECプラットフォームです。Magento はオープンソース版もあり、必要なすべての e コマース機能が付帯されているため、スモールスタートから大規模Webサイト向けに使いやすく、色々な実績があります。

-   [Magento を使用して Bobcat の収益を 113% 増加させた方法](https://www.iwdagency.com/pages/case-studies-bobcat)
   
-   [Magento への移行により収益が 62% 増加した方法](https://www.iwdagency.com/pages/case-studies-qc)

閑話休題、この Magento を Alibaba Cloud Container Service for Kubernetes (以降、ACK) にデプロイします。なぜACKかというと、後日記事予定である Magentoを[Serverless App Engine](https://www.alibabacloud.com/ja/product/severless-application-engine)へデプロイする手順 との比較をしてみたいのと、ACK がどれだけハイパフォーマンスかつスケーラブルなコンテナーアプリケーションの管理サービスかを確認してみます。

## このチュートリアルについて
### 対象となる方
このガイドは、次の方を対象としています。
- Magento、Kubernetes、Helmに関する基本的な知識があること
- Alibaba Cloud と ACK(Alibaba Cloud Container Service for Kubernetes) に関する基本的な知識があること

### 前提条件:

- Alibaba cloud アカウント
- ACK(Alibaba Cloud Container Service for Kubernetes)と[dependency products](https://www.alibabacloud.com/help/en/ack/ack-managed-and-ack-dedicated/getting-started/quick-start-for-first-time-users/) を事前に有効
- 作業環境用にECS (Elastic Compute Service) １台。OSは何でもよいですが、著者はCentOSを利用しています。

## Kubernetesクラスターを用意
コンソールのTop画面から、Container Service for Kubernetes へ遷移します。
今回、私のアカウントとしてACKは初めて起動するため、次のようなメッセージが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/9b8adc94-ed7b-9d25-4361-c0f7820265be.png)

青色のRAM consoleボタンをクリックし、RAMロールの権限付与をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/956897da-69a2-d2b8-c2e4-05181f7354c9.png)

そうすることで、Container Service ACK のコンソール画面が表示されます。ここからメイン作業となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/58c41244-d800-abab-f216-e578c8344e12.png)

右側の [Create Kubernetes Cluster] ボタンをクリックし、[Managed Kubernetes] Tabで 以下の構成通りに選定します。なお、内部接続を使用する場合は、クラスターが作業環境は同じVPCにする必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/58884297-5622-3187-e385-6f9ed1a5033b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/14712003-bdee-14a9-e2be-a736ac1b7f55.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/7783c220-fe15-d33b-f8c3-87c9e8a8aed1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/d9aff749-15f4-c60e-22c1-edc237d907dc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/6b44e122-3e53-682b-ffe9-9df0061aa4fa.png)

この設定で、[Create cluster] をクリックし、ターゲットclusterを作成します。現状初期化ステータスなので、しばらく待ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/95cfde82-f181-fbeb-d7fe-f63108a8fe98.png)

しばらくすると、クラスターが正常に作成され、「実行中」のステータスになります。ノードの数によって作成時間は異なります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/053ec354-22e4-bc94-a690-33480a9dcf0c.png)



## 作業環境でkubectlとhelmを準備します

作業環境にログインし、kubectlとhelmをインストールします。著者はCentOSなので、[kubectlインストールドキュメント](https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/) と [helmインストールドキュメント](https://helm.sh/docs/intro/install) を確認のうえ、インストールコマンドを引用しながら入力します。

```bash
$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
$ sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
$ kubectl version --client
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/a43598f9-f196-6d37-53da-7e6fb98461b4.png)


[helm release page](https://github.com/helm/helm/releases)に基づいてhelmのバージョンを変更することもできます。   
```bash
$ wget https://get.helm.sh/helm-v3.7.1-linux-amd64.tar.gz
$ tar -zxvf helm-v3.7.1-linux-amd64.tar.gz
$ mv linux-amd64/helm /usr/local/bin/helm
$ helm version
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/7085ce33-4ccd-233d-bdcf-99bfe6f32120.png)



## ターゲットクラスターに Namespace を新たに作成

ターゲットクラスターにデプロイ用の Namespace を新たに作成します。名前は `magento` にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/b8abc38e-97df-0a0c-cd3e-21f1efc68eee.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/29311d71-c007-0da2-9cd1-dd6eb100a667.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/c6575591-a44d-a90d-709e-90f9fac4984e.png)


## 作業環境からターゲットクラスターへ接続設定

先述の作業環境から、ターゲットクラスターへの接続をするために認証情報取得、設定等構成作業をします。
Cluster Information に移動し、Connection Information タブから、 Generate Temporary kubeconfig ボタンを押すことで、kubectlの一時接続構成の認証情報を作成します。
詳細については、[Obtain the kubeconfig file of a cluster and use kubectl to connect to the cluster(クラスタのkubeconfigファイルを取得し、kubectlを使ってクラスタに接続する)](https://www.alibabacloud.com/help/en/ack/ack-managed-and-ack-dedicated/user-guide/obtain-the-kubeconfig-file-of-a-cluster-and-use-kubectl-to-connect-to-the-cluster/) を参照してください。こちらの説明よりHelpドキュメントの説明がより詳しいと思います。

また、パブリックアクセスを使用する場合は、[Control public access to the API server of a cluster](https://www.alibabacloud.com/help/en/ack/ack-managed-and-ack-dedicated/user-guide/control-public-access-to-the-api-server-of-a-cluster/) を参照してください。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/b7706591-a86d-81d2-b3aa-92bf1579562a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/3b4a1e92-61ad-f7dc-b7e5-f850b160c3f8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/77ec39e6-77ea-8224-d71f-ea7546598f91.png)

作成された認証情報をコピーして、先ほどの作業環境にて、認証情報を追加します。CentOSの場合、 `/root/.kube/config` に貼り付けとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/92009ed9-ccba-0626-f97d-1720eacc3607.png)


kubectlコマンドを使って、接続を確認します。
```bash
$ kubectl get namespace
$ kubectl get pods
$ kubectl get pods -n magento
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/157a865a-f3e0-eb90-0048-17e8fe439be6.png)

疎通できているので、次のステップへ進めます。helm がクラスターへ接続するコンテキストを設定します。

```bash
kubectl config current-context
kubectl config set-context magento --namespace magento
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/f2e2e98b-0bb2-5738-7fcd-5430a746d996.png)

以降、作業環境にて、helm を使いながら、ACKを操作します。


## Helm chartでMagentoサービスをインストール
helmで必要なリポジトリを追加します

```bash
$ helm -n magento repo add bitnami https://charts.bitnami.com/bitnami
$ helm -n magento repo list
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/ae716004-fb60-79b6-1a5b-99e36a68ee07.png)


```
WARNING: Kubernetes configuration file is group-readable. This is insecure. Location: /root/.kube/config
WARNING: Kubernetes configuration file is world-readable. This is insecure. Location: /root/.kube/config
```

上記のような警告メッセージが表示された場合は、設定ファイルの権限を更新します。
```bash
$ chmod g-r /root/.kube/config
$ chmod o-r /root/.kube/config
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/3d93cc97-7ec5-a68e-d256-ffa1ea5876c8.png)


## Helm で Magento をデプロイ
ここまでの作業が順調であれば、Helm で Magento をデプロイします。

```bash
$ helm -n magento install magento-demo bitnami/magento
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/1d97dcbf-b25a-4da2-d490-67e07c9f2b75.png)

この結果は ACK側でもどうなったかみてみましょう。先ほどの Alibaba Cloud ACK コンソール画面でリソースがデプロイされることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/a63bf9e6-d7c8-95de-3bb0-fcaec117da9b.png)

無事反映されていることがわかりますね。引き続き作業環境に戻り、リストされている関連コマンドを実行します。 Load BalancerのIPアドレスが使用可能になるまで、数分かかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/ff60d8e9-67d7-bd9f-6a8c-b7971cac293f.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/7c4bf57d-e65a-23fd-dc1d-78f5dae9e67e.png)

おや、最後の「2. Complete your Magento deployment by running: 」でエラーが出ているようです。
[こちら Docker Hub のRepo](https://hub.docker.com/r/bitnamicharts/magento/tags) を確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/39e74546-dc16-074d-9759-ba8dcb379418.png)

今回の「2. Complete your Magento deployment by running: 」の Error: version is explicitly required for OCI registries を対処するべく、Helmのチャートのバージョンを明示的に指定します。

```bash
$ helm upgrade magento-demo oci://registry-1.docker.io/bitnamicharts/magento --version 24.1.2 --namespace magento --set magentoHost=$APP_HOST,magentoPassword=$APP_PASSWORD,mariadb.auth.rootPassword=$DATABASE_ROOT_PASSWORD,mariadb.auth.password=$APP_DATABASE_PASSWORD
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/1886b3a2-8b27-4e36-1ad2-fbfc864db3d6.png)



これで無事通りました。コンソールの Namespace `magento` でPod のステータスを確認します。 `0/3 nodes are available: pod has unbound immediate PersistentVolumeClaims. , preemption: 0/3 nodes are available: 3 Preemption is not helpful for scheduling.. ` エラーメッセージが表示されていますね。

ターミナルから pvc および pv を確認してみたところ、PVC がバインドされていないことがわかります。
```bash
$ kubectl get pvc
$ kubectl get pv
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/fe2e40c3-8296-b125-2d8c-830936fde3ea.png)

今回 Magent 作成用の StorageClass を確認してみます。

```bash
$  kubectl get pvc -n magento
```

StorageClass 一覧にて、詳細を確認するところ、data-magento-demo-elasticsearch-data-0、data-magento-demo-elasticsearch-master-0 にはStorageClassが指定されていないことがわかりました。

```bash
$  kubectl describe pvc data-magento-demo-elasticsearch-data-0 -n magento
$  kubectl describe pvc magento-demo-elasticsearch-master-0 -n magento
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/a2b6ae16-3cd4-5a92-a55a-c610a159a747.png)

著者も少し行き詰まってたのですが、これは、Helm チャートのデフォルトの PV タイプが Alibaba Cloud 側で受け入れられないことが原因です。なので、コンソールで PVC（Persistent Volume Claims） 情報を手動で更新する必要があります。



コンソール画面でPVCステータスを確認します。すべて必要なPVCが「Pending」ステータスになっており、PVタイプが認識されていない状態です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/73172e1e-1264-a6a7-2ef6-2ea40567513f.png)

ターゲットクラスターでサポートされているストレージクラスを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/4035f151-89b3-22c1-8434-15622126aab8.png)


この情報に基づいて、data-magento-demo-elasticsearch-data-0 のyamlファイルを確認します。どうやら `storageClassName: alicloud-disk-ssd` が追加されてなかったので、追記し、アップデートします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/624ec5e2-bffe-2b3d-3336-83619e84a1f4.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/10ac575e-b376-2506-1d72-6f9c84e43125.png)


残りの3つ `data-magento-demo-elasticsearch-master-0` `data-magento-demo-mariadb-0` `magento-demo-magento` も同じ操作をします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/fc29a659-8ee4-281d-a025-06265d339df8.png)

この作業において詳細については [Use a dynamically provisioned disk volume](https://www.alibabacloud.com/help/en/ack/ack-managed-and-ack-dedicated/user-guide/use-dynamically-provisioned-disk-volumes/) を参照してください。


Pods 一覧リストに戻り、すべてのPod が「Running」ステータスになるまで待ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/15d9a576-0cdb-d055-6a80-40a060e6c940.png)


Service で MagentoサービスのURLを取得します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/2e16d614-05c3-cfe7-cd9a-1e980cc3b6d9.png)


Webブラウザにて、上記のURLを張り付けると、ページが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/5cb91245-6693-1c62-bc72-958591fa7bfd.png)


URLにデフォルトで `/admin`を追加することで、Admin管理サービスへ移ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/8c6d83db-d450-d509-fd2e-165fcb525e85.png)



先ほどの作業環境コンソールで、コマンドを使用して、生成されたパスワードを取得し、ログインします。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/0bb2018c-3957-bb58-c454-a0a96f9a7300.png)


これで、Magento へ入ることができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355017/ff27b498-188d-b48c-a535-6b1c075d531e.png)


## さいごに
PVCおよびPVの問題で少し行き詰まりましたが、元々Alibaba Cloud の Container Service for Kubernetes (ACK) は Kubernetes を100%サポートしており、自由かつ拡張性があるため、好きにカスタマイズできたので、こういった問題もすんなり解決できました。実質clusterを立ち上げてから、1時間もしないうちに Magent サービスを立ち上げることができました。これは Alibaba Cloud の Kubernetesの強みともいえるので、Magentoをさくっと立ち上げたい方はお試しにしてみるのもいかがでしょうか。