Amazon EKS Kubernetesバージョン 1.30以降でStorageClass関連のエラーが発生する場合の原因と解決策
Amazon EKS(以降、EKSで表記)のKubernetesバージョン1.30で以下の手順を実施したら、エラーがでました。
no persistent volumes available for this claim and no storage class is set
こちらの原因と解決策を調査してみました。
解決策は2つあります。どちらかを実施することでエラーを解消できます。
原因
EKS Kubernetesバージョン 1.30以降では、新規クラスタ作成時にgp2 StorageClassがデフォルトとして自動設定されなくなりました。
その結果、以下の状態となりエラーが発生しました。
- クラスタにデフォルトのStorageClassが設定されていない
- PVCでStorageClassを明示的に指定していない
以降、Amazon EKS では、新しく作成されたクラスターに適用されるリソースのアノテーション1.30が含まれなくなりました。このストレージ クラスを名前で参照している場合、これは影響しません。クラスターにデフォルトがあることに依存していた場合は、アクションを実行する必要があります。 は名前で参照する必要があります。または、の 以降をインストールするときに パラメータを true に設定することで、Amazon EBS が推奨するデフォルトのストレージ クラスをデプロイできます。defaultgp2 StorageClassStorageClassStorageClassgp2defaultStorageClass.enabledv1.31.0aws-ebs-csi-driver add-on
Kubernetes 1.30 | 標準サポートの Kubernetes バージョンのリリースノートを確認する - アマゾン EKSから引用
解決策1: クラスタにデフォルトのStorageClassを設定する
デフォルトのStorageClassを設定する方法はいくつかありますが、ここでは2つの方法を紹介します。
どちらか片方を実行すれば十分です。
StorageClassにデフォルトのアノテーションを設定
アノテーションstorageclass.kubernetes.io/is-default-class="true"
を設定することで、StorageClassがデフォルトとして認識されます。
以下のコマンドを実行します。
# StorageClass確認
kubectl get storageclass
# デフォルトのアノテーション付与
kubectl annotate storageclass <ストレージクラス名> storageclass.kubernetes.io/is-default-class="true"
defaultStorageClass.enabled
をtrue
にする
EBS CSIドライバーアドオンインストール時に、アドオンインストール時に、デフォルトを有効化することも可能です。
Terraformでeks moduleを利用している場合は、以下の記載を追加します。
module "eks" {
source = "terraform-aws-modules/eks/aws"
version = "~> 20.0"
# 省略
cluster_addons = {
# 省略
aws-ebs-csi-driver = {
most_recent = true
service_account_role_arn = aws_iam_role.ebs_csi_driver.arn
configuration_values = jsonencode({
# 以下を追加
defaultStorageClass = {
enabled = true
}
})
}
}
ちなみに、defaultStorageClass.enabled
をtrue
にすると、以下のStorageClassが作成されデフォルトに設定されます。
$ kubectl get storageclass ebs-csi-default-sc -o yaml
allowVolumeExpansion: true
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
annotations:
storageclass.kubernetes.io/is-default-class: "true"
creationTimestamp: "2025-02-13T10:23:19Z"
name: ebs-csi-default-sc
resourceVersion: "1379"
uid: 6e36aba8-42d8-42c5-a403-63ae83480d21
provisioner: ebs.csi.aws.com
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
解決策2: pvcでStorageClassを名前で指定
こちらの方法は、pvc側を変更する方法です。
pvcにStorageClassの名前を設定します。
# StorageClass名を確認
kubectl get storageclass
# pvc名を確認
kubectl get pvc
# pvcを編集
kubectl edit pvc <pvc名>
spec.storageClassName
を追加します。
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi
storageClassName: <StorageClass名> # この行を追加
余談: Kubernetesバージョン1.29からアップグレードした場合は、発生しないか?
ドキュメントにもある通り、新しくクラスターを作成した場合の挙動になります。
そのため、アップグレード時にStorageClassのデフォルトのアノテーションが外れることは有りません。
$ kubectl get sc gp2 -o jsonpath='{.metadata.annotations.storageclass\.kubernetes\.io/is-default-class}'
true
$ kubectl get sc gp2 -o jsonpath='{.metadata.annotations.storageclass\.kubernetes\.io/is-default-class}'
true
おわりに
1.30以前でマニフェストを作成し、最新バージョンでクラスターを作り直して以前のマニフェストを適用した場合などに発生するかもしれません。
あまり遭遇する機会はないかもしれませんが、誰かの参考になれば幸いです。
以上、AWS事業本部の佐藤(@chari7311)でした。