タケハタのブログ

プログラマの生き方、働き方、技術について雑多に書いていくブログです。

eksctlを使ってEKSのクラスターを作成する

EKSを試してみようと思い、eksctlを使用してクラスターを作成までやってみたところ結構ハマったので、まとめておきます。

eksctlとは?

eksctlは、EKSのクラスターを作成するツールです。
裏でCloudFormationを使っていて、EC2でノードを作成し、VPCの作成とかもやってくれます。
なのでクラスターを作成して、接続できる状態までいい感じにやってくれます。

eksctl.io

下記のAWSで用意されているEKSのワークショップでやった内容を参考にしています。

eksworkshop.com

前準備

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をインストールしてください。

docs.aws.amazon.com

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 は、clusteruser の組み合わせと、 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上でクラスターを組んで使えるようにするまでは手間がかかるので、これをコマンド一発でやってくれるのは楽ですね。