【AWS】EKS on Fargateでゲームをデプロイしてみたので解説してみる(with Ingress Controller, 2048)vol.1


はじめに

AWS re:Invent 2019にてEKS on Fargateが発表されました。
もう3ヶ月くらい前ですが。。

そのEKS on Fargateを使ってみましたので、使い方とその解説をしてみようと思います。(タイトル通り)

また、操作画面のスクショを貼っているのですが、
記事が非常に長くなってしまうため、一部折りたたんでいます。

想像以上に作成に時間がかかってしまい、2部作で展開します。
完全に私の力不足です。。

EKSとは

AWS公式より

Amazon Elastic Kubernetes Service

AWSでKubernetesを簡単に実行できるマネージド型のKubernetesサービスです。

Kubernetesをよしなに管理してくれるサービスです。(雑)
ECS(Elastic Container Service)というDockerコンテナを管理するサービスがあるのですが、
そのKubernetes版と考えています。(私感)

Fargateとは

AWS公式より

コンテナ向けサーバーレスコンピューティングエンジンです。

サーバーのプロビジョニングと管理が不要になります。

インスタンスの選択やクラスター容量のスケーリングなしに、適切なコンピューティング容量が割り当てられます。

コンテナを稼働させるサーバーをよしなに管理してくれるサービスです。

ECS or EKSを使用する際に、サーバーをEC2 or Fargateから選択することができます。
選択されたサーバー(EC2 or Fargate)の上で、サービス(ECS or EKS)で管理するコンテナが稼働することになります。

EC2を選択した場合、このEC2の起動・停止やスケーリングは、ユーザーが設定・管理しなければなりません。
一方Fargateを選択した場合、サーバーの管理等が必要なくなります。

少しまとめると、コンテナサービス利用の選択肢としてはこの4択になります。

  1. ECS + EC2
  2. ECS + Fargate
  3. EKS + EC2
  4. EKS + Fargate

デプロイするアプリやサービスの特性によってこの4択から最適なものを選ぶ必要がありますね。

長くなってしまいましたが、4. EKS + Fargateを当記事では扱います。

当記事でのゴール

EKS on Fargateを使って、
2048ゲームをデプロイして遊べるようにしたいと思います。

2048とはこのようなゲームです。
きっと皆さん見たこと、遊んだことのあるゲームだと思います。

前提条件

  • AWSのアカウントを所持している
  • macOS
  • eksctlコマンドではなく、マネジメントコンソールを使用して構築する
    • サービスの理解を深めるため

実際にはeksctlコマンドで一発でクラスターを作成できたりします。

$ eksctl create cluster

それでは何もわからないまま終わってしまうので、
一つ一つ解説を入れながらマネジメントコンソールで作っていきたいと思います。

全体の流れ

  1. クラスターの作成
  2. Fargateプロファイルの作成
  3. kubectlコマンドでサービスをデプロイ

1. クラスターの作成

まず初めにクラスターを作成します。
クラスターとは以下の2つの要素で構成されています。

  • EKSコントロールプレーン

    • Kubernetesソフトウェアを実行してくれるやつ
    • EKSエンドポイントを持っています(後で利用します)
  • EKSワーカーノード

    • コンテナを立ち上げるサーバー
    • これをFargateであれこれよしなにやってもらいます

では実際に作成してみましょう。

1.1. (一般設定) クラスター名とIAMロールの設定

AWSマネジメントコンソールからEKSのサービスを選択します。
そして左のメニューから、「EKSクラスター」 > 「クラスターを作成」を選択していきます。

>>>

まずは一般設定として、以下の項目を設定します。

  • クラスター名
  • Kubernetesバージョン(デフォルトのままでOK)
  • IAMロール

該当するIAMロールが存在しない場合、新規に作成する必要があります。

(2020 3/30追記)
ここでのIAMロールは、EKSとKubernetesコントロールプレーンに与える権限を設定します。
主な権限は、EC2とELB(ロードバランサー)の操作権限です。

1.2. IAMロール作成(未作成の場合)

以下、IAMロールが未作成の場合に実施してください

一般設定の「ロール名」を選択することで、別タブにIAMロール作成画面が表示されるので、「ロールの作成」を選択します。

次にロール作成画面にて、
「AWSサービス」 > 「EKS」 > 「EKS」 > 「次のステップ:アクセス権限」> 「次のステップ:タグ」
と選択していきます。

>>>

タグにロールの名前を設定して、「次のステップ:権限」を選択します。
次のページでロール名を入力してから「ロールの作成」を選択することで、EKSクラスター用のIAMロールが作成されます。

>>>


1.3. プライベートサブネット作成(未作成の場合)

次のチャプターでクラスターのネットワーク設定を行うのですが、
Fargateに設定するためのプライベートサブネットが最低1つ必要になります。

作成したことがない場合、以前の記事で解説していますのでそちらを参照ください。
【AWS】プライベートサブネット3分クッキング(ハンズオン)

またパブリックサブネットとプライベートサブネットの違いについても、以前の記事で解説しています。
【AWS】パブリックサブネットとプライベートサブネットの違いとは

(2020 3/30追記)

今回はIngress Controllerを使用します。
Ingress ControllerによってALB(ロードバランサー)が作成されるのですが、このALBは 最低2AZ(アベイラビリティゾーン) にまたがる必要があります。
そのため、ここでは最低2つ、AZの異なるプライベートサブネットを用意ください。
NATゲートウェイは共用で構いません。

1.4. ネットワーク設定

EKSクラスターのネットワーク設定では、以下を設定する必要があります。

  • VPC(1つのみ)
  • サブネット(最低2つのAZ)
  • セキュリティグループ

AWSアカウントにはデフォルトのVPCと、
それに付随するパブリックサブネットが3つとセキュリティグループが1つ、
既に作成されていると思います。(私はありました)

また、Fargateに設定するためのプライベートサブネットが最低1つ必要になります。
今回私は以下を設定しています。

  • デフォルトのVPC
  • デフォルトのパブリックサブネット2つ(複数AZ)、プライベートサブネット 1つ 2つ(複数AZ)
  • デフォルトのセキュリティーグループ

EKSクラスターに設定すべきセキュリティグループについては、
Amazon EKS セキュリティグループの考慮事項
に記載されています。

これはVPCのデフォルトセキュリティグループと同等の設定なので、問題ありません。

また、APIサーバーエンドポイントのプライベート/パブリック設定ですが、
自分のPCからkubectlコマンドを使って操作する必要があるため、パブリック設定をONにしています。

セキュリティを考えるのであれば、同じVPC内にEC2を立ててそこから操作するべきなのかもしれません。

(2020 3/30追記)

2点修正点があります。

  1. プライベートサブネットは2つ(複数AZ)を設定する
  2. セキュリティグループの設定は必要ない

1点目は上記でも記載していますが、ALBを使用する際に必要になるためです。
2点目に関しては、ここでのセキュリティグループは追加で必要な時に設定するようです。
クラスターのセキュリティグループは自動で設定されます。

1.5. ロギング、タグ設定

Loggingは全て無効化のままで良いです。
必要なものを有効化することで、CloudWatchにログが送られるので、興味があったら設定してみてください。

Tagsにはクラスターの名前を設定します。
「Add tag」を選択すれば入力欄が出てきます。

EKSクラスターの設定は以上になるので、「作成」を実行してください。
クラスターの作成には数分かかります。

2. Fargateプロファイルの作成

EKSクラスターを作成したら、次にFargateプロファイルを作成します。
Fargateプロファイルでは、Fargate上で起動するPodを指定することができます。

Podとは

1つ以上のアプリケーションコンテナのグループ

基本的にはPod=コンテナのイメージで良いと思います。
ただ、1つのPodには複数のコンテナを共存させることもできることを、覚えておいてください。

Nodeとは

Podは常にノード上で動作します。
ノードはワーカーマシンであり、仮想・物理マシンのどちらであってもかまいません。

Node=サーバーです。
FargateおよびEC2を指します。

まとめると

Node上でPodは動作する ≒ Fargate上でコンテナは動作する
(厳密には違うかもしれません)

では実際にFargateプロファイルを作成していきましょう。
作成したクラスターの画面から、「Fargateプロファイルを追加」を選択します。

2.1. プロファイル設定・タグ設定

ここでは以下の4項目を設定します。

  • プロファイルに設定する名前
  • ポッド実行ロール
  • サブネット
  • タグ

サブネットには、プライベートサブネットを設定する必要があります。
全て設定したら、「Next」を選択します。

ポッド実行ロールとは、Fargate(Node)上でコンテナ(Pod)を作成する際に使用するIAMロールです。
Fargate(Node)上にはコンテナイメージがないため、クラスターからそのイメージを取得する必要があります。
未作成であれば、新規に作成が必要です。次の章でその手順を説明します。

サブネットはクラスターに設定されたサブネットの中から選択する必要があります。
Fargateは選択されたサブネットの中のいずれかに起動されます。(冗長化する場合は、別のサブネットに起動することが可能)
サブネットを1つのみにすれば、Fargateを起動するサブネットを固定することが可能です。

(2020 3/30追記)

ALB Ingress Controllerに対応するため、プライベートサブネットは最低2つ(複数AZ)を指定してください。

2.2. ポッド実行ロールの作成(未作成の場合)

以下、IAMロールが未作成の場合に実施してください

手順1.2と同様の手順で、IAMロールを作成していきます。
Fargateプロファイル設定画面の「ロール名」を選択することで、別タブにIAMロール作成画面が表示されるので、「ロールの作成」を選択します。

次にロール作成画面にて、
「EKS」 > 「EKS - Fargate pod」 > 「次のステップ:アクセス権限」> 「次のステップ:タグ」
と選択していきます。
>>>

次にNameタグを設定し、ロール名にも同様の設定をしたら、「ロールの作成」を実行します。
>>>

これでFargateプロファイルに必要な、ポッド実行ロールが作成できました。
手順2.1に戻り、Fargateプロファイルの設定を続けてください。


2.3. ポッドセレクタの設定

次に、ポッドセレクタを設定します。
Fargate上に起動するPodの条件を指定することができます。
ここでは、以下の名前空間(namespace)を持つPodをFargateで起動する設定をしています。

  • handson(今回デプロイするアプリ用)
  • kube-system(Kubernetesで使用されるnamespace)
  • default

その名前空間の中でも更に条件をつけることが可能です。
「ラベルを一致させる」を選択することで設定できますが、今回は行いません。

「次へ」を選択したら、確認画面が表示されるので「作成」を実行しましょう。
これでFargateプロファイルが作成されます。

3. kubectlコマンドでサービスをデプロイ

以降はvol.2の記事で解説していけたらと思います。。
記事は近日中(来週目標)に作成して公開します!!

(2020 3/31追記)
vol.2の記事を作成しました!
【AWS】EKS on Fargateでゲームをデプロイしてみたので解説してみる(with Ingress Controller, 2048)vol.2

まとめ

想像以上に時間がかかってしまいました。
Ingress Controllerの設定周りでだいぶ苦戦してしまっています。。

KubernetesやEKSを初見で触った時には、
数時間で完全理解!わりとゴツいKubernetesハンズオン!!
の記事に本当にお世話になりました。

図解付きで説明されていて、非常にわかりやすいと感じました。
こちらもぜひ、参考にしてみてください。

(2020 3/30追記)

今回命名にスネークチェーン(aaaa_bbb)を使用していますが、
AWSでは基本的に-(ハイフン)を使用することが望ましいかもしれません。
CloudFormationでは_(アンダーバー)が使えないことや、自動で作成されるリソースに-(ハイフン)が使われているためです。

とりあえずこの記事の範囲であれば問題はなさそうですが。

参考

AWS公式

その他記事