EKS Auto Modeで既存のTarget GroupをTargetGroupBindingで使う方法
EKS Auto Modeでは既存のTarget GroupをTargetGroupBindingで使えない?
EKSを利用しており、昨年末にリリースされたEKS Auto Modeへの移行を検討しています。Auto Modeのドキュメントを読み漁っていると気になる記述がありました。
You cannot bring your own target groups
2025/02/18時点ではこの記述が Learn about VPC Networking and Load Balancing in EKS Auto Mode - Amazon EKS にありました。現在は削除されたようです。
現在(2025/03/17)でも日本語版ドキュメントではこの記述が残っています。
この「You cannot bring your own target groups」について具体的な説明がドキュメントに見当たらなかったのですが、既存のTarget GroupをTargetGroupBindingリソースで使う(参照する)ことができないということなのか?と推測しました。現在非Auto Modeのクラスターでこの構成を利用しているため、できないのであれば問題です。
既存のTarget GroupをTargetGroupBindingリソースで参照するとは
まずTargetGroupBindingというのは、AWS Load Balancer Controllerで定義されているCRDで、Target GroupにTargetを登録するためのリソースです。ここでいうTargetはトラフィックを流したいService配下のPod郡です。
AWS Load Balancer Controllerを用いて IngressでALB、もしくはServiceでNLBを作成する場合は、このTargetGroupBindingも自動で併せて作成されます。
一方、IngressやServiceを使わずこのTargetGroupBindingリソース単体をデプロイすることも可能で、その場合ALBやNLB、TargetGroup、他にもリスナーやリスナールールなど関連リソースはIngressやServiceで作成されるのではなく、クラスター外で作成した所謂「既存の」ものを利用する(既存のTargetGroupにターゲットを登録できる)ことができます。以下のように作成済みTargetGroupの名前やARNを指定することで実現可能です。
apiVersion: elbv2.k8s.aws/v1beta1
kind: TargetGroupBinding
metadata:
name: my-tgb
spec:
serviceRef:
name: awesome-service # route traffic to the awesome-service
port: 80
targetGroupName: <name-of-the-targetGroup>
apiVersion: elbv2.k8s.aws/v1beta1
kind: TargetGroupBinding
metadata:
name: my-tgb
spec:
serviceRef:
name: awesome-service # route traffic to the awesome-service
port: 80
targetGroupARN: <arn-to-targetGroup>
※ 上記マニフェストファイルの引用元: Sample YAMLs - TargetGroupBinding - AWS Load Balancer Controller
繰り返しますが、Auto Mode(に内包されているLoad Balancer Controller)ではこのような既存のTarget GroupをTargetGroupBindingリソースで使う(参照する)ことができないということなのか?と推測しました。
検証
まず必要な変更を実施
上記に記載されている変更を反映します。
+ apiVersion: eks.amazonaws.com/v1
- apiVersion: elbv2.k8s.aws/v1beta1
kind: TargetGroupBinding
metadata:
name: my-tgb
spec:
serviceRef:
name: awesome-service # route traffic to the awesome-service
port: 80
targetGroupARN: <arn-to-targetGroup>
+ spec.targetType: ip
また、 AWS Load Balancer ControllerのHelm リリースを削除しました。(Auto Modeが内包しているため、自前で用意する必要が無くなりました。)
最後に、(当然ですが)Auto Modeを有効化しました。
変更を反映してみた結果
TargetGroupのターゲットがゼロになりました。
予想通り、Auto Modeでは既存のTarget GroupをTargetGroupBindingリソースで使う(参照する)ことができなさそうです。
AWS Load Balancer ControllerのPodはAuto Modeで隠蔽化されているので、デバッグが難しいのが辛いところ…
解決方法
上記 GitHub issue内のコメントの通りなのですが、TargetGroupに以下タグ・タグ値を指定することで解決できました!
- タグ名: eks:eks-cluster-name
- 上記タグの値: 紐づくEKSクラスターの名前
上記で解決できる理由
端的に言うとターゲット登録ができなかった理由は権限不足でした。
Auto Modeでは、Load Balancer Controllerが内包されているため、TargetGroupBindingリソースによるTarget Groupへのターゲットの登録は自動で行なわれる、つまりAuto Modeが面倒を見てくれます。
そして、Auto Mode内包のLoad Balancer ControllerがTarget Groupにターゲットを登録する際に使用するIAMエンティティは、EKSクラスターに紐づいているIAM Role(クラスター IAM ロール)です。
このクラスターIAMロールにアタッチすべきポリシーは以下ドキュメントにまとめられています。
そのうちの一つである AmazonEKSLoadBalancingPolicy
AWS マネージドポリシーに以下ポリシーが定義されていて、この部分がAuto ModeがTargetGroupにターゲットを登録できる根拠となる許可設定です。
{
"Effect" : "Allow",
"Action" : [
"elasticloadbalancing:RegisterTargets"
],
"Resource" : "arn:aws:elasticloadbalancing:*:*:targetgroup/*/*",
"Condition" : {
"StringEquals" : {
"aws:ResourceTag/eks:eks-cluster-name" : "${aws:PrincipalTag/eks:eks-cluster-name}"
}
}
}
Condition句に先ほど紹介したタグとタグ値が指定されています。つまりこのタグとタグ値を持つTargetGroupでないとターゲット登録ができないというわけです。
懸念
AmazonEKSLoadBalancingPolicy
はAWS マネージドポリシーである以上、AWS側で今後も更新される可能性があります。考えすぎかもしれませんが、今後Condition句が改変されて再度ターゲット登録が不可になるかもしれません。前述のとおりドキュメント内の「You cannot bring your own target groups」の記述も削除されているので、大丈夫そうな気もしますが‥
この点が気になる方はAmazonEKSLoadBalancingPolicy
ポリシーとは別に独自のポリシー(例: Condition句無しでelasticloadbalancing:RegisterTargets
を許可する)を定義してクラスターIAMロールにアタッチしてください。