Amazon Web Services ブログ

AWS Fargate 上の Amazon EKS を一般公開

本日より、皆さんは、Amazon Elastic Kubernetes Service を使用して、AWS Fargate の上でKubernetes ポッドを利用できます。Amazon EKSFargate は、AWS 上での Kubernetes ベースのアプリケーションの実行をわかりやすいものにします。ポッドを用意して、そのインフラストラクチャを管理する必要がなくなるからです。

AWS Fargate では、コスト最適化され、可用性の高いクラスターを稼働するのに、Kubernetes 運用の専門的な知識は必要ありません。Fargate は、お客様が Amazon EKS クラスターのためにEC2 インスタンスを作成し、管理する必要をなくします。

もはや、クラウド上で Kubernetes アプリケーションを実行するため、EC2 インスタンスのクラスターのパッチング、スケーリング、セキュア化の問題で頭を悩ませる必要はなくなります。Fargate を使えば、リソースを定義し、ポッドレベルでその支払いを行えます。これにより、アプリケーションごとに適切なサイズのリソースを利用することが容易になり、ポッドごとのコストを明確に知ることができます。

このブログの後半では、新しい機能を試してみて、Amazon EKSFargate 上で使用し、シンプルな Kubernetes ベースのアプリケーションをデプロイしてみましょう。

クラスターを構築する
クラスタのセットアップを行う最も簡単な方法は、EKS の正式な CLI ツールである eksctl を使用することです。以下のコマンドは、ワーカーノードのない、demo-newsblog というクラスターを作成します。

eksctl create cluster --name demo-newsblog --region eu-west-1 --fargate

この 1 行のコマンドは、実に多くのことを行います。クラスターを作成するばかりでなく様々な事柄を行いますが、とりわけ、Fargate プロファイルの作成があります。

Fargate プロファイルでは、Fargate 上でのどの Kubernetes ポッドを実行するか、ポッドをどのサブネットで実行するか、そして、Kubernetes エージェントが使用する IAM 実行ロールを提供します。これは、コンテナイメージをポッドにダウンロードし、私の代わりに他のアクションを行います。

Fargate プロファイルを理解することは、この機能の働きを理解する鍵です。それで、自動的に作成されたFargate プロファイルを削除して、自分でもう一度作成してみることにしましょう。

Fargate プロファイルを作成するには、Amazon Elastic Kubernetes Service コンソールを使用して、demo-newsblog というクラスターを選択します。詳しく言うと、Fargate プロファイルのの下で、Add Fargate プロファイルを選択します。

それから、新しいFargate プロファイルを設定する必要があります。名前として、「demo-default」と入力します。

ポッドの実行ロールとしては、 eks-fargate-pods.amazonaws.com サービスプリンシパルを持つ IAM ロールだけが表示されます。eksctl ツールは AmazonEKSFargatePodExecutionRole という IAM ロールを作成します。マニュアルには、このロールを全く新規に作成する方法が説明されています。

Subnets セクションでは、デフォルトで、私のクラスターの VPC のすべてのサブネットが選択されています。しかし、Fargate ポッドではプライベートサブネットだけがサポートされているので、2 つのパブリックサブネットの選択は解除します。

[Next] をクリックすると、Pod selectors 画面が表示されます。ここで、ネームスペースを入力するように求められます。default を追加します。これは、default の Kubernetes ネーヌスペース内で作成されるすべてのポッドが、Fargate 上で動作することを意味していますポッドを Fargate 上で実行するために、Kubernetes アプリを変更する必要がないことに注意してください。必要なのは、Fargate プロファイルだけです。Kubernetes アプリ内のポッドが、プロファイルで定義されたネームスペースとマッチするなら、そのポッドは Fargate 上で動作することになります。

ここには、ラベルマッチの機能もありますが、これは使用しないことにします。これを使えば、選択したポッドに対してラベルを指定して、このプロファイルで動作するポッドをさらに具体的に指定することができます。

最後に、[Next]、それから [Create] をクリックします。プロファイルを作成してアクティブにするのにかかったのは 1 分間です。

このデモでは、Fargate で実行できるすべてのものを示したいと思います。これには、Kubernetes の一部である CoreDNS ポッドが含まれます。それらを Fargate で実行するため、2 番目の Fargate プロファイルを追加します。kube-system ネームスペースに含まれるすべてのもののためです。この時点で、デモに少しのバラエティを加えるため、プロファイルの作成のために、コマンドラインを使うことにします。

実際には、2 番目のプロファイルを作る必要はありません。最初のプロファイルに追加のネームスペースを加えればよいのです。しかしここでは、プロファイルを作成する別の方法を見てみることにしましょう。

まず、以下の内容のファイルを作成して、demo-kube-system-profile.json という名前で保存します。

{
    "fargateProfileName": "demo-kube-system",
    "clusterName": "demo-news-blog",
    "podExecutionRoleArn": "arn:aws:iam::xxx:role/AmazonEKSFargatePodExecutionRole",
    "subnets": [
        "subnet-0968a124a4e4b0afe",
        "subnet-0723bbe802a360eb9"
    ],
    "selectors": [
        {
            "namespace": "kube-system"
        }
    ]
}

それから、上記のファイルを含んでいるフォルダーに移動して、ターミナルから create-fargate-profile コマンドを実行します。

aws eks create-fargate-profile --cli-input-json file://demo-kube-system-profile.json

これで、コンテナをクラスターにデプロイする準備ができました。単純にするため、nginx のインスタンスを 1 つだけ、次の kubectl コマンドを使用してデプロイします。

kubectl create deployment demo-app --image=nginx

それから、get pods コマンドで、ポッドの状態を確認します。

kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
demo-app-6dbfc49497-67dxk   0/1     Pending   0          13s

get nodes を実行すると、3 つのノードがあることがわかります (2 つは coreDNS、1 つは nginx のためです)。これらのノードは、ポッドを実行するためにインスタンス化されたコンピューティングリソースを表しています。

kubectl get nodes
NAME                                                   STATUS   ROLES    AGE     VERSION
fargate-ip-192-168-218-51.eu-west-1.compute.internal   Ready    <none>   4m45s   v1.14.8-eks
fargate-ip-192-168-221-91.eu-west-1.compute.internal   Ready    <none>   2m20s   v1.14.8-eks
fargate-ip-192-168-243-74.eu-west-1.compute.internal   Ready    <none>   4m40s   v1.14.8-eks

少ししてから、get pods コマンドをもう一度実行すると、demo-app のステータスは Running になっています。これにより、コンテナが Fargate 上に正しくデプロイされたことがわかります。

kubectl get pods
NAME                        READY   STATUS    RESTARTS   AGE
demo-app-6dbfc49497-67dxk   1/1     Running   0          3m52s

料金と制限
AWS Fargate を使用する場合には、ポッドを実行するために必要だった vCPU とメモリリソースの分だけ支払えば十分です。これには、ポッドとともに Kubernetes のコンポーネントを実行するために必要だった少量のメモリと、ポッドがリクエストしたリソースが含まれます。Fargate 上で動作するポッドは、既存の料金モデルに従います。vCPU とメモリリソースはポッドのコンテナイメージがプルされてからポッドが終了するまでの時間を、秒単位で丸めた時間から計算されます。最低料金としては 1 分間が適用されます。加えて、実行する EKS クラスターごとに、1 時間 $0.20 の割で支払います。

それから、現時点では、知っておくべきいくつかの制限があります。

  • 各ポッドが使用できるのは最大 4 vCPU と 30Gb のメモリです。
  • パーシステントボリュームやファイルシステムで必要とされるステートフルなワークロードのサポートは、現時点ではありません。
  • Daemonsets、Privileged ポッド、または HostNetwork または HostPort を使用するポッドは実行できません。
  • 利用できるロードバランサーは、Application Load Balancer だけです。

今すぐ始めましょう
AWS Fargate 上の Amazon EKS を自分で調べてみたいと思うなら、EKS コンソールを使用して今すぐ始められます。米国東部 (バージニア北部)米国東部 (オハイオ)欧州 (アイルランド)、およびアジアパシフィック (東京) で利用できます。

— Martin