EKS ハンズオン : クラスター作成


目次はこちら

EKS ハンズオン:目次


TL;DR

最初の第一歩 EKS クラスターを作成します。

クラスターはeksctlを使って作成し

クライアントは環境依存性を極力排除するため、Cloud9を使っています。


クライアント環境の整備


Cloud9を立ち上げる


  • 私はオレゴンリージョンを使っていますが、Cloud9とEKSが提供されているリージョンだとどこでもいいと思います。

  • 最近のアップデートとインスタンスをAmazon LinuxかUbuntuから選択できるようになったようですが、Amazon Linuxを選択しました。

  • インスタンスタイプはT2.microとしています。
    -で既存VPC/Subnetも選択できますし、新規VPCも作れますが、外部からアクセス可能なpublic subnetを選択すればどれでもいいと思います。


補足


  • デフォルトだとCloud9に割り当てられるIAMは、Cloud9を作成したIAMユーザの権限が割り当てられます。

  • 管理者権限を持ったIAMユーザでCloud9を作成すると、Cloud9上でのAWSリソースへも全て管理者権限でアクセスされます


    • つまり、何らかの権限エラーが出た場合は、自身のIAMユーザの権限が足りないはずなので、そこを確認する必要があります。




Cloud9にEKS関連ツールをダウンロードする


kubectl のインストール

クラスター認証の管理 を参考にします。

# 最新のバイナリでない可能性があるので、実行される場合はあその都度URLを確認したほうがいいと思います

curl -o kubectl https://amazon-eks.s3-us-west-2.amazonaws.com/1.11.5/2018-12-06/bin/linux/amd64/kubectl
chmod +x ./kubectl
mkdir $HOME/bin && cp ./kubectl $HOME/bin/kubectl && export PATH=$HOME/bin:$PATH
echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc

#インストールされたことを確認します。タイミングによってはバージョンは異なるかもしれません
kubectl version --short --client
Client Version: v1.11.5


aws-iam-authenticator のインストール

# 同様に上記リンクより、最新のURLを確認したほうがいいと思います

curl -o aws-iam-authenticator https://amazon-eks.s3-us-west-2.amazonaws.com/1.11.5/2018-12-06/bin/linux/amd64/aws-iam-authenticator
chmod +x ./aws-iam-authenticator
cp ./aws-iam-authenticator $HOME/bin/aws-iam-authenticator && export PATH=$HOME/bin:$PATH
echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc

#インストールされたことを確認します。
aws-iam-authenticator help
## こんな感じでhelpが表示されればOKです
A tool to authenticate to Kubernetes using AWS IAM credentials

Usage:
aws-iam-authenticator [command]

Available Commands:
help Help about any command
init Pre-generate certificate, private key, and kubeconfig files for the server.
server Run a webhook validation server suitable that validates tokens using AWS IAM
token Authenticate using AWS IAM and get token for Kubernetes
verify Verify a token for debugging purpose
version Version will output the current build information

Flags:
-i, --cluster-id ID Specify the cluster ID, a unique-per-cluster identifier for your aws-iam-authenticator installation.
-c, --config filename Load configuration from filename
-h, --help help for aws-iam-authenticator
-l, --log-format string Specify log format to use when logging to stderr [text or json] (default "text")

Use "aws-iam-authenticator [command] --help" for more information about a command.


eksctl のインストール

こちらを参考にしました。

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 --help
a CLI for Amazon EKS


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


  • クラスター名は「test-cluster」としています

  • workder node(コンテナが立ち上がるEC2)は2台

  • インスタンスtypeは t2.large としています

eksctl create cluster --name=test-cluster --node-type=t2.large --nodes=2

# こんな感じの出力が表示されます
[ℹ] using region us-west-2
[ℹ] setting availability zones to [us-west-2a us-west-2b us-west-2d]
[ℹ] subnets for us-west-2a - public:192.168.0.0/19 private:192.168.96.0/19
[ℹ] subnets for us-west-2b - public:192.168.32.0/19 private:192.168.128.0/19
[ℹ] subnets for us-west-2d - public:192.168.64.0/19 private:192.168.160.0/19
[ℹ] nodegroup "ng-7bc19846" will use "ami-0923e4b35a30a5f53" [AmazonLinux2/1.12]
[ℹ] creating EKS cluster "test-cluster" in "us-west-2" region
[ℹ] will create 2 separate CloudFormation stacks for cluster itself and the initial nodegroup
[ℹ] if you encounter any issues, check CloudFormation console or try 'eksctl utils describe-stacks --region=us-west-2 --name=test-cluster'
[ℹ] 2 sequential tasks: { create cluster control plane "test-cluster", create nodegroup "ng-7bc19846" }
[ℹ] building cluster stack "eksctl-test-cluster-cluster"
[ℹ] deploying stack "eksctl-test-cluster-cluster"
[ℹ] buildings nodegroup stack "eksctl-test-cluster-nodegroup-ng-7bc19846"
[ℹ] --nodes-min=2 was set automatically for nodegroup ng-7bc19846
[ℹ] --nodes-max=2 was set automatically for nodegroup ng-7bc19846
[ℹ] deploying stack "eksctl-test-cluster-nodegroup-ng-7bc19846"
[✔] all EKS cluster resource for "test-cluster" had been created
[✔] saved kubeconfig as "/home/ec2-user/.kube/config"
[ℹ] adding role "arn:aws:iam::748762807827:role/eksctl-test-cluster-nodegroup-ng-NodeInstanceRole-PBAU38LJJM31" to auth ConfigMap
[ℹ] nodegroup "ng-7bc19846" has 0 node(s)
[ℹ] waiting for at least 2 node(s) to become ready in "ng-7bc19846"
[ℹ] nodegroup "ng-7bc19846" has 2 node(s)
[ℹ] node "ip-192-168-26-104.us-west-2.compute.internal" is ready
[ℹ] node "ip-192-168-56-26.us-west-2.compute.internal" is ready
[ℹ] kubectl command should work with "/home/ec2-user/.kube/config", try 'kubectl get nodes'
[✔] EKS cluster "test-cluster" in "us-west-2" region is ready


補足

実態はCloudFormationなので、マネジメントコンソールから確認すると以下のようにリソースが作成されていることが分かります。

少々時間がかかるので完了するまで待ちましょう。

image.png


クラスターが作成されたことを確認します

[✔] EKS cluster "test-cluster" in "us-west-2" region is ready

というのが表示されたら作成完了です。早速確認しましょう

# worker node を確認するコマンドを実行します

kubectl get nodes
NAME STATUS ROLES AGE VERSION
ip-192-168-26-104.us-west-2.compute.internal Ready <none> 13m v1.12.7
ip-192-168-56-26.us-west-2.compute.internal Ready <none> 12m v1.12.7

#2台作成したので、ちゃんと2台作成されていますね


まとめ

cloud9の立ち上げ ~ EKS クラスター + worker nodeの作成まで行いました。

次回の記事では、実際にコンテナを作成してみます


(オプション) 環境の削除

次の記事を書くまでに環境を立ち上げっぱなしだとお金がかかってしまいますので、それが嫌な方(たぶんみんな?)は環境を削除しましょう。必要な時にまた作成すればいいのです。

# クラスターの削除コマンド

eksctl delete cluster --name=test-cluster

[ℹ] using region us-west-2
[ℹ] deleting EKS cluster "test-cluster"
[✔] kubeconfig has been updated
[ℹ] 2 sequential tasks: { delete nodegroup "ng-7c2bd618", delete cluster control plane "test-cluster" [async] }
[ℹ] will delete stack "eksctl-test-cluster-nodegroup-ng-7c2bd618"
[ℹ] waiting for stack "eksctl-test-cluster-nodegroup-ng-7c2bd618" to get deleted
[ℹ] will delete stack "eksctl-test-cluster-cluster"
[✔] all cluster resources were deleted

cloudformationテンプレートも暫く経つと削除されます。

念の為、cloudformationのマネジメントコンソールでリソースが完全に削除されたのを確認するとより確実です。

あと、cloud9の削除はCloud9のマネジメントコンソールから削除できます。

ただ、ブラウザを閉じて30分後に自動停止するため、無料枠が残っている場合はほとんどお金はかからないので、そのままにしておくのもありかと思います。