Amazon Web Services ブログ
Amazon EKS アドオンで Amazon EBS CSI ドライバーが一般利用可能になりました
この記事は Amazon EBS CSI driver is now generally available in Amazon EKS add-ons (記事公開日: 2022 年 3 月 31 日) を翻訳したものです。
イントロダクション
ワークロードにオプションの永続ストレージを提供するために、Kubernetes はボリュームのライフサイクルオペレーションを実装し、これらのオペレーションで使用するさまざまなタイプのストレージをサポートしています。現在、ストレージプロバイダー固有のコードは、in-tree と呼ばれる Kubernetes プロジェクトのソースコードに保持されています。このコードはメンテナンスとリリースが複雑であり、in-tree のコードの一部として Kubernetes のリリースサイクルに関連付けられています。
ストレージ実装のライフサイクルを Kubernetes プロジェクト自体から切り離すために、Container Storage Interface (CSI) が作成されました。これは、コンテナベースのアプリケーションにストレージ固有のソリューションを実装するための標準仕様であり、さまざまなブロックストレージやファイルストレージシステムを Kubernetes などのコンテナオーケストレーションシステム上のワークロードに公開します。Kubernetes は、当初の in-tree ストレージプラグインシステムから、CSI モデルへの移行を進めています。この移行に備え、Kubernetes 1.14 では CSI Migration 機能が導入されました。
Amazon Elastic Kubernetes Service (EKS) の Amazon Elastic Block Store (EBS) CSI ドライバーのサポートは、2019 年 9 月に発表され、それ以来広く採用されています。 この CSI ドライバーを使用すると、コンテナオーケストレーター (Kubernetes など) が Amazon EBS ボリュームのライフサイクルを管理できます。Amazon EKS で使用する場合、このドライバーをクラスターにインストールすることで、ストレージリソースを指定することができます。Amazon EBS の in-tree プラグインの利用から Amazon EBS CSI ドライバーへの移行を容易にするために、AWS 固有の機能である CSIMigrationAWS が導入されました。アップストリームの Kubernetes v1.23 では、この機能がデフォルトで有効になりました。これには、Amazon EBS CSI ドライバーが Kubernetes クラスターにインストールされていることが必要です。
Amazon EKS アドオンは、Amazon EKS クラスター向けの厳選されたアドオンセットのインストールと管理を提供します。2021 年 12 月、AWS は CSIMigrationAWS の準備のため、Amazon EBS CSI EKS アドオンのプレビューを導入しました。このアドオンは、Amazon EBS CSI ドライバーのインストール、管理、およびパッチ適用を簡単にします。本日、Amazon EBS CSI EKS アドオンの一般提供開始をお知らせします。このリリースには、Linux でのボリュームサイズ変更とスナップショット、サイズ変更なしでのスナップショットを含む Windows のサポート、ARM64 のサポート、AWS 管理 IAM ポリシーなどの追加機能が含まれています。
Amazon EBS CSI ドライバーは、Amazon EKS コンソール、AWS コマンドラインインターフェース (CLI)、Amazon EKS API によって、直接インストール、管理、更新ができるようになりました。Amazon EKS API で利用可能なアドオンと互換性のあるバージョンを確認し、クラスターで実行したいアドオンのバージョンを選択し、アドオンが実行時に使用する IAM ロールなどの主要な設定を構成することができます。
詳細と開始方法については、Amazon EKS アドオンのドキュメントを参照してください。
このブログ記事の残りの部分では、CSI と Kubernetes で進行中の CSI Migration プロジェクトの背景について説明します。次に、Amazon EBS CSI EKS アドオンを作成し、Kubernetes ワークロードのコンテキストでアドオンを使用する方法を示します。
Container Storage Interface と Kubernetes
Kubernetes は現在、Amazon Elastic Block Store (EBS) を in-tree の kubernetes.io/aws-ebs プラグインでサポートしていますが、このプラグインは Kubernetes 1.17 からは非推奨となっています。ebs.csi.aws.com プロビジョナーを使用して、Amazon EBS CSI ドライバーに移行することをお勧めします。AWS は、Kubernetes のボリュームオペレーションとそれぞれのストレージサービスをシームレスに統合するために、Amazon EBS および Amazon Elastic File System (EFS) や FSx for Lustre 用のオープンソース CSI ドライバーをメンテナンスしています。これらの CSI ドライバーは、CSI インタフェースを実装することにより、アップストリームプロジェクトとは別にメンテナンスされ、独立したメンテナンスや機能開発が可能となっています。
Kubernetes の CSI Migration
多くのワークロードはすでに in-tree ストレージプロバイダーを使用するように指定されており、新しい CSI モデルへの移行はこれらのワークロードに変更を必要とします。そのため in-tree プラグインから新しい CSI モデルへの移行では、API の互換性という問題が最初に発生しました。これを解決するために、CSI Migration の取り組みが導入されました。これは、in-tree の API を CSI API に 変換する Kubernetes の機能で、これらの API を時間の経過とともに CSI ドライバーに委譲できるようにするものです。CSIMigration フィーチャーゲートは、Kubernetes 1.17 からベータとして提供されており、デフォルトで有効になっています。これにより、CSIMigrationAWS などのプロバイダ固有のマイグレーションフィーチャーゲートを使用して、Kubernetes のすべての in-tree ボリュームプラグインをソリューション固有の CSI ドライバーに置き換えることができます。CSIMigrationAWS フィーチャーゲートは、アップストリーム Kubernetes および Amazon EKS Kubernetes バージョン 1.23 でデフォルトで有効化される予定です。
実際には、CSI Migration は、アプリケーションワークロードが in-tree の kubernetes.io/aws-ebs プロビジョナーを使用している場合でも、引き続きそれを指定することができ、そのオペレーションが自動的に Amazon EBS CSI ドライバーにルーティングされることを意味します。このマイグレーション機能は、ワークロードを移行して CSI ドライバーをネイティブに指定する前の一時的な対応として使用するのが最適です。なぜなら、CSI に実装された新機能が in-tree スタイルの仕様では利用できないためです。例えば、in-tree プラグインから CSI ドライバーに移行された PersistentVolume (PV) では、CSI ドライバーソリューションの新機能や属性を指定できません。そのため、ブログ記事 “Migrating Amazon EKS clusters from gp2 to gp3 EBS volumes” (日本語訳: “Amazon EKS クラスターの EBS ボリュームを gp2 から gp3 に移行する“) で説明したように、新しい CSI ベースの StorageClass (SC) を定義し、ワークロードを明示的に移行することをお勧めします。
Amazon EKS アドオンの作成
Amazon EKS アドオンの使用を開始するには、サポートされているクラスターで 1 つ以上のアドオンを作成することでオプトインする必要があります。この実装は特定の Kubernetes の機能と結びついているため、Kubernetes 1.18 以降でサポートされます。これは、Kubernetes 1.18 の Server-side Apply の機能を使用して、アドオンの更新機能を実装しているためです。この Kubernetes 機能は、Kubernetes api-server のコンテキストで、設定フィールドの所有権の追跡と、新しい設定マージアルゴリズムを組み合わせたものです。
Amazon EKS アドオンのすべての操作は、Amazon EKS でサポートされているインターフェイスでサポートされます。これには、AWS コンソール、AWS CLI、および eksctl ユーティリティが含まれます。また、eksctl での設定ファイルの利用、AWS CloudFormation、Terraform の AWS プロバイダー、AWS Cloud Development Kit (CDK) など、サポートされている Infrastructure as Code ツールを使用することもできます。これは、既存の EKS クラスターに対して、または新しいクラスターを作成するときに実行できます。
Amazon EBS CSI ドライバー EKS アドオンの操作
ここからは、Amazon EBS CSI ドライバー EKS アドオンの操作に入ります。アドオンの作成と管理は、お好みのインターフェースで行うことができます。後ほど紹介するワークフローの例では、eksctl、AWS CLI、Terraform を使用します。このウォークスルーには、Amazon EKS クラスターが必要です。まだプロビジョニングしていない場合は、eksctl を使用してクラスターを作成してください。
eksctl の最新リリースをインストールする手順については、Amazon EKS ユーザーガイドの eksctl のインストールを参照してください。
Amazon EBS CSI アドオンは、aws-ebs-csi-driver と呼ばれます。次のコマンドは、アドオンが利用可能なすべての Amazon EKS クラスターバージョンとプラットフォームバージョンを一覧表示します。
--kubernetes-version
オプションを使用して、特定の Kubernetes バージョンに対応したアドオンのバージョンを確認することができます。例えば、次のコマンドは、Kubernetes バージョン 1.21 を実行している Amazon EKS クラスターと互換性のあるバージョンを返します。
注: この出力では、EKS バージョン 1.21 用の aws-ebs-csi-driver アドオンのバージョン v1.5.2-eksbuild.1 を使用するには EKS プラットフォームバージョン eks.5 以降が必要であるのに対し、バージョン v1.4.0-eksbuild.preview では EKS プラットフォームバージョン eks.3 以降を必要とすることが示されています。
Amazon EBS CSI ドライバーのスナップショット機能を使用するには、アドオンをインストールする前に external-snapshotter をインストールする必要があります。external-snapshotter は Kubernetes CSI Special Interest Group (SIG) により提供されており、以下のコンポーネントを順にインストールする必要があります。
- VolumeSnapshotClass、VolumeSnapshot および VolumeSnapshotContent の CustomResourceDefinition (CRD)
- RBAC (ClusterRole、ClusterRoleBinding など)
- コントローラーの Deployment
EBS CSI ドライバーには、external-snapshotter と対話するための csi-snapshotter サイドカーコンテナが含まれています。詳細については、アップストリームの GitHub リポジトリを参照してください。
EBS CSI アドオンには、Amazon EBS ボリューム関連の IAM アクセス許可が必要です。アドオンで最小限の IAM 権限を使用するために、IAM Roles for Service Accounts (IRSA) を使用します。詳細については、Amazon EKS ユーザーガイドの “Configuring the Amazon EBS CSI plugin to use IAM roles for service accounts” を参照してください。
注: IRSA は EBS CSI アドオンにのみ使用され、external-snapshotter には使用されません。
サンプルの IAM ポリシードキュメントをダウンロードするか、このブログ記事でも使用している AWS 管理 IAM ポリシー AmazonEBSCSIDriverPolicy を使用できます。
以下の eksctl の設定 YAML を使用して、AWS 管理 IAM ポリシーの ARN を使用してアドオン付きの新しいクラスターを作成します。IRSA をサポートするために withOIDC が true に設定されていることに注意してください。アドオンはデータプレーンにインストールされるため、マネージド型ノードグループも作成します。今回のデモクラスターでは、デフォルトの Amazon Linux 2 ノードを使用しています。
以下の例では、eu-west-1 リージョンにクラスターを作成します。今後の CLI コマンドを短縮するために、以下の環境変数を設定します。
eksctl を使用してアドオンが ACTIVE 状態であることを確認できます。
あるいは、Amazon EKS API を使用してアドオンが ACTIVE 状態であるかを確認することもできます。
eksctl は、現在の Kubernetes コンテキストを新しく作成されたクラスターに設定します。
EBS CSI アドオンの前提条件のプラットフォームバージョン eks.5+ に一致する既存のクラスターについては、eksctl create addon
コマンドを使用して、AWS 管理 IAM ポリシーを指定して、アドオンを作成できます。対応する IRSA のセットアップと ServiceAccount のアノテーションが自動的に追加されます。
OIDC をまだ有効にしていない場合は、有効にする必要があります。
そして、アドオンを作成します。
多くのお客様が Terraform を利用してインフラストラクチャーを構築しています。Terraform の AWS プロバイダーには aws_eks_addon リソースが含まれており、EKS アドオンも作成することができます。以下はコードスニペットです。
Amazon EBS CSI ドライバーは kube-system Namespace で実行され、2 つのコンポーネントで構成されています。ebs-csi-controller は Deployment としてデプロイされ、ebs-csi-node は DaemonSet としてロールアウトされます。コンポーネントは、以下の kubectl コマンドの出力に表示されています。なお、デモクラスターには Windows ノードはありませんが、DaemonSet がインストールされており、後から Windows ノードが追加された場合に対応できるようになっています。詳細な説明については、EBS CSI の公式ドキュメントを参照してください。
それぞれの ebs-csi-controller の Pod には、ここでリストされているように 6 つのサイドカーコンテナが含まれています (実際の Pod 名は、環境によって異なります) 。
注: csi-snapshotter および csi-resizer サイドカーとそれぞれの機能は、Amazon EBS CSI アドオンのプレビューの一部としてはサポートされていませんでしたが、一般提供 (GA) バージョンでは導入されました。
デフォルトでは、すべてのノードで CSI ベースの Amazon EBS ボリュームを使用することが可能です。
IRSA は、ServiceAccount (SA) ebs-csi-controller-sa を使用し、CSI コントローラーコンポーネントによってのみ使用されます。SA は、eksctl または Terraform のいずれかで作成された IAM ロールが自動的にアノテーションされます。ロール名は自動生成されるため、クラスターによって異なります。
現在、すべての Amazon EKS クラスターには、in-tree プラグインベースの StorageClass (SC) が付属しています。
外部 EBS CSI ドライバーを使用するには、それに基づいた新しい StorageClass を作成する必要があります。
注: GA 版ではボリュームサイズ変更機能をサポートしているため、allowVolumeExpansion プロパティを true に設定しています。
プロビジョナーの列は、この StorageClass が Amazon EBS CSI アドオンドライバーに基づいていることを示しています。
注: in-tree プロビジョナーベースの StorageClass gp2 は引き続き使用可能であり、EBS CSI ベースの StorageClass gp3 と共存可能です。Amazon EKS アドオン Amazon EBS CSI を使用する場合、in-tree から外部 CSI プロビジョナーへの移行は発生しません。
続いて、PersistentVolumeClaim (PVC) を作成します。この PVC は、gp3 ベースの StorageClass の動的プロビジョニング機能を示すために、Pod によって使用されます。
今後の機能を確認したり、機能を提案したりするには、GitHub の AWS Containers Roadmap を参照してください。質問や提案がある場合は、コメントを残してください。
翻訳はプロフェッショナルサービスの杉田が担当しました。原文はこちらです。