ベーシック アドベントカレンダー 17日目の記事です。

こんにちわ。okuyamaです。
ベーシックでは主にサーバーサイドやインフラ周りを担当しています。

EKS上で動くアプリケーションを外部に公開する場合、ALB Ingress Controllerを使う方法が主流になっています。ALB Ingress Controllerを使うとKubernetesのマニフェストファイルに従って必要なAWSリソースを自動で作ってくれるので、簡単にサービスを公開することができます。一方、ALBがEKSのクラスタに依存してしまうという問題があります。

私が関わっているWEBサービスでも、一部ALB Ingress Controllerを利用して公開しましたが、以下のような理由でKubernetesの外でALBを管理したいケースが出てきました。

  • EKSに移行する時に既存のALBを利用したい
  • ALBとターゲットグループをTerraformで管理したい
  • ALBをKubernetesと疎結合にしたい

そこで今回はALB Ingress Controllerを使わないで、既存のALBを使ってEKS上で動くアプリケーションを公開してみます。

今回試した構成

  • Kubernetes version: 1.14
  • EKS: Platform version eks.6
  • データプレーン: Managed Node Groups
    ※現状Fargateでこの方法は使えません。ALB Ingress Controllerを使う必要があります。

Kubernetesのマニフェストの設定

公開したいサービスの設定でnodePortを固定にします。ポートは30000〜32767の範囲で指定でき、他のサービスと被らないようにする必要があります。

---
apiVersion: v1
kind: Service
metadata:
  name: hoge-svc
  labels:
    type: hoge
spec:
  type: NodePort
  selector:
    type: hoge
  ports:
  - name: http
    protocol: TCP
    port: 80
    nodePort: 30020 # ノードの30020ポートで受信

ALB Ingress Controllerの場合この他にIngressの設定が必要ですが、今回は利用しないため記述しません。

次に必要なAWSリソースを作成して行きます。
※この記事ではTerraformを使ってAWSリソースを構築していますが、AWSのコンソールで直接操作したり、CloudFormationでも同じ手順で構築できます。

ターゲットグループの作成

ワーカーノードのインスタンスに30020ポートで転送するようにターゲットグループを作成します。

resource "aws_lb_target_group" "hoge" {
    name                 = "hoge-tg"
    port                 = 30020 # ↑で指定したポートと同じ
    protocol             = "HTTP"
    target_type          = "instance"
    vpc_id               = "<VPC ID>"
}

オートスケーリンググループにターゲットグループをアタッチ

EKSのManaged Node Groupsで作成されたオートスケーリンググループにターゲットグループをアタッチします。こうすることでノードグループにあるインスタンスが自動でターゲットグループに追加されるようになります。

resource "aws_autoscaling_attachment" "hoge" {
  autoscaling_group_name = "<オートスケーリンググループ名>"
  alb_target_group_arn   = "<↑で作成したターゲットグループのARN>"
}

ワーカーノードのセキュリティグループにルールを追加

ワーカーノードのセキュリティグループにALBからのトラフィックを許可するインバウンドルールを追加します。

resource "aws_security_group_rule" "all_alb" {
  security_group_id        = "<ワーカーノードのセキュリティグループのID>"
  type                     = "ingress"
  from_port                = 30020 # ↑で指定したポートと同じ
  to_port                  = 30020 # ↑で指定したポートと同じ
  protocol                 = "tcp"
  source_security_group_id = "<ALBのセキュリティグループのID>"
}

ALBのリスナールールを追加

あとは、ALBのリスナールールにターゲットグループにルーティングするルールを追加すればサービスが公開されます。

resource "aws_lb_listener_rule" "hoge_routing" {
  listener_arn = "<リスナーのARN(省略)>"
  priority     = 99

  action {
    type             = "forward"
    target_group_arn = "<ターゲットグループのARN>"
  }

  condition {
    path_pattern {
      values = ["/*"]
    }
  }
}

まとめ

  • ALB Ingress Controllerを使わずに既存のALBでEKS上のサービスを公開できました
  • 既存のALBを使ってターゲットレベルでEKSに切り替えができるようになりました
  • Fargateでもできる方法を探したい

以上になります。
それではみなさま少し早いですが、今年もお世話になりました。来年もよろしくお願いいたします!