Help us understand the problem. What is going on with this article?

【AWS】 EKS on Fargate のクラスタを構築してみる

はじめに

UL Systems Advent Calendar 2019 の9日目です。

先日のAWS re:invent で Fargate for EKS が発表されました(AWSブログの記事)。
そしてなんと東京リージョンで利用できます。
もうEC2を管理しなくていいんです!!

これまでは EC2 の管理を避けるため(泣く泣く) ECS + Fargate を使っていた方もいらっしゃったのではないでしょうか。
この記事はそのような方を含めて、はじめて EKS をさわる方のためのチュートリアルです。
Fargate の EKS クラスタを構築するという基本的な操作を通して、実際の動きを確認してみます。

それでは、はじめてみましょう。

準備

作業用の EC2 インスタンスを構築

本記事では作業用の EC2 インスタンスから EKS を操作します(以降「作業端末」と呼びます)。既にお持ちの場合は不要です。(【10分間チュートリアル】Linux 仮想マシンの起動 を参考にご準備ください)

EKS 用のツールをインストール

  • 作業端末に kubectl をインストールします(2019.12.08 時点では「Client Version: v1.14.7-eks-1861c5」でした)。
$ sudo curl --silent --location -o /usr/local/bin/kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.14.6/2019-08-22/bin/linux/amd64/kubectl
$ sudo chmod +x /usr/local/bin/kubectl
$ kubectl version --short --client
  • jq, envsubst (from GNU gettext utilities), bash-completion, git をインストールします。
$ sudo yum -y install jq gettext bash-completion git
  • kubectl bash_completionを有効にします。
$ kubectl completion bash >>  ~/.bash_completion
$ . /etc/profile.d/bash_completion.sh
$ . ~/.bash_completion

作業端末用の IAM ロールを作成

  1. このリンクをクリックし、管理者権限の IAM ロールを作成します。
  2. 「信頼されたエンティティの種類を選択」で「AWSサービス」が選択されていること、「このロールを使用するサービスを選択」で「EC2」が選択されていることを確認して「次のステップ:アクセス権限」ボタンをクリックします。
  3. 「Attach アクセス権限ポリシー」で「AdministratorAccess」が選択されていることを確認して「次のステップ:タグ」ボタンをクリックします。
  4. デフォルト(タグを追加しない)のまま「次のステップ:確認」ボタンをクリックします。
  5. 「ロール名」に「eks-admin」と入力して「ロールの作成」ボタンをクリックします。

iamrole_for_ec2.png

作業端末に IAM ロールをアタッチ

  1. マネジメントコンソールでEC2サービスを開き、作業端末を選択します。
  2. 「アクション」→「インスタンスの設定」→「IAM ロールの割り当て/置換」をクリックします。
  3. 「IAM ロール」のドロップダウンで「eks-admin」を選択し「適用」ボタンをクリックします。

attach_iamrole_to_ec2.png

AWS CLI の更新と設定

  • 作業端末に ssh で接続します。
  • AWS CLI を更新します(EC2 インスタンス構築直後のバージョンでは古いため、kubectl が失敗します)。
$ sudo yum install python3 -y
$ sudo pip3 install awscli --upgrade

(インストール先は、/usr/local/bin になります)

  • バージョンを確認します。古い AWS CLI (/usr/bin/aws)のままの場合、ログインしなおしてください。
$ aws --version
aws-cli/1.16.298 Python/3.7.4 Linux/4.14.152-127.182.amzn2.x86_64 botocore/1.13.34
  • aws configure します。
$ aws configure
AWS Access Key ID [None]: (未入力でEnter)
AWS Secret Access Key [None]: (未入力でEnter)
Default region name [None]: ap-northeast-1
Default output format [None]: json
  • ここまでの作業が正しく行われていることを確認します。コマンド実行結果にロール名とインスタンスIDが含まれていることを確認します。
$ aws sts get-caller-identity --output text --query Arn
arn:aws:sts::123456789012:assumed-role/eks-admin/i-0af444c1234567890
  • 環境変数を設定します。
$ export ACCOUNT_ID=$(aws sts get-caller-identity --output text --query Account)
$ export AWS_REGION=ap-northeast-1
$ echo "export ACCOUNT_ID=${ACCOUNT_ID}" | tee -a ~/.bash_profile
$ echo "export AWS_REGION=${AWS_REGION}" | tee -a ~/.bash_profile

eksctl をインストール

eksctlは、EKS専用のコマンドラインツールです。
VPCやセキュリティグループの作成も行われるため、クラスターの作成作業を簡単に行うことができます。

  • ダウンロードして /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 -v /tmp/eksctl /usr/local/bin
  • バージョンを確認します(2019.12.08 時点では「0.11.1」でした)。
$ eksctl version
[?]  version.Info{BuiltAt:"", GitCommit:"", GitTag:"0.11.1"}
  • eksctl bash-completion を有効にする
$ eksctl completion bash >> ~/.bash_completion
$ . /etc/profile.d/bash_completion.sh
$ . ~/.bash_completion

EKS クラスター作成

Fargate の EKS クラスター作成

  • eksctl コマンドの引数に「--fargate」を指定して EKS クラスターを作成します。15分~20分程度かかります。
$ eksctl create cluster --name ekstest-cluster --fargate
[?]  eksctl version 0.11.1
[?]  using region ap-northeast-1
[?]  setting availability zones to [ap-northeast-1d ap-northeast-1c ap-northeast-1a]
[?]  subnets for ap-northeast-1d - public:192.168.0.0/19 private:192.168.96.0/19
[?]  subnets for ap-northeast-1c - public:192.168.32.0/19 private:192.168.128.0/19
[?]  subnets for ap-northeast-1a - public:192.168.64.0/19 private:192.168.160.0/19
[?]  using Kubernetes version 1.14
[?]  creating EKS cluster "ekstest-cluster" in "ap-northeast-1" region with Fargate profile
[?]  if you encounter any issues, check CloudFormation console or try 'eksctl utils describe-stacks --region=ap-northeast-1 --cluster=ekstest-cluster'
[?]  CloudWatch logging will not be enabled for cluster "ekstest-cluster" in "ap-northeast-1"
[?]  you can enable it with 'eksctl utils update-cluster-logging --region=ap-northeast-1 --cluster=ekstest-cluster'
[?]  Kubernetes API endpoint access will use default of {publicAccess=true, privateAccess=false} for cluster "ekstest-cluster" in "ap-northeast-1"
[?]  1 task: { create cluster control plane "ekstest-cluster" }
[?]  building cluster stack "eksctl-ekstest-cluster-cluster"
[?]  deploying stack "eksctl-ekstest-cluster-cluster"
[?]  all EKS cluster resources for "ekstest-cluster" have been created
[?]  saved kubeconfig as "/home/ec2-user/.kube/config"
[?]  creating Fargate profile "fp-default" on EKS cluster "ekstest-cluster"
[?]  created Fargate profile "fp-default" on EKS cluster "ekstest-cluster"
[?]  "coredns" is now schedulable onto Fargate
[?]  "coredns" is now scheduled onto Fargate
[?]  "coredns" pods are now scheduled onto Fargate
[?]  kubectl command should work with "/home/ec2-user/.kube/config", try 'kubectl get nodes'
[?]  EKS cluster "ekstest-cluster" in "ap-northeast-1" region is ready
  • Fargate プロファイルを確認します。Pod 実行 IAM ロール、ネームスペース、サブネットが自動で作成されています。
$ eksctl get fargateprofile --cluster ekstest-cluster -o yaml
- name: fp-default
  podExecutionRoleARN: arn:aws:iam::123456789012:role/eksctl-ekstest-cluster-clu-FargatePodExecutionRole-YLXXXXXXXXXX
  selectors:
  - namespace: default
  - namespace: kube-system
  subnets:
  - subnet-0aa6a123456789012
  - subnet-0731d123456789012
  - subnet-080a4123456789012
  • ノードを確認します。おおお、2 つ起動しています。Hello Fargate!
$ kubectl get nodes
NAME                                                         STATUS   ROLES    AGE     VERSION
fargate-ip-192-168-130-96.ap-northeast-1.compute.internal    Ready    <none>   2m51s   v1.14.8-eks
fargate-ip-192-168-154-188.ap-northeast-1.compute.internal   Ready    <none>   4m21s   v1.14.8-eks

eksctl の詳細は公式ページをご覧ください。

Pod 起動

  • nginx を起動するだけの Deployment を作成します。
$ kubectl create deployment demo-app --image=nginx
deployment.apps/demo-app created
  • Pod の状態を確認します(READY になるまで 1 分程度かかりました)。
$ kubectl get pods
NAME                               READY   STATUS    RESTARTS   AGE
demo-app-6dbfc49497-b8b79          1/1     Running   0          2m19s
  • node の状態を確認します。ひとつ増えていますね。Hello Fargate!!
$ kubectl get nodes
NAME                                                         STATUS   ROLES    AGE   VERSION
fargate-ip-192-168-130-96.ap-northeast-1.compute.internal    Ready    <none>   65m   v1.14.8-eks
fargate-ip-192-168-154-188.ap-northeast-1.compute.internal   Ready    <none>   66m   v1.14.8-eks
fargate-ip-192-168-167-220.ap-northeast-1.compute.internal   Ready    <none>   11m   v1.14.8-eks

削除

Pod 終了

  • デプロイメントを削除します。
$ kubectl delete deployment demo-app
deployment.extensions "demo-app" deleted
$ kubectl get pods
No resources found in default namespace.
  • node の状態を確認します。
$ kubectl get nodes
NAME                                                         STATUS   ROLES    AGE   VERSION
fargate-ip-192-168-130-96.ap-northeast-1.compute.internal    Ready    <none>   74m   v1.14.8-eks
fargate-ip-192-168-154-188.ap-northeast-1.compute.internal   Ready    <none>   75m   v1.14.8-eks

クラスター削除

  • eksctl コマンドでクラスターを削除します。
$ eksctl delete  cluster --name ekstest-cluster
[?]  eksctl version 0.11.1
[?]  using region ap-northeast-1
[?]  deleting EKS cluster "ekstest-cluster"
[?]  deleting Fargate profile "fp-default"
[?]  deleted Fargate profile "fp-default"
[?]  deleted 1 Fargate profile(s)
[?]  kubeconfig has been updated
[?]  cleaning up LoadBalancer services
[?]  1 task: { delete cluster control plane "ekstest-cluster" [async] }
[?]  will delete stack "eksctl-ekstest-cluster-cluster"
[?]  all cluster resources were deleted

おわりに

非常に簡単な操作だけでしたが、Fargate のクラスタ上で EKS が動作することを確認しました。
コンテナ系の技術は必要な知識エリアが広く、書籍や記事を読んだだけではわかりにくい技術のため、実際に手を動かして「やってみる」ことが大切だと感じています。

本記事が、皆さまのコンテナ技術の理解のお役に立てたら幸いです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした