はじめに
EKS Auto Mode では Amazon EBS CSI driver が組み込まれており、デフォルトで EBS を扱えます。
で・す・が……、既存の EBS をアタッチしようとして躓いたのでメモ。
本題の前に、やり方
EKS ノードに既存の EBS をアタッチして利用できるようにするやり方は、公式 GitHub に例があるのでそこの説明を参照ください。
PersistentVolume のマニフェストを作って EBS のボリューム ID を記述してあげればよく、シンプルそうに見えます。
つまづきポイントその 1
上記に従い Kubernetes マニフェストを用意して適用してみたところ、いつまでたっても Pod が起動しないという問題に遭遇しました。
Pod のイベントログを見に行くと、次のような Warning が…。
FailedAttachVolume **前 attachdetach-controller AttachVolume.Attach failed for volume "[PersistentVolume 名]" : timed out waiting for external-attacher of ebs.csi.aws.com CSI driver to attach volume [ボリューム ID]
ここで着目するべきは ebs.csi.aws.com
のところです。
EKS Managed Node Group の場合はそれでよいのですが、EKS Auto Mode のときは ebs.csi.eks.amazonaws.com
を使う必要があります。
ドキュメントでも言及されていました。
つまづきポイントその 2
マニフェストも書き換えてこれでよし!と再適用…。
ところが、まだ解決しません。
FailedAttachVolume **前 attachdetach-controller AttachVolume.Attach failed for volume "[PersistentVolume 名]" : timed out waiting for external-attacher of ebs.csi.eks.amazonaws.com CSI driver to attach volume [ボリューム ID]
色々調べてどうやら EBS に以下のタグが必要らしい、という情報を得ました。
Key: eks:eks-cluster-name
Value: [利用先の EKS クラスター名]

これをやるには、コンソールで EBS 一覧 (EC2 の Elastic Block Store) からアタッチしようとしている EBS を選択し「タグ」のタブから以下のような感じで追加します。

Terraform の場合は以下のようなコードになりますね。
resource "aws_ebs_volume" "example" {
availability_zone = "ap-northeast-1a"
type = "gp3"
size = 5
tags = {
Name = "example-volume"
# EKS から静的ボリュームとして利用するために必要なタグ
"eks:eks-cluster-name" = module.eks.cluster_name
}
}
おわりに
ということで、上記の対処で解決しました。
特に 2 つ目は謎…。これどこかのドキュメントに書いてあるんですかね?ねえ Amazon さん???
同じ問題に遭遇した方の解決の一助になれば幸いです。
コメント