Screaming Loud

日々是精進

既存のEKSクラスタにFargate for EKS でAPI作成する際の導入でハマったところ

既存のEKSクラスタにterraformでFargateのPodを導入する際に、ハマったところを紹介します。

TL;DR

クラスタセキュリティグループ の設定を見直しましょう。

f:id:yuutookun:20210110003437p:plain
クラスタセキュリティグループ

mapRoleへの付与漏れ

Farage導入においては以下の記事がわかりやすいのですが、書いてあるとおりfargate profileを生成すると自動でmapRoleに pod execution roleが入ります。

tech.recruit-mp.co.jp

しかし、terraformで導入していてmapRoleもterraformで管理していると、

  1. terraformでfargate profileを作成
  2. aws側がmapRoleにpod execution roleの権限を追加
  3. terraformに記載されているmapRoleで上書き

となってしまい、mapRoleが消えてしまいます。

この事象が発生しているかは、 $ kubectl get eventUnauthorized 的な文言が出ているとmapRoleの付与漏れです。

fargate Podが起動しない

Podは作成されるけれど、以下のようなログを吐きfargateのノードが立ち上がらない問題が発生しました。 $ kubectl describe pod xxx のEventsで吐かれていました。

 Warning  FailedScheduling  55m   fargate-scheduler  Pod provisioning timed out (will retry) for pod

AWSのサポートに問い合わせてコントロールプレーン側のログを見てもらっても何も出ていませんでした。

結果としては、クラスタセキュリティグループのアウトバウンドがなぜか消えていたからでした。

fargateのノードはクラスタセキュリティグループがノードのセキュリティグループとして評価されるので、これのインバウンドとアウトバウンドはしっかり設定する必要があります。

EKS生成時に作られるクラスタセキュリティグループに対しては最低でも以下を許可する必要があります terraformで記載します

  ingress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    self        = true
  }
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }

クラスタセキュリティグループ

上の節でも紹介しましたが、fargateはクラスタセキュリティグループがノード(Pod)のセキュリティグループとして評価されます。 なので、ALBなどからつなぐにはクラスタセキュリティグループに対してALBのセキュリティグループを許可する必要があります。

EKSのネットワーク設定にある追加のセキュリティグループに設定されていても、そこはfargateでは評価されないので注意が必要です。

他にもクラスタ上の別のノードと通信するためにはfargateのクラスタセキュリティグループを許可させるために付与する必要があります。

kube-systemなど各ノードに散らばりがちなpodに対して通信するためには、クラスタセキュリティグループは全ノードに付与しておいたほうがおすすめです。

またfargateのpodを運用する場合、色々なセキュリティグループを随時許可する必要が出ると思うので、 terraformで運用する場合はクラスタセキュリティグループを terraform import しておいたほうがいいでしょう。

まとめ

fargateでのハマりどころは、ほぼ クラスタセキュリティグループ と言っていいかもしれません。 そこさえ気をつければ、他のハマりどころは少ないと思います。