ベーシック アドベントカレンダー 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でもできる方法を探したい
以上になります。
それではみなさま少し早いですが、今年もお世話になりました。来年もよろしくお願いいたします!