EKSを試してみようと思い、eksctlを使用してクラスターを作成までやってみたところ結構ハマったので、まとめておきます。
eksctlとは?
eksctlは、EKSのクラスターを作成するツールです。
裏でCloudFormationを使っていて、EC2でノードを作成し、VPCの作成とかもやってくれます。
なのでクラスターを作成して、接続できる状態までいい感じにやってくれます。
下記のAWSで用意されているEKSのワークショップでやった内容を参考にしています。
前準備
eksctlのインストール
まずはeksctlのダウンロードからです。
下記のcurlコマンドでダウンロード、展開します。
$ curl --silent --location "https://github.com/weaveworks/eksctl/releases/download/latest_release/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmp
展開したeksctlを任意の場所へ移動します。
$ sudo mv -v /tmp/eksctl /usr/local/bin
コマンドとして実行するため、PATHの通っているディレクトリに配置する方が良いでしょう。
そして、下記のコマンドで動作確認します。
$ eksctl version [ℹ] version.Info{BuiltAt:"", GitCommit:"", GitTag:"0.1.28"}
バージョン情報が表示されたら、インストール成功です。
アクセスキーを設定する
eksctlを使ってAWS上にクラスターを作成するには、IAMユーザーのアクセスキー情報の設定が必要です。
~/.aws/credentials
というファイルを作成し、下記の内容を記述してください。
(.aws
ディレクトリがない場合はこちらも作成する)
[default] aws_access_key_id=xxxxxxxxxx aws_secret_access_key=xxxxxxxxxxxxxxxxxxxx
xxxxxxとなっている部分は、ご自身のIAMユーザーのアクセスキーIDとシークレットアクセスキーを、それぞれ設定してください。
heptio-authenticator-awsのインストール
heptio-authenticator-awsは、IAMの権限を使用してkubernetesへの認証を通すために使用するツールです。
(これのインストール方法がよく分からず結構手こずった)
ソースをダウンロードします。
$ curl -o heptio-authenticator-aws https://amazon-eks.s3-us-west-2.amazonaws.com/1.10.3/2018-06-05/bin/darwin/amd64/heptio-authenticator-aw
ダウンロードしたソースに実行権限を付与します。
$ chmod +x ./heptio-authenticator-aws
任意の場所に移動してPATHを通します。
$ mv ./heptio-authenticator-aws $HOME/bin/heptio-authenticator-aws && export PATH=$HOME/bin:$PATH
下記のコマンドを実行し、ヘルプが表示されればインストール完了です。
$ heptio-authenticator-aws help
AWS CLIのインストール
下記のページを参考に、AWS CLIをインストールしてください。
EKSクラスターの作成
eksctlでクラスターの作成
前準備が整ったところで、クラスターを作成してみます。
下記のeksctlコマンドを実行してください。
eksctl create cluster --name=eksworkshop-eksctl --node-type=t2.nano --nodes=3 --node-ami=auto --region=us-west-2
ここからクラスターが作成され始めます(15分くらいかかります)。
eksctlは裏側ではAWS CloudFormationを使用しているため、作成が始まったタイミングでCloudFormationのマネジメントコンソールを開くと、実行中の進捗が見れます。
オプションについてですが、まず --name
でクラスターの名前を指定しています。
--node-type
では、作成するノードで使うEC2のインスタンスタイプを指定します。
ここでは一番安いt2.nanoにしています。
このオプションをしていしないと、デフォルトでm5.largeで作成されてしまうので、注意してください。
--nodes
では作成するノードの数を指定します。
--region
では、クラスターを作成するリージョンを指定します。
ここでは東京リージョンより安い、us-west-2(オレゴン)にしています。
作成したノードの確認
クラスターの作成が終わると、ここから先は通常の kubectl
コマンドでクラスター上のリソースを操作できるようになります。
下記のコマンドで作成されたノードの情報を確認します。
$ kubectl get nodes NAME STATUS ROLES AGE VERSION ip-xxx-xxx-x-111.us-west-2.compute.internal Ready <none> 5m v1.11.9 ip-xxx-xxx-xx-226.us-west-2.compute.internal Ready <none> 5m v1.11.9 ip-xxx-xxx-xx-105.us-west-2.compute.internal Ready <none> 5m v1.11.9
指定した通り3つのノード作られています(NAME内のIPは一部伏せています)。
また、EC2のマネジメントコンソールからも、3台のEC2インスタンスが作成されていることが確認できると思います。
試しにDeploymentの作成
あとは通常のkubectlコマンドで操作ができるようになります。
試しにDeploymentを作成してみましょう。
下記のyamlを任意の名前(ここではsample-deployment.yamlとします)で保存し、Deploymentを作成します。
apiVersion: apps/v1 kind: Deployment metadata: name: sample-deployment spec: replicas: 3 selector: matchLabels: app: sample-app template: metadata: labels: app: sample-app spec: containers: - name: nginx image: nginx:1.13.5-alpine
$ kubectl apply -f sample-deployment.yaml
そして、下記のコマンドでPodの一覧を表示してみてください。
$ kubectl get pods -o wide
-o wide
のオプションを付けることで、Podが作成されているノードの情報も表示されるので、先ほど作成したクラスターのノードにPodが作成されていることが分かると思います。
接続情報を管理するkubeconfig
クラスターの作成後、kubectlでEKSクラスター上のリソースへアクセスできるようになりましたが、その設定について簡単に書きます。
kubectlは、接続先のクラスターや接続に使うユーザーなどの情報を、kubeconfigという設定ファイルから読み込んで実行しています。
デフォルトでは ~/.kube/config
というファイルがそれになります。
下記のコマンドを実行してみてください。
$ kubectl config view
kubeconfigの内容を元に、接続設定が表示されます。
clusters
が接続可能なクラスターのリスト、 users
が接続可能なユーザーのリスト、 contexts
がになります。
この中に、先ほど作成したeksworkshop-eksctlの情報も追加されていると思います。
context
は、cluster
と user
の組み合わせと、 namespace
を指定したもので、 kubectl
で操作する環境や権限を切り替えられるようになっています。
current-context
が現在使用しているcontextで、こちらもeksworkshop-eksctlにご自分のユーザーで接続するcontextが設定された状態になっていると思います。
下記のコマンドでも、current-contextの情報を確認できます。
$ kubectl config current-context
この設定をeksctlが書き換えてくれていることにより、作成されたクラスターに対してそのままkubectlで操作できるようになっています。
まとめ
まとめると、eksctlでは
- EC2をノードとしてEKSクラスターを作成
- VPCの作成もいい感じにやってくれる
- kubeconfigへ作成したクラスター、ユーザー、Contextの情報の追加、current-contextに作成したContextを設定
までやってくれて、その後は通常通りkubectlで操作できるようになるという感じです。
Kubernetesはローカルで試すのは簡単にできましたが、AWS上でクラスターを組んで使えるようにするまでは手間がかかるので、これをコマンド一発でやってくれるのは楽ですね。