はじめに
AWS re:Invent 2019にてEKS on Fargate
が発表されました。
もう3ヶ月くらい前ですが。。
そのEKS on Fargate
を使ってみましたので、使い方とその解説をしてみようと思います。(タイトル通り)
また、操作画面のスクショを貼っているのですが、
記事が非常に長くなってしまうため、一部折りたたんでいます。
想像以上に作成に時間がかかってしまい、2部作で展開します。
完全に私の力不足です。。
EKSとは
[AWS公式](https://aws.amazon.com/jp/eks/features/)より
Amazon Elastic Kubernetes Service
AWSでKubernetesを簡単に実行できるマネージド型のKubernetesサービスです。
Kubernetes
をよしなに管理してくれるサービスです。(雑)
ECS
(Elastic Container Service)というDockerコンテナを管理するサービスがあるのですが、
そのKubernetes版と考えています。(私感)
Fargateとは
[AWS公式](https://aws.amazon.com/jp/fargate/)より
コンテナ向けサーバーレスコンピューティングエンジンです。
サーバーのプロビジョニングと管理が不要になります。
インスタンスの選択やクラスター容量のスケーリングなしに、適切なコンピューティング容量が割り当てられます。
コンテナを稼働させるサーバーをよしなに管理してくれるサービスです。
ECS
or EKS
を使用する際に、サーバーをEC2
or Fargate
から選択することができます。
選択されたサーバー(EC2
or Fargate
)の上で、サービス(ECS
or EKS
)で管理するコンテナが稼働することになります。
EC2
を選択した場合、このEC2
の起動・停止やスケーリングは、ユーザーが設定・管理しなければなりません。
一方Fargate
を選択した場合、サーバーの管理等が必要なくなります。
少しまとめると、コンテナサービス利用の選択肢としてはこの4択になります。
- ECS + EC2
- ECS + Fargate
- EKS + EC2
- EKS + Fargate
デプロイするアプリやサービスの特性によってこの4択から最適なものを選ぶ必要がありますね。
長くなってしまいましたが、4. EKS + Fargate
を当記事では扱います。
当記事でのゴール
EKS on Fargateを使って、
2048ゲームをデプロイして遊べるようにしたいと思います。
2048とはこのようなゲームです。
きっと皆さん見たこと、遊んだことのあるゲームだと思います。
前提条件
- AWSのアカウントを所持している
- macOS
-
eksctl
コマンドではなく、マネジメントコンソールを使用して構築する- サービスの理解を深めるため
実際にはeksctl
コマンドで一発でクラスターを作成できたりします。
$ eksctl create cluster
それでは何もわからないまま終わってしまうので、
一つ一つ解説を入れながらマネジメントコンソールで作っていきたいと思います。
全体の流れ
- クラスターの作成
- Fargateプロファイルの作成
-
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ロールが未作成の場合に実施してください**
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点修正点があります。
- プライベートサブネットは2つ(複数AZ)を設定する
- セキュリティグループの設定は必要ない
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公式
- AWS re:Invent 2019
- Amazon EKS の機能
- AWS Fargate
- Amazon EKS セキュリティグループの考慮事項
- AWS Fargate プロファイル
- ポッド実行ロール
その他記事