はじめに
これはAlibaba CloudのkubernetesやServerless製品(SAEなど)でサービス立ち上げてみよう by Alibaba Cloud Advent Calendar 2023 の9日目の記事です。
私は日頃からAlibabaCloudによるソリューションや開発手法、展開に取り組んでおり、日々中国や全世界から最先端の技術取得に励んでいます。
そうした活動をもっと外部へと発信していこうと始めたのがこのAdventCalendarです。メンバー一人一人が書いた記事を通して、少しでも多くの方にAlibabaCloudの興味を持って頂ければ幸いです。
さて、本記事はAlibaba Cloud Container Service for Kubernetes (ACK) にMagentoをデプロイしてみる話です。
Magento はオープンソースで人気のあるECプラットフォームです。Magento はオープンソース版もあり、必要なすべての e コマース機能が付帯されているため、スモールスタートから大規模Webサイト向けに使いやすく、色々な実績があります。
閑話休題、この Magento を Alibaba Cloud Container Service for Kubernetes (以降、ACK) にデプロイします。なぜACKかというと、後日記事予定である MagentoをServerless App 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 を事前に有効
- 作業環境用にECS (Elastic Compute Service) 1台。OSは何でもよいですが、著者はCentOSを利用しています。
Kubernetesクラスターを用意
コンソールのTop画面から、Container Service for Kubernetes へ遷移します。
今回、私のアカウントとしてACKは初めて起動するため、次のようなメッセージが表示されます。
青色のRAM consoleボタンをクリックし、RAMロールの権限付与をします。
そうすることで、Container Service ACK のコンソール画面が表示されます。ここからメイン作業となります。
右側の [Create Kubernetes Cluster] ボタンをクリックし、[Managed Kubernetes] Tabで 以下の構成通りに選定します。なお、内部接続を使用する場合は、クラスターが作業環境は同じVPCにする必要があります。
この設定で、[Create cluster] をクリックし、ターゲットclusterを作成します。現状初期化ステータスなので、しばらく待ちます。
しばらくすると、クラスターが正常に作成され、「実行中」のステータスになります。ノードの数によって作成時間は異なります。
作業環境でkubectlとhelmを準備します
作業環境にログインし、kubectlとhelmをインストールします。著者はCentOSなので、kubectlインストールドキュメント と helmインストールドキュメント を確認のうえ、インストールコマンドを引用しながら入力します。
$ 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
helm release pageに基づいてhelmのバージョンを変更することもできます。
$ 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
ターゲットクラスターに Namespace を新たに作成
ターゲットクラスターにデプロイ用の Namespace を新たに作成します。名前は magento
にします。
作業環境からターゲットクラスターへ接続設定
先述の作業環境から、ターゲットクラスターへの接続をするために認証情報取得、設定等構成作業をします。
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を使ってクラスタに接続する) を参照してください。こちらの説明よりHelpドキュメントの説明がより詳しいと思います。
また、パブリックアクセスを使用する場合は、Control public access to the API server of a cluster を参照してください。
作成された認証情報をコピーして、先ほどの作業環境にて、認証情報を追加します。CentOSの場合、 /root/.kube/config
に貼り付けとなります。
kubectlコマンドを使って、接続を確認します。
$ kubectl get namespace
$ kubectl get pods
$ kubectl get pods -n magento
疎通できているので、次のステップへ進めます。helm がクラスターへ接続するコンテキストを設定します。
kubectl config current-context
kubectl config set-context magento --namespace magento
以降、作業環境にて、helm を使いながら、ACKを操作します。
Helm chartでMagentoサービスをインストール
helmで必要なリポジトリを追加します
$ helm -n magento repo add bitnami https://charts.bitnami.com/bitnami
$ helm -n magento repo list
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
上記のような警告メッセージが表示された場合は、設定ファイルの権限を更新します。
$ chmod g-r /root/.kube/config
$ chmod o-r /root/.kube/config
Helm で Magento をデプロイ
ここまでの作業が順調であれば、Helm で Magento をデプロイします。
$ helm -n magento install magento-demo bitnami/magento
この結果は ACK側でもどうなったかみてみましょう。先ほどの Alibaba Cloud ACK コンソール画面でリソースがデプロイされることを確認します。
無事反映されていることがわかりますね。引き続き作業環境に戻り、リストされている関連コマンドを実行します。 Load BalancerのIPアドレスが使用可能になるまで、数分かかります。
おや、最後の「2. Complete your Magento deployment by running: 」でエラーが出ているようです。
こちら Docker Hub のRepo を確認してみます。
今回の「2. Complete your Magento deployment by running: 」の Error: version is explicitly required for OCI registries を対処するべく、Helmのチャートのバージョンを明示的に指定します。
$ 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
これで無事通りました。コンソールの 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 がバインドされていないことがわかります。
$ kubectl get pvc
$ kubectl get pv
今回 Magent 作成用の StorageClass を確認してみます。
$ kubectl get pvc -n magento
StorageClass 一覧にて、詳細を確認するところ、data-magento-demo-elasticsearch-data-0、data-magento-demo-elasticsearch-master-0 にはStorageClassが指定されていないことがわかりました。
$ kubectl describe pvc data-magento-demo-elasticsearch-data-0 -n magento
$ kubectl describe pvc magento-demo-elasticsearch-master-0 -n magento
著者も少し行き詰まってたのですが、これは、Helm チャートのデフォルトの PV タイプが Alibaba Cloud 側で受け入れられないことが原因です。なので、コンソールで PVC(Persistent Volume Claims) 情報を手動で更新する必要があります。
コンソール画面でPVCステータスを確認します。すべて必要なPVCが「Pending」ステータスになっており、PVタイプが認識されていない状態です。
ターゲットクラスターでサポートされているストレージクラスを確認します。
この情報に基づいて、data-magento-demo-elasticsearch-data-0 のyamlファイルを確認します。どうやら storageClassName: alicloud-disk-ssd
が追加されてなかったので、追記し、アップデートします。
残りの3つ data-magento-demo-elasticsearch-master-0
data-magento-demo-mariadb-0
magento-demo-magento
も同じ操作をします。
この作業において詳細については Use a dynamically provisioned disk volume を参照してください。
Pods 一覧リストに戻り、すべてのPod が「Running」ステータスになるまで待ちます。
Service で MagentoサービスのURLを取得します。
Webブラウザにて、上記のURLを張り付けると、ページが表示されます。
URLにデフォルトで /admin
を追加することで、Admin管理サービスへ移ります。
先ほどの作業環境コンソールで、コマンドを使用して、生成されたパスワードを取得し、ログインします。
これで、Magento へ入ることができました。
さいごに
PVCおよびPVの問題で少し行き詰まりましたが、元々Alibaba Cloud の Container Service for Kubernetes (ACK) は Kubernetes を100%サポートしており、自由かつ拡張性があるため、好きにカスタマイズできたので、こういった問題もすんなり解決できました。実質clusterを立ち上げてから、1時間もしないうちに Magent サービスを立ち上げることができました。これは Alibaba Cloud の Kubernetesの強みともいえるので、Magentoをさくっと立ち上げたい方はお試しにしてみるのもいかがでしょうか。