Amazon EKS on AWS Fargate試してみた

Yuya Sugano
12 min readDec 22, 2019

--

AWS ECS(Elastic Container Service)で使用できるFargateがEKS(Elastic Kubernetes Service)でも選択できるようになりました。[1]

Amazon EKS on AWS Fargate

いままでAWS上でコンテナ環境を使用するには ECS on EC2 / ECS on Fargate / EKS on EC2と3つの選択肢がありましたが、今回の追加でEKS on Fargateが加わり4つの方法が得られたことになります。EKS on EC2では得られなかったサーバレスコンピューティングのメリットをEKS(Elastic Kubernetes Service)でも享受できます。EC2を使用する必要はないので、ポッドのインスタンスの管理、パッチやスケーリングの手当が不要になります。

ポッドレベルでのリソース割り当てのみに注視すればよく、Kubernetesのクラスタを構成するEC2のスケーリングやセキュリティ対応から解放されるとのことです。以下の公式ニュースブログの内容を試してみました。[2]

  • EKSクラスタの作成
  • Fargateプロファイル作成
  • nginxコンテナの展開

EKSクラスタの作成

Amazon EKSのユーティリティツールである eksctl をインストールします。 aws cli のバージョン 1.16.308 以上および GitTag のバージョン 0.11.0 以上が必要です。以下の手順に沿って eksctl をインストールしました。[3]

https://docs.aws.amazon.com/eks/latest/userguide/getting-started-eksctl.html

GitTag greatere than 0.11.0 is must !!
$ aws --version
aws-cli/1.16.212 Python/2.7.12 Linux/4.4.0-62-generic botocore/1.12.202

aws cli をアップグレードしました。

$ pip install awscli --upgrade --user
Collecting awscli
Downloading https://files.pythonhosted.org/packages/8f/86/54c770eac9c1dfcc4a223f8b2a275d2412b2c79282eaad0132272f29dc0c/awscli-1.16.308-py2.py3-none-any.whl (2.7MB)
|????????????????????????????????| 2.7MB 1.7MB/s
Successfully installed awscli-1.16.308

バイナリをインストールおよび解凍して /usr/local/bin に置くだけです。

$ curl --silent --location "https://github.com/weaveworks/eksctl/releases/download/latest_release/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
$ sudo mv /tmp/eksctl /usr/local/bin
$ eksctl version
[?] version.Info{BuiltAt:"", GitCommit:"", GitTag:"0.11.1"}

eksctl を利用してワーカーノードなしのEKSクラスタを作成します。 eksctl create でクラスタを構築するVPCやポッドを動作させる各サブネットが自動で生成されます。 --fargate を指定することでFargateがプロファイルが同時に作成されます。『creating Fargate profile “fp-default” on EKS cluster “demo-newsblog”』というメッセージで分かるとおり fp-default というFargateプロファイルが作成されました。

$ eksctl create cluster --name demo-newsblog --region ap-northeast-1 --fargate
eksctl create cluster example

Fargateプロファイルは、Fargateで実行したいKubernetesポッドの指定やポッドを実行するサブネットを指定することができます。またKubernetesエージェントがポッドにコンテナーイメージをダウンロードし、各アクションを実行するために使用するIAM実行ロールを設定します。

したがってポッドを実行できるIAM実行ロールをアタッチしたFargateプロファイルが必要です。

Fargateプロファイル作成

ECRからコンテナイメージをプルする際に必要な権限をポッドへIAM実行ロールとして与えることで、ロールがKubernetesへ付与され、Fargate上で実行されている kubelet がEKSクラスタへ登録されるようになっています。この操作によってFargateインフラがポッドとしてEKSで使用できます。

AmazonEKSFargatePodExecutionRole という名前のIAM実行ロールを作成してください。手順はここの通りで作成できました。[4]

https://docs.aws.amazon.com/eks/latest/userguide/pod-execution-role.html

AWSコンソールでEKS > クラスター > demo-newsblogと選択し『Fargateプロファイルを追加』をクリックしてプロファイル設定の画面へ進みます。

Create new Fargate profile

以下の設定を行います。

  • 名前
  • ポッド実行ロール
  • サブネット(Fargateではプライベートのみサポート)
Fargate profile configuration

Nextで進むと名前空間の設定が出るので default を入力します。 default のKubernetesの名前空間で作成されたポッドはすべてFargate上で実行されます。つまりKubernetesアプリ側を変更するのではなく、KubernetesアプリのポッドとFargateプロファイルで設定される名前空間を一致させることで対象のポッドがFargate上で実行されるようになります。ラベルを使用することで名前空間およびラベルが一致する場合にFargateを利用するという設定にすることもできます。それ以外の場合はワーカーノード上で実行されます。

Namespace for Pod selectors

このブログではKubernetesの一部であるCoreDNSのポッドもFargate上へ乗せます。別に新しくFargateプロファイルを作成しますが、名前空間を kube-system とします。 fp-defaultkube-system という名前空間は保持していますが、ポッドを実行できるIAM実行ロールを設定していません。以下はCoreDNS用のFargateプロファイル設定例です。

Fargate profile for CoreDNS

nginxコンテナの展開

コンテナをクラスタにデプロイする準備ができました。kubectlでコンテナをデプロイします。kubectlをインストールしていない場合はこちら。[5]

$ kubectl version
Client Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.0", GitCommit:"70132b0f130acc0bed193d9ba59dd186f0e634cf", GitTreeState:"clean", BuildDate:"2019-12-07T21:20:10Z", GoVersion:"go1.13.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"14+", GitVersion:"v1.14.9-eks-ba3d77", GitCommit:"ba3d77818a38ddd3bbe1cb5fce0a68644770244f", GitTreeState:"clean", BuildDate:"2019-12-12T19:13:29Z", GoVersion:"go1.12.12", Compiler:"gc", Platform:"linux/amd64"}

nginxのインスタンス1つをデプロイします。

$ kubectl create deployment demo-app --image=nginx
deployment.apps/demo-app created

ポッドやノードが動作していることを確認できました。nodesは1つがnginxのノード、2つがCoreDNSのノードです。簡単なサンプルですがデプロイができました。

$ kubectl get pods
NAME READY STATUS RESTARTS AGE
demo-app-6dbfc49497-mwm8c 1/1 Running 0 88s
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
fargate-ip-192-168-102-110.ap-northeast-1.compute.internal Ready <none> 25h v1.14.8-eks
fargate-ip-192-168-129-98.ap-northeast-1.compute.internal Ready <none> 25h v1.14.8-eks
fargate-ip-192-168-96-29.ap-northeast-1.compute.internal Ready <none> 88s v1.14.8-eks

実行されているサービスの確認をします。 defaultkube-system の名前空間が確認できます。

$ kubectl get svc --all-namespaces
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 25h
kube-system kube-dns ClusterIP 10.100.0.10 <none> 53/UDP,53/TCP 25h

EKSクラスタの削除を行って環境のクリーンアップを行いました。

$ eksctl delete cluster --name demo-newsblog
eksctl delete cluster example

制約次項

  • ポッド当たり4 vCPU/30Gのメモリが割り当て可能なリソースである
  • ステートフルワークロードに対応していない、パーシステントボリューム、ファイルシステムは現在サポートされない
  • Daemonsets、Privileged Podsは実行できない
  • HostNetwork/HostPortは対応していない
  • ALBのみに対応する

以上です。

まとめ

  • コンテナ向けサーバレスコンピューティングのサービスであるFargateがEKS(Elastic Kubernetes Service)でも使用できるようになった
  • ワーカーノードにEC2を利用する際に考慮する必要のあったインスタンスの管理、パッチやスケーリングの手当、インスタンスのセキュリティ対応などが不要となる
  • FargateのクラスタではFargeteプロファイルの設定が必要で、プライベートのサブネットのみが指定可能となっている

--

--

Yuya Sugano

Cloud Architect and Blockchain Enthusiast, techflare.blog, Vinyl DJ, Backpacker. ブロックチェーン・クラウド(AWS/Azure)関連の記事をパブリッシュ。バックパッカーとしてユーラシア大陸を陸路横断するなど旅が趣味。