ちょっと話題の記事

Amazon Fargate for Amazon EKSを試してみた #reinvent

re:Invent 2019で発表された「Amazon Fargate for Amazon EKS」を試してみました。
2019.12.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

みなさん、こんばんは!
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を作成します。

eks-fargate-pods-policy.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です。

まだ他にもたくさん試してみることがありそうですので、また「やってみた」らブログにしたいと思います。