Amazon EKS on AWS Fargate試してみた
AWS ECS(Elastic Container Service)で使用できるFargateがEKS(Elastic Kubernetes Service)でも選択できるようになりました。[1]
いままで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
$ 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
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プロファイルを追加』をクリックしてプロファイル設定の画面へ進みます。
以下の設定を行います。
- 名前
- ポッド実行ロール
- サブネット(Fargateではプライベートのみサポート)
Nextで進むと名前空間の設定が出るので default
を入力します。 default
のKubernetesの名前空間で作成されたポッドはすべてFargate上で実行されます。つまりKubernetesアプリ側を変更するのではなく、KubernetesアプリのポッドとFargateプロファイルで設定される名前空間を一致させることで対象のポッドがFargate上で実行されるようになります。ラベルを使用することで名前空間およびラベルが一致する場合にFargateを利用するという設定にすることもできます。それ以外の場合はワーカーノード上で実行されます。
このブログではKubernetesの一部であるCoreDNSのポッドもFargate上へ乗せます。別に新しくFargateプロファイルを作成しますが、名前空間を kube-system
とします。 fp-default
も kube-system
という名前空間は保持していますが、ポッドを実行できるIAM実行ロールを設定していません。以下はCoreDNS用のFargateプロファイル設定例です。
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
実行されているサービスの確認をします。 default
と kube-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
制約次項
- ポッド当たり4 vCPU/30Gのメモリが割り当て可能なリソースである
- ステートフルワークロードに対応していない、パーシステントボリューム、ファイルシステムは現在サポートされない
- Daemonsets、Privileged Podsは実行できない
- HostNetwork/HostPortは対応していない
- ALBのみに対応する
以上です。
まとめ
- コンテナ向けサーバレスコンピューティングのサービスであるFargateがEKS(Elastic Kubernetes Service)でも使用できるようになった
- ワーカーノードにEC2を利用する際に考慮する必要のあったインスタンスの管理、パッチやスケーリングの手当、インスタンスのセキュリティ対応などが不要となる
- FargateのクラスタではFargeteプロファイルの設定が必要で、プライベートのサブネットのみが指定可能となっている