EKS クラスターを構築してみた

記事タイトルとURLをコピーする

記事目安...20分

はじめに

EKS クラスターの構築をしたので備忘録です。

EKS クラスターの構成図

今回は、以下のEKS クラスターを作成します。

f:id:swx-sugaya:20210830183143p:plain

前提条件

ネットワーク

  • 2つ以上の異なる AZ のパブリックサブネットが AWS アカウントに存在する

実行ホスト

  • AmazonLinux2 on EC2
  • EKS クラスター/ノードを作成する適切な権限を与えられている(※)

※ 僕は、検証なので PowerUserAccess ポリシーをアタッチした IAM ロールを実行ホストに付けました。

構築コマンド全体像

最初に eks クラスターを構築するのに必要な全コマンドを羅列します。
時間がない人はこれを上から実行してください。

※前提条件を満たした上で実行してください。

## eksctl のインストール
$ curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
$ sudo mv /tmp/eksctl /usr/local/bin
$ eksctl version //確認用

## kubectl のインストール
$ curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.19.6/2021-01-05/bin/linux/amd64/kubectl
$ chmod +x ./kubectl
$ sudo mv ./kubectl /usr/local/bin
$ kubectl version --short --client //確認用

## eks クラスターの作成
$ PUBLIC_SUBNET=<パブリックサブネットID> //e.g. subnet-xxxx,subnet-yyyy
$ EKS_VERSION=<EKS のバージョン> //e.g. 1.20
$ eksctl create cluster \
--name eks-test-cluster \
--region ap-northeast-1 \
--vpc-public-subnets ${PUBLIC_SUBNET} \
--version ${EKS_VERSION} \
--nodegroup-name eks-test-nodegroup \
--node-type t3.small \
--nodes 2
$ kubectl get all

## eks クラスターの削除
eksctl delete cluster --name eks-test-cluster --region ap-northeast-1

手順と解説

eksctl のインストール

事前準備の1つ目として、Amazon EKS で Kubernetes(以下 K8s) クラスターを簡単に作成・管理するためのツール eksctl コマンドをインストールしましょう。


github から eksctl バイナリの最新バージョンをインストールして、/usr/local/bin に配置します。

$ curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
$ sudo mv /tmp/eksctl /usr/local/bin

eksctl の動作確認するために eksctl のバージョンを確認します。

$ eksctl version //確認用

kubectl のインストール

事前準備の2つめとして、K8s オブジェクトの操作を行うための kubectl コマンドをインストールします。

今回は EKS クラスターの接続確認で使うだけですが、 EKS クラスター内の K8s オブジェクトを操作する上で必須なので、必ず入れてください。
これがないと EKS クラスターなんて文鎮と同じです。


kubectl バイナリを Amazon S3 からダウンロードします。(※)
その後 kubectl バイナリに実行権限をつけて、/usr/local/bin に移動します。

※ 以下URL を参考に、EKS クラスターのバージョンにあった kubectl コマンドをインストールして下さい

https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/install-kubectl.html

$ curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.19.6/2021-01-05/bin/linux/amd64/kubectl
$ chmod +x ./kubectl
$ sudo mv ./kubectl /usr/local/bin

最後に kubectl の動作確認をするために、バージョンを確認します。

$ kubectl version --short --client //確認用

eks クラスターの作成

いよいよEKS クラスターを作成します。


まずは、以下参考に環境変数を設定してください。

Key Detail
PUBLIC_SUBNET EKS クラスターノード構築先のパブリックサブネットを指定します
EKS_VERSION EKS クラスターのバージョンを指定します
$ PUBLIC_SUBNET=<パブリックサブネットID> //e.g. subnet-xxxx,subnet-yyyy
$ EKS_VERSION=<EKS のバージョン> //e.g. 1.20

以下コマンドを実行して EKS クラスターを作成しましょう。
今回は、ワーカーノードを2つ作成します。

$ eksctl create cluster \
--name eks-test-cluster \
--region ap-northeast-1 \
--vpc-public-subnets ${PUBLIC_SUBNET} \
--version ${EKS_VERSION} \
--nodegroup-name eks-test-nodegroup \
--node-type t3.small \
--nodes 2

なお、作成時 Cloudformation スタックが裏で動きます。 ※ 作成には、最大20分ほどかかります


最後に EKS クラスターが正しく作成されたか、kubectl コマンドを実行して確認します。

上記のコマンドを実行すると、対象のクラスター上にある全 K8sオブジェクトリソースを確認することができます。

$ kubectl get all

試したところ、作成された時点では Service オブジェクトのみ作成されていました。

$ kubectl get all
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.100.0.1   <none>        443/TCP   22m

ちなみに作成したワーカーノードは、以下コマンドで確認できます。

$ kubectl get node

EKS クラスターの削除

不要になったクラスターはすぐに削除しましょう。

EKS クラスター料金は 0.1 USD/h と高額なためです。 ノードリソースに対しても稼働時間に応じて課金がされます。

作成した個々の Amazon EKS クラスターについて、毎時課金 0.10USD されます。 引用元: https://aws.amazon.com/jp/eks/pricing/

なお、ノードリソースは停止することができますが、EKS クラスターは停止できません。
EKS クラスターをどうしても残したい場合、使っていないノードリソースは停止をお勧めします。


消すのも eksctl コマンドサクッと消せます。

$ eksctl delete cluster --name eks-test-cluster --region ap-northeast-1

以下のログが出れば削除完了です。

2021-07-22 15:06:41 [✔]  all cluster resources were deleted

これにて、クラスターの削除は完了です。

Tips

kubectl の設定ファイル

eksctl を実行したユーザのホームディレクトリに .kube ディレクトリが作成され、その中に設定ファイル等が格納されます。
kubectl 実行時は、ここに書かれた情報をもとに対象の EKSクラスターに接続します。

例えば eksctl による構築中に以下のログが出力されます。

2021-07-22 14:13:24 [✔]  saved kubeconfig as "/home/ec2-user/.kube/config"

■ .kube ディレクトリの確認

$ ls ~/.kube
cache  config  config.eksctl.lock  http-cache

K8s オブジェクトの参照権限について

EKS クラスター作成後、マネコンでクラスターを確認すると、以下の警告が出されてる場合があります。

現在のユーザーまたはロールには、この EKS クラスター上の Kubernetes オブジェクトへのアクセス権がありません
これは現在のユーザーまたはロールがクラスターリソースを記述するための Kubernetes RBAC アクセス許可を持っていないか、クラスターの認証設定マップにエントリがないことが原因である可能性があります。

書いてあるとおりですが、権限不足により、EKS クラスター内の K8s オブジェクトへアクセスできません。
実際に対象クラスターの「設定」タブは閲覧できますが、「ワークロード」タブは閲覧できません。(正確にいうと本来見えるはずの情報が、なにも確認できません。)

このエラーは、eksctl を実行した IAM エンティティ(IAM ユーザやIAM ロールの総称)でない IAM エンティティで EKS クラスター情報を参照したときに現れます。
というのも EKS クラスター内の K8s オブジェクトへアクセスできるのは、デフォルトではそのクラスターを作成を実行した IAM エンティティのみが許可されます。

詳細は別記事を書こうと思いますが、これはクラスター内の K8s オブジェクトのアクセス権は、AWSとは関係ない別リソースで管理・許可されるためです。IAM では制御できません。

まとめ

ということで、EKS クラスターを構築してみました。
今後もEKS やK8s周りで記事書きたいと思います。

閲覧いただきありがとうございました。

参考

菅谷 歩 (記事一覧)