EKS のデフォルトのストレージクラスを gp2 から gp3 に変更する機会があったので備忘録。eksctl を使って EKS クラスタを構築していることを前提としています。
- Kubernetes v2.21
- eksctl v0.90.0
参考にしたドキュメントはこのあたり。
- Create an IAM OIDC provider for your cluster - Amazon EKS
- Managing the Amazon EBS CSI driver as an Amazon EKS add-on - Amazon EKS
- Migrating Amazon EKS clusters from gp2 to gp3 EBS volumes | Containers
目次
- クラスターの IAM OIDC プロバイダーを作成する
- サービスアカウントの IAM ロールとポリシーを作成する
- Amazon EBS CSI アドオンを追加する
- EKS のストレージクラス gp2 からデフォルトのアノテーションを削除する
- gp3 ストレージクラスを作成し、デフォルトにする
クラスターの 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