メインコンテンツまでスキップ

EFS CSIドライバー

このセクションに入る前に、メインのストレージセクションで紹介されたKubernetesのストレージオブジェクト(ボリューム、永続ボリューム(PV)、永続ボリューム要求(PVC)、動的プロビジョニング、一時的ストレージ)について理解しておく必要があります。

Amazon Elastic File System Container Storage Interface (CSI) ドライバーを使用すると、CSIインターフェースを提供することで、AWSで実行されているKubernetesクラスターがAmazon EFSファイルシステムのライフサイクルを管理できるようになり、ステートフルなコンテナアプリケーションを実行できます。

次のアーキテクチャ図は、EKSポッドの永続ストレージとしてEFSを使用する方法を示しています:

Assets with EFS

EKSクラスターで動的プロビジョニングを使用してAmazon EFSを利用するには、まずEFS CSIドライバーがインストールされていることを確認する必要があります。このドライバーはCSI仕様を実装しており、コンテナオーケストレーターがAmazon EFSファイルシステムのライフサイクル全体を管理できるようにします。

セキュリティの向上と管理の簡素化のために、Amazon EFS CSIドライバーをAmazon EKSアドオンとして実行できます。必要なIAMロールが既に作成されているため、アドオンのインストールを進めることができます:

~$aws eks create-addon --cluster-name $EKS_CLUSTER_NAME --addon-name aws-efs-csi-driver \
--service-account-role-arn $EFS_CSI_ADDON_ROLE
~$aws eks wait addon-active --cluster-name $EKS_CLUSTER_NAME --addon-name aws-efs-csi-driver

アドオンがEKSクラスターに作成したものを確認してみましょう。例えば、クラスター内の各ノードでポッドを実行するDaemonSetがあります:

~$kubectl get daemonset efs-csi-node -n kube-system
NAME           DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                 AGE
efs-csi-node   3         3         3       3            3           kubernetes.io/os=linux        47s

EFS CSIドライバーは動的プロビジョニングと静的プロビジョニングの両方をサポートしています:

  • 動的プロビジョニング:ドライバーは各PersistentVolumeのアクセスポイントを作成します。これには既存のAWS EFSファイルシステムが必要であり、StorageClassパラメータで指定する必要があります。
  • 静的プロビジョニング:これにも事前に作成されたAWS EFSファイルシステムが必要であり、ドライバーを使用してコンテナ内のボリュームとしてマウントできます。

EFSファイルシステムはすでにプロビジョニングされており、マウントターゲットとEFSマウントポイントへのNFSトラフィックを許可するインバウンドルールを含む必要なセキュリティグループも設定されています。後で使用するためにIDを取得しましょう:

~$export EFS_ID=$(aws efs describe-file-systems --query "FileSystems[?Name=='$EKS_CLUSTER_NAME-efs-assets'] | [0].FileSystemId" --output text)
~$echo $EFS_ID
fs-061cb5c5ed841a6b0

次に、事前にプロビジョニングされたEFSファイルシステムとEFSアクセスポイントをプロビジョニングモードで使用するように設定されたStorageClassオブジェクトを作成します。これにはefsstorageclass.yamlファイルを使用します。

~/environment/eks-workshop/modules/fundamentals/storage/efs/storageclass/efsstorageclass.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: efs-sc
provisioner: efs.csi.aws.com
parameters:
provisioningMode: efs-ap
fileSystemId: ${EFS_ID}
directoryPerms: "700"
A

EFS CSIプロビジョナー用にprovisionerパラメータをefs.csi.aws.comに設定します

B

filesystemidパラメータにEFS_ID環境変数を注入します

kustomizationを適用します:

~$kubectl kustomize ~/environment/eks-workshop/modules/fundamentals/storage/efs/storageclass \
| envsubst | kubectl apply -f-
storageclass.storage.k8s.io/efs-sc created

StorageClassを確認してみましょう。プロビジョナーとしてEFS CSIドライバーを使用し、先ほどエクスポートしたファイルシステムIDを持つEFSアクセスポイントプロビジョニングモードに設定されていることに注目してください:

~$kubectl get storageclass
NAME            PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
efs-sc          efs.csi.aws.com         Delete          Immediate              false                  8m29s
~$kubectl describe sc efs-sc
Name:            efs-sc
IsDefaultClass:  No
Annotations:     kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{},"name":"efs-sc"},"parameters":{"directoryPerms":"700","fileSystemId":"fs-061cb5c5ed841a6b0","provisioningMode":"efs-ap"},"provisioner":"efs.csi.aws.com"}
 
Provisioner:           efs.csi.aws.com
Parameters:            directoryPerms=700,fileSystemId=fs-061cb5c5ed841a6b0,provisioningMode=efs-ap
AllowVolumeExpansion:  <unset>
MountOptions:          <none>
ReclaimPolicy:         Delete
VolumeBindingMode:     Immediate
Events:                <none>

これでEFS StorageClassとEFS CSIドライバーの仕組みが理解できました。次のステップでは、UIコンポーネントを変更して、Kubernetesの動的ボリュームプロビジョニングとEFS StorageClassを使用して、製品画像を保存するための永続ボリュームを使用します。