できたこと
- AWS Load Balancer Controllerを利用して ALB を作成する
- http で ALB を介して EKS クラスタへインターネット接続する
EKS でロードバランシング
色々すっ飛ばしますが、マニフェストファイルでtype: LoadBalancer
とすると、CLB になります。
ALB(というか ELB)を使用したい場合は、AWS Load Balancer Controller を利用します。
※余談ですが、EKS のワークショップではしれっと CLB です。
目的がコンテナ、Kubernetes を体感してもらうことだと理解してるので、まあいいかなと思いますが。
AWS Load Balancer Controller の名前について
2020 年 10 月に AWS ALB Ingress Controller から名前が変わってメジャーバージョンも 2 に上がっています。ただし、まだまだ Ingress Controller で調べた方が記事が出てきます。
ちなみに、AWS のブログいわく、この 2 つの間では後方互換が保たれているらしく、ガイドも出ています。インフラは AWS で変わらないからそりゃそうか。
クラスタへの AWS Load Balancer Controller のインストール
ここからはできたことの詳細ログを残していきます。ちなみに、同義の手順がすごくたくさんの場所にあるので、極力冒頭にある公式ドキュメントにしたがっていきます。
ちなみに、同義の手順はこの辺です。
- https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/aws-load-balancer-controller.html
- https://aws.amazon.com/jp/premiumsupport/knowledge-center/eks-alb-ingress-controller-setup/
- https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/alb-ingress.html
事前準備
- 使用する AWS 環境を固定する
export AWS_PROFILE= export AWS_REGION=ap-northeast-1
- EKS クラスタがなければ作成する
- これはEKS のワークショップを参考にして作成するといいと思います
eksctl
コマンドを使えるようにしておく
IAM Permissions
クラスタから LB のリソースを作成するので、権限を与えてやる必要があります。
Create IAM OIDC provider
サービスアカウントってなんだというレベルだったのでわからなくなりました。
なんで OIDC が突如出てくるのかよく分からないが、言われるがままに。
- そもそも EKS は元々ポッド単位の IAM 制御ができなかった
- Kubernetes のサービスアカウント(ユーザ)の認証パターンの 1 つにOIDC 認証があって、2019 年に利用できるようになった
- AWS Load Balancer Controller に必要なサービスアカウントも それを使う
|
|
多分、頑張れば AWS CLI とかでも再現できるんだろう。。。
クラスタの IDP の URL にある ID が IAM の ID プロバイダの名前になっていることが確認できるはずです(ややこしい)。
Download IAM policy for the AWS Load Balancer Controller
AWS Load Balancer Controller に必要なポリシーが羅列されたファイルです。
Create an IAM policy called AWSLoadBalancerControllerIAMPolicy
実行ログ(一部マスク)だけ。
|
|
Create a IAM role and ServiceAccount for the AWS Load Balancer controller
以下の 2 つをやってくれる。
- 前で作成されたポリシーに紐づくロールを作成
- クラスタ内にサービスアカウントを作成
|
|
下記で確認できる。Annotations のところで、作成した role がアタッチ(実質そう言っていいだろう…)されています
|
|
ちなみに
no task となって過去のが残っている場合
|
|
eksctl
の不具合なのだろうか、ゴミが残っている。これに従って、まずは削除しておく。環境削除する際も、この手順相当のものをしておいた方が良さそう。
|
|
Add Controller to Cluster
下準備ができたので、Controller を追加します。
Install cert-manager
その名の通りなのだろうが、言われるがままにやってみる。
|
|
Apply YAML
インストールしたい Controller のバージョンをインストールして利用します。
公式がなぜか wget で書いていたので、v2.2 の場合の curl を書きました。
|
|
何も考えずにやると…
|
|
serviceaccount/aws-load-balancer-controller configured
これがダメだった。。。「Create a IAM role and ServiceAccount for the AWS Load Balancer controller」で設定できているので、この項目自体消してねっていうガイドだった。(わかりにくい気がするんだが・・・私の未知ですけど)
確認方法はこちら
|
|
サンプルアプリの実行
2048 のサンプルアプリを実行します
|
|
Controller のログはこれで見れます。
|
|
ちなみに、私の場合はこんなエラーが出ました。
|
|
サブネットが見つかんないと言われてますね。
StackOverflow を調べると…
https://stackoverflow.com/questions/66039501/eks-alb-is-not-to-able-to-auto-discover-subnets
公式ドキュメントにもちゃんと書かれてました。
サブネットへのタギングをしないとダメみたいです。今回は internet-facing なので、少なくともパブリックサブネットにkubernetes.io/role/elb
のタグ付けが必要です。
この辺を乗り越えて、2048 を楽しめました。
参考サイト
- 【初心者】Amazon EKS を使ってみる #3 (AWS Load Balancer Controller による Ingress の利用)
- 同じように HTTP 接続ができるところまでがゴール
- ALB で gRPC を利用する on EKS
- gRPC 通信は HTTPS のみなので、それに関連した作業が必要になります。