Amazon EKS で Amazon EBS CSI ドライバー を使ってみる
今回は、Amazon EKS で Amazon EBS CSI ドライバー を使って、Podから EBSボリュームにアクセスしてみます。
ここに記述している内容は、2022 年 9 月1 日時点で動作を確認しています。
また、対象にしている Kubernetes のバージョンは 1.23 です。
今後の Update により、手順等が変更される可能性があることをご留意ください。
なお、下記のドキュメントを参考にしていますので、こちらも併せてご参照ください。
前提と環境
今回は、東京リージョンの「 test123-cluster 」という名前の EKS クラスター (バージョンは 1.23 ) を使う前提とします。
kubectl や eksctl 、AWS CLI 、git が使用でき、対象のクラスターに接続できる Amazon Linux2 の環境で実施していきます。
記事の中で出てくる AWS アカウント ID は、12 桁すべてゼロで表記しています。
Amazon EBS CSI ドライバー用の Service Account の作成
Amazon EBS CSI ドライバーには、Amazon EBS のボリュームを作成したり削除する権限を付与する必要があります。
その権限を付与するため、AWS の IAM ロールと関連づいた Kubernetes の Service Account を作成します。
まず、クラスター用に IAM OpenID Connect (OIDC) プロバイダーを用意します。 (もし前に IAM ロールと関連付けた Service Account を作成したことがあるなら、すでに実施済のはずなので、その場合は不要です。)
eksctl utils associate-iam-oidc-provider --cluster test123-cluster --approve
次に、IAM ロール に 付与する許可ポリシーを作成します。
ここでは、ポリシー名を AmazonEBSCSIDriverPolicy にしています。
curl -o example-iam-policy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-ebs-csi-driver/v0.9.0/docs/example-iam-policy.json aws iam create-policy --policy-name AmazonEKS_EBS_CSI_Driver_Policy --policy-document file://example-iam-policy.json
ダウンロードした example-iam-policy.json にも目を通しておくと、どのようなポリシーが必要か確認できます。
そして、Service Account を作成します。
ここでは、Service Account 名を ebs-csi-controller-sa に、IAM ロール名を AmazonEKS_EBS_CSI_DriverRole にしています。
eksctl create iamserviceaccount \ --name ebs-csi-controller-sa \ --namespace kube-system \ --cluster test123-cluster \ --attach-policy-arn arn:aws:iam::000000000000:policy/AmazonEKS_EBS_CSI_Driver_Policy \ --approve \ --role-only \ --role-name AmazonEKS_EBS_CSI_DriverRole
Amazon EBS CSI ドライバー を Amazon EKS アドオンとしてインストールする
インストールは、AWS マネジメントコンソール や AWS CLI も使用できますが、今回は eksctl を使用します。
eksctl create addon --name aws-ebs-csi-driver --cluster test123-cluster --service-account-role-arn arn:aws:iam::000000000000:role/AmazonEKS_EBS_CSI_DriverRole --force
インストールできたか確認してみます。
eksctl get addon --name aws-ebs-csi-driver --cluster test123-cluster
STATUS が ACTIVE と表示されることを確認します。
出力例 (UPDATE AVAILABLE 列は省略しています。)
NAME VERSION STATUS ISSUES IAMROLE aws-ebs-csi-driver v1.10.0-eksbuild.1 ACTIVE 0 (IAMロールのARN)
サンプルアプリケーションで確認する
では、Pod から EBS ボリュームにアクセスできるかをサンプルアプリケーションを使って試していきます。
まず、サンプルアプリケーションを取得します。
git clone https://github.com/kubernetes-sigs/aws-ebs-csi-driver.git
今回は、動的に EBS ボリュームをプロビジョニングするサンプルを動かしていきます。
次を実行することで、Storage Class、Persistent Volume Claim、それを指定するサンプルの Pod が作成され、さらに Persistent Volume として EBS ボリュームも動的に作成されます。
cd aws-ebs-csi-driver/examples/kubernetes/dynamic-provisioning/ kubectl apply -f manifests/
Storage Class の情報を表示してみます。NAME に ebs-sc 、PROVISONER に ebs.csi.aws.com の Storage Class が表示されることを確認します。
kubectl get sc
Persistent Volume Claim、Persistent Volumeは、STATUS が Bound になっていることを確認します。
kubectl get pv kubectl get pvc
次のコマンドを実行し、このサンプルアプリケーションの Pod のマニフェストをみてみます。
cat manifests/pod.yaml
次のように、Persistent Volume Claim を指定し、/data というパスにボリュームをマウントしています。
そして、echo コマンドを使用し、/data/out.txt に日時を繰り返し書き込んでいます。
apiVersion: v1 kind: Pod metadata: name: app spec: containers: - name: app image: centos command: ["/bin/sh"] args: ["-c", "while true; do echo $(date -u) >> /data/out.txt; sleep 5; done"] volumeMounts: - name: persistent-storage mountPath: /data volumes: - name: persistent-storage persistentVolumeClaim: claimName: ebs-claim
では、この Pod が EBS ボリュームに書き込み出来ているかを確認してみましょう。
kubectl exec -it app -- cat /data/out.txt
次のような表示が確認できれば OK です。
出力例
Thu Sep 1 01:59:12 UTC 2022 Thu Sep 1 01:59:17 UTC 2022 Thu Sep 1 01:59:22 UTC 2022 Thu Sep 1 01:59:27 UTC 2022 Thu Sep 1 01:59:32 UTC 2022 Thu Sep 1 01:59:37 UTC 2022 Thu Sep 1 01:59:42 UTC 2022
ここで、このPod だけを削除してみます。
kubectl delete pod app
Pod を削除しても、Persistent Volume Claim が削除されない限り、EBS ボリュームは残っています。
その後、他の Pod を起動し、この EBSボリュームにマウントしてみます。
次のマニフェストを作成して、nginx.yaml
として保存します。
apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx volumeMounts: - name: persistent-storage mountPath: /data volumes: - name: persistent-storage persistentVolumeClaim: claimName: ebs-claim
この Pod を作成します。
kubectl create -f nginx.yaml
作成した Pod のシェルに接続してみます。
kubectl exec -it nginx -- /bin/bash
次のコマンドを実行し、削除した 前の Pod が書き込んだファイルを参照できることを確認します。
cat /data/out.txt
出力例
Thu Sep 1 01:59:12 UTC 2022 Thu Sep 1 01:59:17 UTC 2022 Thu Sep 1 01:59:22 UTC 2022 Thu Sep 1 01:59:27 UTC 2022 Thu Sep 1 01:59:32 UTC 2022 Thu Sep 1 01:59:37 UTC 2022 Thu Sep 1 01:59:42 UTC 2022
確認出来たら、シェルを終了します。
exit
サンプルアプリケーションを停止する場合は、次を実行します。
これで、EBS ボリュームも削除されます。
app という Pod はすでに削除していますので、NotFoundのエラーが出ても無視して下さい。
kubectl delete po nginx
kubectl delete -f manifests/
最後に
Amazon EKS を触りだして間もないころは、Amazon EBS CSI ドライバーの構成方法はドキュメントをみてもよくわからなかたったり、上手くいかなかったりしたのですが、今回ようやくサンプルアプリケーションを動作させる手順をまとめることができました。 次は、Amazon EFS CSI ドライバーの構成方法の記事を書きたいと思います。