のべラボ.blog

謙虚に、臆せず、さぼらずにブログを書く

Amazon EKS で Amazon EBS CSI ドライバー を使ってみる

今回は、Amazon EKS で Amazon EBS CSI ドライバー を使って、Podから EBSボリュームにアクセスしてみます。

ここに記述している内容は、2022 年 9 月1 日時点で動作を確認しています。

また、対象にしている Kubernetes のバージョンは 1.23 です。

今後の Update により、手順等が変更される可能性があることをご留意ください。

なお、下記のドキュメントを参考にしていますので、こちらも併せてご参照ください。

docs.aws.amazon.com

aws.amazon.com


前提と環境

今回は、東京リージョンの「 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 ドライバーの構成方法の記事を書きたいと思います。