EKSのデフォルトのストレージクラスをgp2からgp3に変更する

2022年4月30日

EKS のデフォルトのストレージクラスを gp2 から gp3 に変更する機会があったので備忘録。eksctl を使って EKS クラスタを構築していることを前提としています。

  • Kubernetes v2.21
  • eksctl v0.90.0

参考にしたドキュメントはこのあたり。

クラスターの IAM OIDC プロバイダーを作成する

Create an IAM OIDC provider for your cluster - Amazon EKS を参考に、クラスターの IAM OIDC プロバイダーを作成します。

以下のコマンドを実行し、クラスターの OIDC プロバイダーの URL を表示します。クラスター名やリージョンはご自身のものに置き換えてください。

aws eks describe-cluster --name my-eks --query "cluster.identity.oidc.issuer" --region us-west-2 --output text

出力例です。

https://oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E

出力された EXAMPLED539D4633E53DE1B716D3041Eをコピーし、次のコマンドの grep の引数に使用します。

aws iam list-open-id-connect-providers --region us-west-2 | grep EXAMPLED539D4633E53DE1B716D3041E

上記のコマンドから出力が返された場合は、既にクラスター用のプロバイダーが存在するので、プロバイダーを作成する必要はありません。次のステップに進みます。出力が返されない場合は、次のコマンドで IAM OIDC プロバイダーを作成します。

eksctl utils associate-iam-oidc-provider --cluster my-eks --region us-west-2 --approve

サービスアカウントの IAM ロールとポリシーを作成する

Creating an IAM role and policy for your service account - Amazon EKS を参考にサービスアカウントの IAM ロールとポリシーを作成します。

eksctl create iamserviceaccount \
    --name ebs-csi-controller-sa \
    --namespace kube-system \
    --cluster my-eks \
    --attach-policy-arn arn:aws:iam::111122223333:policy/my-eks-ebs-csi-driver \
    --region us-west-2 \
    --approve \
    --role-only

Amazon EBS CSI アドオンを追加する

Managing the Amazon EBS CSI driver as an Amazon EKS add-on - Amazon EKS を参考に CSI アドオンを追加します。--service-account-role-arnにはひとつ前のコマンドで作成された IAM Role の ARN を指定します。

eksctl create addon \
    --name aws-ebs-csi-driver \
    --cluster my-eks \
    --service-account-role-arn arn:aws:iam::111122223333:role/eksctl-my-eks-addon-iamserviceacco-Role1-12ABCEDFGHIJ \
    --region us-west-2 \
    --force

EKS のストレージクラス gp2 からデフォルトのアノテーションを削除する

以下のコマンドでストレージクラス gp2 からデフォルトのアノテーションを削除します。

kubectl annotate sc gp2 storageclass.kubernetes.io/is-default-class-

変更後、デフォルトではなくなったことを確認しておきます。

kubectl get sc gp2

gp3 ストレージクラスを作成し、デフォルトにする

ストレージクラスのマニフェストファイルを作ります。

cat << EOT > gp3-def-sc.yaml
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: gp3
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
allowVolumeExpansion: true
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
parameters:
  type: gp3
EOF

ストレージクラスを作成します。

kubectl apply -f gp3-def-sc.yaml

作成されたストレージクラスを確認します。

kubectl get sc gp3

gp3 がデフォルトになったことが確認できます。

NAME            PROVISIONER       RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
gp3 (default)   ebs.csi.aws.com   Delete          WaitForFirstConsumer   true      

-技術ブログ
-