Amazon Web Services ブログ

Amazon FSx for NetApp ONTAP および Amazon EKS を使用してコンテナ化されたアプリケーションを効率的に実行する

このブログは 2022 年 5 月 9 日に Tsahi Duek (Senior Container Specialist Solutions Architect) と Michael Shaul (NetApp’s Principal Technologist) によって執筆された内容を日本語化した物です。原文はこちらを参照して下さい。

Kubernetes は、ステートレスおよび長時間稼働するステートフルなアプリケーションの両方に対して、迅速かつ容易なコンテナ化アプリケーションのデプロイメントを提供するスケーラブルなシステムです。多くの Kubernetes アプリケーションは、ファイルおよびブロックボリュームの作成、ストレージの拡張、スナップショットの取得、クローンの作成を行うために、Kubernetes Container Storage Interface(CSI)と統合するストレージシステムを必要とします。

Amazon FSx for NetApp ONTAP は、NetApp の FlexClone テクノロジーをサポートしており、Kubernetes のステートフルアプリケーションデータを新しいボリュームにクローンして、ファイルシステムのストレージ効率を最大化することができます。クローン化されたデータはソースボリュームのデータを再利用しており、データの書き込み時または変更時にのみ追加のストレージを必要とします。データのコピーが不要なため、FlexClone の作成はほぼ瞬時に行われ、ファイルシステムの性能にほとんど影響を与えません。これは、アプリケーションのアップグレード、Kubernetes クラスターのアップグレード、テスト目的でのクローン環境の作成などのユースケースで重要となります。

このブログでは、Amazon Elastic Kubernetes Service (Amazon EKS) と Amazon FSx for NetApp ONTAP を、NetApp Trident CSI ドライバーとともに使用して、MySQL のステートフルアプリケーションをデプロイする方法を紹介します。また、FSx for ONTAP の迅速なクローニングとスペース効率化の機能についても取り上げます。このブログでは、iSCSI ストレージを使用する EKS クラスター内の本番ワークロードと、スピンオフの開発/テストレプリカワークロードのデプロイメントに関する一般的なシナリオを説明します。本ブログでは、例として MySQL を使用していますが、同じ内容をさまざまなステートフルアプリケーションワークロードに適用できます。

前提条件

自身の環境で同様のデプロイメントを行うために、このソリューションで使用するリソースの前提条件を以下に示します。

ウォークスルー

1. Terraform を使用して Amazon EKS および Amazon FSx for NetApp ONTAP のリソースをプロビジョニングします

注意: iSCSI 前提ドライバーをインストールするためのカスタマイズされたユーザーデータは、”terraform フォルダ” に用意されています。このソリューションでは、MySQL データベース用の iSCSI ブロックストレージを使用することを選択しています。

2. Trident CSI ドライバーのインストールと設定

      • EKS に Trident CSI をインストールする
      • FSx ファイルシステムに接続するために Trident CSI バックエンドを設定する

3. サンプル MySQL アプリケーションのデプロイと Trident CSI ドライバーを使用したクローン作成

      • MySQL ステートフルアプリケーションを作成する
      • MySQL データベースとデータを作成する
      • MySQL データのスナップショットを作成する
      • MySQL アプリケーションとデータのクローンを作成する

ファイルシステムとAmazon EKSのセットアップ

このセクションでは、Amazon EKS と永続ストレージ用の Trident CSI ドライバーを使用して、Amazon FSx for NetApp ONTAP ファイルシステムを作成および設定します。
これで、前提条件のセクションでインストールしたコンピューターから、すべてのコマンドを実行できるようになります。

Terraform を使用して Amazon EKS クラスターと Amazon FSx for NetApp ONTAP ファイルシステムを作成する

GitHub からサンプルリポジトリをクローンして、そのリポジトリ内の Terraform のコードを使用して関連するすべてのリソースを作成します。

$ git clone https://github.com/aws-samples/amazon-eks-fsx-for-netapp-ontap
$ cd amazon-eks-fsx-for-netapp-ontap/terraform
$ terraform init
$ terraform apply -auto-approve

上記コマンドが完了すると、以下のような出力が得られます。(10~30分程度かかる場合があります)

cluster_endpoint = "https://<GENERATED_ID>.eu-west-1.eks.amazonaws.com"
cluster_id = "fsx-eks-<RANDOM_STRING>"
cluster_name = "fsx-eks-<RANDOM_STRING>"
cluster_security_group_id = "sg-1234567890"
fsx-management-ip = "FSX_MANAGEMENT_IP=198.19.255.37"
fsx-password = "FSX_PASSWORD=<GENERATED_PASSWORD>"
fsx-svm-id = "FSX_SVM_ID=<svm-id123456789>"
fsx-svm-name = "FSX_SVM_NAME=ekssvm"
oidc_provider_arn = "arn:aws:iam::<ACCOUNT_ID>:oidc-provider/oidc.eks.eu-west-1.amazonaws.com/id/<FINGERPRINT>"
region = "eu-west-1"
zz_non_root_volumes_env = "NON_ROOT_VOLUMES=$(aws fsx describe-volumes --filters Name=storage-virtual-machine-id,Values=<svm-id123456789> | jq -r '.Volumes[] | select(.OntapConfiguration.StorageVirtualMachineRoot==false) | .VolumeId')"
zz_update_kubeconfig_command = "aws eks update-kubeconfig --name fsx-eks-<RANDOM_STRING> --region eu-west-1"

上記の  zz_update_kubeconfig_command の出力から AWS CLI コマンドをコピーして実行(aws eks update-kubeconfig –name fsx-eks-123abc45 –region eu-west-1 のようなコマンドです)し、その後に以下のコマンド(kubectl get nodes)を実行してクラスターに到達できることを確認してください。

kubectl get nodes 
NAME                                       STATUS   ROLES    AGE   VERSION 
ip-10-0-1-106.eu-west-1.compute.internal   Ready    <none>   1d   v1.21.5-eks- version 
ip-10-0-2-219.eu-west-1.compute.internal   Ready    <none>   1d   v1.21.5-eks-version

注意:kubectl get nodes の実行で「error: exec plugin: invalid apiVersion “client.authentication.k8s.io/v1alpha1″」のようなエラーが応答される可能性があります。その場合は古いバージョンの kubectl(例:v1.21.0)を利用することで回避ができるか確認をしてください

Kubernates スナップショット CRD とスナップショットコントローラーをインストールします。

cd ..
git clone https://github.com/kubernetes-csi/external-snapshotter 
cd external-snapshotter/ 
kubectl kustomize client/config/crd | kubectl create -f - 
kubectl -n kube-system kustomize deploy/kubernetes/snapshot-controller | kubectl create -f - 
kubectl kustomize deploy/kubernetes/csi-snapshotter | kubectl create -f - 
cd ..

Trident CSI を Amazon EKS にインストールする

Trident パッケージをダウンロードし、tar を解凍してください。

$ wget https://github.com/NetApp/trident/releases/download/v21.10.0/trident-installer-21.10.0.tar.gz 

$ tar -xf trident-installer-21.10.0.tar.gz

そして、helm を使用してパッケージを展開してください。

$ helm install trident -n trident --create-namespace trident-installer/helm/trident-operator-21.10.0.tgz

注意:helm コマンドの実行で「Error: INSTALLATION FAILED: Kubernetes cluster unreachable: exec plugin: invalid apiVersion “client.authentication.k8s.io/v1alpha1″」のようなエラーが応答される可能性があります。その場合は古いバージョンの helm(例:v3.6.2)を利用することで回避ができるか確認をしてください

kubectl を使用して Trident が稼働していることを確認してください。

$ kubectl get pods -n trident 

NAME                                READY   STATUS    RESTARTS   AGE 
trident-csi-678674db66-dzbzw        6/6     Running   0          2m59s 
trident-csi-6vp99                   2/2     Running   0          2m58s 
trident-csi-llng4                   2/2     Running   0          2m58s 
trident-csi-xs2hn                   2/2     Running   0          2m58s 
trident-operator-65b7c4d58b-jh4qf   1/1     Running   0          3m8s

Trident CSI バックエンド を FSx for NetApp ONTAP に構成する

MySQL データベースに iSCSI ストレージを使用しているため、Trident バックエンド設定のストレージドライバ名を ontap-san に設定します。他のドライバタイプ詳細については、Astra Trident のドキュメントを参照してください。Trident バックエンドを FSx for NetApp ONTAP に設定するために、ファイルシステムの管理 IP アドレスと fsxadmin のクレデンシャルを使用します。

1. Amazon FSx コンソールに移動し、ファイルシステムまたはファイルシステムに所属する SVM を選択して、ファイルシステムの管理 IP アドレスを取得します。SVM の管理 IP アドレスは SVM の [概要] ページで確認でき、ファイル システムの [ネットワークとセキュリティ] タブでファイル システムの IP アドレスを確認することができます。

2. Trident ドライバーのバックエンド構成を作成します。前の手順で取得した管理 IP アドレスとパスワード、SVM 名を入力します。(この3つのパラメータ値は、terraform apply -auto-approve 実行後に出力されています)

$ mkdir temp
$ FSX_MANAGEMENT_IP=<IP_ADDRESS> FSX_PASSWORD=<SVM_PASSWORD> FSX_SVM_NAME=<SVM_NAME> envsubst < manifests/backend-tbc-ontap-san.tmpl > temp/backend-tbc-ontap-san.yaml

$ kubectl create -n trident -f temp/backend-tbc-ontap-san.yaml
 
$ kubectl get tridentbackendconfig -n trident
 
NAME                    BACKEND NAME            BACKEND UUID                           PHASE   STATUS
backend-fsx-ontap-san   backend-fsx-ontap-san   c4701179-6158-4ca9-a78b-1d69ebdb1e5c   Bound   Success

3. 作成したバックエンドを使用する Kubernetes ストレージクラスを作成します。最初の手順でクローンしたリポジトリの manifests フォルダにある既存の storageclass-fsx-block.yaml ファイルを使用して、クラスターに適用します。バックエンドタイプの名前(この例では ontap-san )は、前の手順で作成した TridentBackendConfigstorageDriverName フィールドと一致する必要があります。

4. kubectl を使用して、 StorageClass を作成します。

$ kubectl create -f manifests/storageclass-fsxn-block.yaml 
storageclass.storage.k8s.io/fsx-basic-block created
 
$ kubectl get storageclass 
NAME              PROVISIONER            RECLAIM POLICY  VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE 
fsx-basic-block   csi.trident.netapp.io  Delete          Immediate              true                   17h 
gp2 (default)     kubernetes.io/aws-ebs  Delete          WaitForFirstConsumer   false                  21

ステートフルアプリケーションを作成する

Trident CSI ドライバーのインストールと、FSx for NetApp ONTAP ファイルシステムへの接続が完了したので、バックエンドのブロックまたはファイルシステムボリュームを使用して、ほぼすべてのステートフルアプリケーションを作成できます。このブログでは、MySQL をアプリケーションワークロードの例として使用します。

Kubernetes で MySQL のステートフルアプリケーションを作成する

1. MySQL データベース用の Kubernetes PersistantVolumeClaim を作成します。pvc-fsxn-block.yamlのマニフェストを使用します。

注意:このマニフェストでは storageClassName フィールドの値として fsx-basic-block を使用しています

$ kubectl create -f manifests/pvc-fsxn-block.yaml 
persistentvolumeclaim/mysql-volume created
 
$ kubectl get pvc 
NAME           STATUS   VOLUME                                    CAPACITY   ACCESS MODES   STORAGECLASS      AGE 
mysql-volume   Bound    pvc-26319553-f29b-4616-b2bb-c700c8416a6b   50Gi       RWO            fsx-basic-block   7s

次に、前の手順で作成した永続ボリューム要求を使用する MySQL デプロイメントを作成します。デプロイメントマニフェストの claimName フィールドを参照してください。

$ kubectl create -f manifests/mysql.yaml 
secret/mysql-secret created 
deployment.apps/mysql-fsx created 

$ kubectl get pods 
NAME                         READY   STATUS    RESTARTS   AGE 
mysql-fsx-6c4d9f6fcb-mzm82   1/1     Running       0      15d

MySQL データベースにデータを入力する

以下のコマンドを使用して、manifestsフォルダに作成した mysql.yaml デプロイメントマニフェストで定義されているパスワード(本ケースでは “Netapp1!”)を使用して、MySQL アプリケーションに接続し、データベースとテーブル、いくつかのデータを作成します。

kubectl exec -it $(kubectl get pod -l "app=mysql-fsx" --namespace=default -o jsonpath='{.items[0].metadata.name}') -- mysql -u root -p 

Enter password: 
… 
mysql> create database fsxdatabase; 
Query OK, 1 row affected (0.01 sec)

mysql> use fsxdatabase;
Database changed 
mysql> create table fsx (filesystem varchar(20), capacity varchar(20), region varchar(20));
Query OK, 0 rows affected (0.04 sec)

mysql> insert into fsx (`filesystem`, `capacity`, `region`) values ('netapp01','1024GB', 'us-east-1'),('netapp02', 
'10240GB', 'us-east-2'),('eks001', '2048GB', 'us-west-1'),('eks002', '1024GB', 'us-west-2'),('netapp03', '1024GB', 'us-east-1'),('netapp04', '1024GB', 'us-west-1'); 
Query OK, 6 rows affected (0.03 sec) 
Records: 6  Duplicates: 0  Warnings: 0

データが入力されていることを確認してください。

mysql> select * from fsx;
+------------+----------+-----------+
| filesystem | capacity | region    |
+------------+----------+-----------+
| netapp01   | 1024GB   | us-east-1 |
| netapp02   | 10240GB  | us-east-2 |
| eks001     | 2048GB   | us-west-1 |
| eks002     | 1024GB   | us-west-2 |
| netapp03   | 1024GB   | us-east-1 |
| netapp04   | 1024GB   | us-west-1 |
+------------+----------+-----------+
6 rows in set (0.00 sec)

mysql> exit
Bye

MySQL データのスナップショットを作成する

Kubernetes VolumeSnapshotClass を作成して、MySQL デプロイメントに使用されている永続ボリューム要求(PVC)のスナップショットを作成できるようにします。マニフェストは manifests フォルダ下にある volume-snapshot-class.yaml ファイルにあります。

$ kubectl create -f manifests/volume-snapshot-class.yaml 
volumesnapshotclass.snapshot.storage.k8s.io/fsx-snapclass created

VolumeSnapshot を作成して既存の PVC のスナップショットを作成し、MySQL データのポイントインタイムコピーを取得します。これにより、ファイルシステムバックエンドにほとんど容量を取らない FSx の効率的なスナップショットが作成されます。マニフェストフォルダ下にある volume-snapshot.yaml ファイルを使用して、以下を実行してください。

$ kubectl create -f manifests/volume-snapshot.yaml 
volumesnapshot.snapshot.storage.k8s.io/mysql-volume-snap-01 created 

$ kubectl get volumesnapshot
NAME                   READYTOUSE   SOURCEPVC      SOURCESNAPSHOTCONTENT   RESTORESIZE   SNAPSHOTCLASS
SNAPSHOTCONTENT                                    CREATIONTIME   AGE
mysql-volume-snap-01   true         mysql-volume                           50Gi          fsx-snapclass   snapcontent-bce1f186-7786-4f4a-
9f3a-e8bf90b7c126   13s            14s

MySQL データを新しいストレージの永続ボリュームにクローンする

作成した VolumeSnapshot のデータに基づいて、新しいデプロイメントと新しい PVC を作成することにより、MySQL デプロイメントとデータのクローンを作成する準備が整いました。 この手順では、FSx for NetApp ONTAP に新しい FlexClone ボリュームを作成します。 前述しているように、初期作成時では FlexClone はほとんど容量を取りません。 ポインタテーブルのみがクローン元ボリュームの共有データブロックに作成されます。

MySQL スナップショットに基づいて Kubernetes PVC を作成し、manifests フォルダ下にある pvc-from-snapshot.yaml という名前のマニフェストを使用します。

$ kubectl create -f manifests/pvc-from-snapshot.yaml
persistentvolumeclaim/mysql-volume-clone created

$ kubectl get pvc
NAME                 STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE
mysql-volume         Bound    pvc-a3f98de0-06fe-4036-9a22-0d6bd697781a   50Gi       RWO            fsx-basic-block   40m
mysql-volume-clone   Bound    pvc-9784d513-8d45-4996-abe3-7372cd879151   50Gi       RWO            fsx-basic-block   36s

クローンデータから新しい MySQL アプリケーションを作成する

1. manifestsフォルダ下にある mysql-clone.yaml という名前のファイルを使用して、クローンデータに基づいた新しいデータベースデプロイメントを作成します。

2. kubectl を使用して MySQL デプロイメントを作成します

$ kubectl create -f manifests/mysql-clone.yaml 
deployment.apps/mysql-fsx-clone created 

$ kubectl get pods 
NAME                              READY   STATUS    RESTARTS   AGE 
mysql-fsx-6c4d9f6fcb-pglgp        1/1     Running   0          38m 
mysql-fsx-clone-f98f9cc4d-xk7nz   1/1     Running   0          15s

3. データが新しい MySQL デプロイメントにクローンされたことを確認します。

注意:MySQL データベースのパスワードは、manifestsフォルダに作成した mysql.yaml デプロイメントマニフェストで定義されているパスワード(本ケースでは “Netapp1!”)を使用してください。

$  kubectl exec -it $(kubectl get pod -l "app=mysql-fsx-clone" --namespace=default -o jsonpath='{.items[0].metadata.name}') -- mysql -u root -p

 
Enter password:
…
mysql> use fsxdatabase;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
 
Database changed
mysql> select * from fsx;
+------------+----------+-----------+
| filesystem | capacity | region    |
+------------+----------+-----------+
| netapp01   | 1024GB   | us-east-1 |
| netapp02   | 10240GB  | us-east-2 |
| eks001     | 2048GB   | us-west-1 |
| eks002     | 1024GB   | us-west-2 |
| netapp03   | 1024GB   | us-east-1 |
| netapp04   | 1024GB   | us-west-1 |
+------------+----------+-----------+
6 rows in set (0.00 sec)

mysql> exit
Bye

クリーンアップ

親フォルダ(amazon-eks-fsx-for-netapp-ontap)に移動して以下のコマンドを実行し、作成した Kubernetes オブジェクトを削除します。

kubectl delete -f manifests/mysql-clone.yaml 
kubectl delete -f manifests/mysql.yaml 
kubectl delete pvc mysql-volume mysql-volume-clone 
kubectl delete -f manifests/volume-snapshot.yaml

次に、AWS CLI を使用して FSx から SVM ボリュームを削除します。

zz_non_root_volumes_env という Terraform の出力フィールドから次の生成されたコマンド(「Terraform を使用して Amazon EKS クラスターと Amazon FSx for NetApp ONTAP ファイルシステムを作成する」セクションの terraform 出力を参照)をコピーするか、<YOUR_SVM_ID> 部分を作成した SVM ID に置き換えてください。

NON_ROOT_VOLUMES=$(aws fsx describe-volumes  --filters Name=storage-virtual-machine-id,Values=<YOUR_SVM_ID>  | jq -r '.Volumes[] | select(.OntapConfiguration.StorageVirtualMachineRoot==false) | .VolumeId') 

for vol in $NON_ROOT_VOLUMES; do aws fsx delete-volume --volume-id $vol; done

AWS マネジメントコンソール で見つけた SVM から、ルート以外のボリュームが 削除されるまで待機してください。

Wait until the non-root volumes are deleted from the SVM found in the AWS Management Console

最後に、Terraform を使用して作成されたすべてのリソースを削除します。
質問には yes を応答してください。

cd terraform 
terraform destroy

まとめ

この記事では、FSx for NetApp ONTAP によって Amazon EKS 上でステートフルなアプリケーションを効率的に実行しながら、Kubernetes 永続ボリュームのデータレプリケーション速度を向上させ、クローン作成操作を簡素化する方法を説明しました。MySQL をこのブログの例として使用しましたが、FSx for NetApp ONTAPを使用した EKS が、スケーリングまたは開発/テストのデプロイメントのための迅速なクローン作成を必要とする様々な種類のコンテナ化されたアプリケーションを、どのようにサポートできるかを確認できました。 Kubernetes には、ボリューム拡張、ボリューム暗号化、トポロジ対応ストレージなど、Amazon FSx for NetApp ONTAP 用の Trident CSI ドライバーでサポートされる追加のストレージ機能があります。詳細については、NetApp Trident のドキュメントを参照してください。

翻訳はプロフェッショナルサービス本部の葉山が担当しました。