Amazon Fargate for Amazon EKSを試してみた #reinvent
みなさん、こんばんは!
AWS事業本部の青柳@福岡オフィスです。
今、私は猛烈に感動しています!!(大げさ)
[速報] Fargete for EKSがGAされました!!! #reinvent | Developers.IO
そう、以前からリリース予定とされてきた Amazon Fargate for Amazon EKS がとうとう正式発表されたのです!
しかも、即日使えるようになっています!
ということで、さっそく試してみました。
やってみた
AWS公式ブログ (英語) が公開されていますので、こちらを参考に進めてみます。
Amazon EKS on AWS Fargate Now Generally Available | AWS News Blog
準備その1: EKSクラスターの作成
まず、通常通りにEKSクラスターを作成します。
サクっと作成するために eksctl
コマンドを使います。
上記ブログを読むと、eksctl コマンドも「Fargate for EKS」に対応するようなことが書かれていますが、現時点ではリリースされていないようですので、既存のバージョンを使いました。
eksctl create cluster
コマンドで最低限のパラメータ (クラスター名のみ) を指定してクラスターを作成します。
eksctlコマンドはVPCやセキュリティグループなど必要なリソースも併せて作成してくれるのでラクチンです。
$ eksctl create cluster --name test-cluster
準備その2: 「Pod実行IAMロール」の作成
クラスターが作成されるのを待つ間に、今回重要となる「Pod実行IAMロール」(Pod execution role) を準備します。
Pod実行IAMロールとは、サービスプリンシパル eks-fargate-pods.amazonaws.com が信頼されたサービスロールです。
ロールの作成はマネジメントコンソールやeksctlコマンドで本来は行えるはずなのですが、まだ対応していないようなので、AWS CLIで作成します。
(ここの手順、まだドキュメントも用意されていなかったので、ちょっと苦労しました(笑))
2019/12/04 04:00追記 ちゃんとドキュメント用意されました。さっき見た時は無かったのに(泣)
Pod Execution Role - Amazon EKS
まず、信頼ポリシーのJSONを作成します。
{ "Version": "2012-10-17", "Statement": { "Effect": "Allow", "Principal": { "Service": "eks-fargate-pods.amazonaws.com" }, "Action": "sts:AssumeRole" } }
信頼ポリシーJSONファイルを使用してIAMロールを作成します。
$ aws iam create-role \ --role-name AmazonEKSFargatePodExecutionRole \ --assume-role-policy-document file://eks-fargate-pods-policy.json
必要となるアクセス権限ポリシーをアタッチします。
アタッチするポリシーとしてはAWS管理ポリシー「AmazonEKSFargatePodExecutionRolePolicy」が用意されているようです。
$ aws iam attach-role-policy \ --role-name AmazonEKSFargatePodExecutionRole\ --policy-arn "arn:aws:iam::aws:policy/AmazonEKSFargatePodExecutionRolePolicy"
これでPod実行IAMロールの準備は完了です。
このロールは後の手順で必要となります。
「Fargateプロファイル」の作成
さて、ここからが本題です。
EKSクラスターの作成が終わりましたら、マネジメントコンソールでEKSクラスターを表示します。
従来は無かった「Fargate plofiles」というブロックがあるのが分かります。
「Add Fargate profile」をクリックします。
ここで、さきほど準備した「Pod実行IAMロール」が必要になります。
サービスプリンシパル eks-fargate-pods.amazonaws.com が信頼されたIAMロールしか選択できないので、注意してください。
サブネットは「プライベートサブネット」のみ指定できるため、パブリックサブネットは「×」を押して選択から外してください。
次へ進みます。
「Pod selectors」の設定を行います。
Pod selectorsとは、Fargate上で実行させたいPodの条件を指定することです。
具体的には、KubernetesのNamespaceを指定することで、特定のNamespaceに属するPodのみがFargate上で実行されるように制御することができます。
ここでは「default」Namespaceを指定します。
(defaultは、kubectlコマンドなどでNamespaceを特に指定しなかった場合にデフォルトで選択されるNamespaceです)
次へ進みます。
サマリが表示されるので、確認して「Create」をクリックします。
Fargateプロファイルの作成が始まり、しばらく待って、ステータスが「ACTIVE」になれば作成完了です。
これで準備は終わりました。
PodをFargate上で実行する
ここからは kubectl
コマンドを使います。
まず最初に、ノードの状態を確認してみましょう。
$ kubectl get nodes NAME STATUS ROLES AGE VERSION ip-192-168-17-98.ap-northeast-1.compute.internal Ready <none> 34m v1.14.7-eks-1861c5 ip-192-168-47-26.ap-northeast-1.compute.internal Ready <none> 34m v1.14.7-eks-1861c5
ノードが2つ存在するのが分かります。
Podを起動してみます。
nginxを起動するシンプルなDeploymentを作成します。
$ kubectl create deployment demo-app --image=nginx deployment.apps/demo-app created
1分程度でPodが実行状態になりました。
$ kubectl get pods NAME READY STATUS RESTARTS AGE demo-app-6dbfc49497-55lmr 1/1 Running 0 78s
ここで再度、ノードの状態を確認してみます。
$ kubectl get nodes NAME STATUS ROLES AGE VERSION fargate-ip-192-168-134-169.ap-northeast-1.compute.internal Ready <none> 29s v1.14.8-eks ip-192-168-17-98.ap-northeast-1.compute.internal Ready <none> 36m v1.14.7-eks-1861c5 ip-192-168-47-26.ap-northeast-1.compute.internal Ready <none> 36m v1.14.7-eks-1861c5
おぉー!!
Fargate
と名前に付いた「ノード」が1つ追加されているではないですか!!
つまり、Podの実行要求によりオンデマンドでFargateが起動されて、Fargate上でPodが実行されたということです。
では、Podを終了してみましょう。
$ kubectl delete deployment demo-app deployment.extensions "demo-app" deleted $ kubectl get pods No resources found in default namespace.
Podが終了したことを確認しました。
ノードの状況を見てみましょう。
$ kubectl get nodes NAME STATUS ROLES AGE VERSION ip-192-168-17-98.ap-northeast-1.compute.internal Ready <none> 74m v1.14.7-eks-1861c5 ip-192-168-47-26.ap-northeast-1.compute.internal Ready <none> 74m v1.14.7-eks-1861c5
Fargateノード (と言っていいのか分かりませんが) が消えていることが分かります。
必要な時に立ち上がり、不要になれば終了する、まさにFargateですね!!
おわりに
ごく簡単な範囲ではありますが、Fargate for EKSの実際の動きを確認することができました。
いろいろな可能性が感じられるFargate for EKSです。
まだ他にもたくさん試してみることがありそうですので、また「やってみた」らブログにしたいと思います。