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 を使用していますが、同じ内容をさまざまなステートフルアプリケーションワークロードに適用できます。
前提条件
自身の環境で同様のデプロイメントを行うために、このソリューションで使用するリソースの前提条件を以下に示します。
- AWS Command Line Interface (CLI):AWS API との対話で使用します
- Hashicorp Terraform :サンプルのインフラストラクチャをプロビジョニングします
- Kubectl:EKSクラスターとの対話で使用します
- Helm:Tridentコントローラのインストールに使用します
- jq:一般的な json 出力の操作で使用します。
- Amazon FSx for NetApp ONTAP デモサンプル:Github からサンプルを入手して使用します
ウォークスルー
1. Terraform を使用して Amazon EKS および Amazon FSx for NetApp ONTAP のリソースをプロビジョニングします
- EKSクラスター:バージョン1.21
- Trident EKS ノードの準備:iSCSI ストレージの Worker ノードの準備はユーザガイドの「Deployment and Configuration of Trident on EKS with Amazon FSx for NetApp ONTAP」で説明されています
- FSx for NetApp ONTAP のファイルシステムおよびストレージ仮想マシン(SVM):これらのリソースを手動で作成する方法については「Amazon FSx for NetApp ONTAP の開始方法」を参照してください
注意: iSCSI 前提ドライバーをインストールするためのカスタマイズされたユーザーデータは、”terraform フォルダ” に用意されています。このソリューションでは、MySQL データベース用の iSCSI ブロックストレージを使用することを選択しています。
2. Trident CSI ドライバーのインストールと設定
- Kubernetes Snapshot Custom Resources (CRD) と Snapshot Controller をインストールします。クラスターのスナップショット要件については、Kubernetes ブログの「How to Deploy Volume Snapshots?」を参照してください
-
-
- 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 )は、前の手順で作成した TridentBackendConfig
のstorageDriverName
フィールドと一致する必要があります。
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 から、ルート以外のボリュームが 削除されるまで待機してください。
最後に、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 のドキュメントを参照してください。
翻訳はプロフェッショナルサービス本部の葉山が担当しました。