doridoridoriand’s diary

主に技術的なことを書いていく予定(たぶん)

AWSにKubernetesクラスタを立てる with eksctl

仕事でKubernetesクラスタを触る機会があったので、家でも触ってみたいと思い、実施したことを忘備録的にまとめます。 AWSのページを確認すると

の2パターンが確認できます。 eksctl とはWeaveworksがメインで開発している、eksを簡単に構築・運用できるようにするためのコマンドラインツールになります。使用感としてはGCPgcloud コマンドに近いとのことです。 ( gcloud コマンド、ちゃんと使ったこと無いので伝聞なのが心苦しいですが。。)

コンソールから実施するタイプの方は、Kuberentes及びAWS CloudFormationなどにある程度慣れている方向けです(結構たいへんです)。
今回は構築・削除を簡単にしたいので、 eksctl を利用する方式を取ります。

※以下構築方法はあくまでプライベートでの検証用途です。会社の環境で同じ設定をすると、おそらく(というか確実に)インフラ or SRE エンジニアからぶっ飛ばされるので気をつけましょう。

やること

(全然セットアップしてない体で説明を開始します。してあるよって方はスキップでおk)

  1. IAMユーザーの作成&アクセスポリシーの追加
  2. AWS CLIのセットアップ
  3. eksctlのセットアップ
  4. 立てちゃう

とりあえずローカル以外でKubernetesを立てるというだけなら、eksctlコマンドを利用すれば驚くほど簡単になっています。

1. IAMユーザーの作成&アクセスポリシーの追加

1.

以下の用にIAMの画面からキーを発行します。 f:id:doridoridoriand:20190703185930p:plain ここでは ユーザー名: eks-power-access アクセスの種類: プラグラムによるアクセス

としました。

2.

次にポリシーをアタッチします。本当はダメな設定ですが、スポットの検証用ということでAdministrator権限をつけています。
(これが万一流出するとほぼ確実に不正利用されるので気をつけましょう) f:id:doridoridoriand:20190703190612p:plain

本来ならば、EKSの構築に必要な権限を調べて、それのみアタッチすべきですが、 ちょっと面倒くさかった 作業簡略化のためAdministratorをつけています

3.

最後入力内容を確認しましょう f:id:doridoridoriand:20190703191141p:plain

4.

キーが発行できたらCSVをダウンロードしておきましょう。画面からでも確認できますが、ダウンロードできるものはしておいたほうが何かと確実です。 f:id:doridoridoriand:20190703205514p:plain

2. AWS CLIのセットアップ

(正直ここまでセットアップ済みだよ!!って方がほとんどだと思いますが)
aws cliのインストールにはpythonが必要になります。お使いのPCがMacでしたらすでに導入されているので問題ないです。
python3系じゃないとだめだろ!!!馬鹿野郎!!!という方はググって頑張ってください。
pyenvもしくはvirtualenvを入れているという方はおそらく説明不要だと思うので、ここの文章はスキップで問題ないです。

他OSの方も、python導入(Windowsに関しては、スタンドアローンインストーラーがあるのでpythonを使わなくても使用可能です)に関してはググって頑張ってください。

以下コマンドで導入することができます

$ pip install awscli

Windowsスタンドアローンインストーラーの方はこちらを参照ください。

3. eksctlのセットアップ

こちらもすぐに終わります。

Linux

$ 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

Mac

$ brew tap weaveworks/tap
$ brew install weaveworks/tap/eksctl

Windows

$ chocolatey install eksctl

ここに書きましたが、最新コマンドはこちらで確認をお願いします。
補完は好き好きで(あると便利です)

4. 立てちゃう

はい。立てちゃいます。

なんにも考えないで実行すると、以下コマンドになります

$ eksctl create cluster

ですが、このコマンドだと m5.large インスタンス2台を us-west-2 (オハイオ) リージョンにて、専用VPCを作成して構築することになります。あとクラスタ名がランダムで決まります。
検証用途にこのサイズのインスタンスは大きすぎるので、ある程度指定してあげましょう。

引数で指定してあげることもできますが、設定値はyamlで管理できるので、是非yamlにしましょう。

以下を指定しました。

以下のようなyamlになるかと思われます。

githubにもいくつかサンプルがあるので、是非参考にしてみてください。

作成するには、以下コマンドを実施します。

$ eksctl create cluster --config-file simple-kubernetes-with-eksctl.yml

10分程度で完成しました

$ eksctl create cluster --config-file simple-kubernetes-with-eksctl.yml
[ℹ]  using region ap-northeast-1
[ℹ]  setting availability zones to [ap-northeast-1d ap-northeast-1a ap-northeast-1c]
[ℹ]  subnets for ap-northeast-1d - public:192.168.0.0/19 private:192.168.96.0/19
[ℹ]  subnets for ap-northeast-1a - public:192.168.32.0/19 private:192.168.128.0/19
[ℹ]  subnets for ap-northeast-1c - public:192.168.64.0/19 private:192.168.160.0/19
[ℹ]  nodegroup "worker00" will use "ami-0dfbca8d183884f02" [AmazonLinux2/1.12]
[ℹ]  creating EKS cluster "kube00-tokyo" in "ap-northeast-1" region
[ℹ]  1 nodegroup (worker00) was included
[ℹ]  will create a CloudFormation stack for cluster itself and 1 nodegroup stack(s)
[ℹ]  if you encounter any issues, check CloudFormation console or try 'eksctl utils describe-stacks --region=ap-northeast-1 --name=kube00-tokyo'
[ℹ]  2 sequential tasks: { create cluster control plane "kube00-tokyo", create nodegroup "worker00" }
[ℹ]  building cluster stack "eksctl-kube00-tokyo-cluster"
[ℹ]  deploying stack "eksctl-kube00-tokyo-cluster"
[ℹ]  building nodegroup stack "eksctl-kube00-tokyo-nodegroup-worker00"
[ℹ]  --nodes-min=2 was set automatically for nodegroup worker00
[ℹ]  --nodes-max=2 was set automatically for nodegroup worker00
[ℹ]  deploying stack "eksctl-kube00-tokyo-nodegroup-worker00"
[✔]  all EKS cluster resource for "kube00-tokyo" had been created
[✔]  saved kubeconfig as "/Users/dorian/.kube/config"
[ℹ]  adding role "arn:aws:iam::xxxxxxxxxxxx:role/eksctl-kube00-tokyo-nodegroup-wor-NodeInstanceRole-13QV27O8G46HU" to auth ConfigMap
[ℹ]  nodegroup "worker00" has 0 node(s)
[ℹ]  waiting for at least 2 node(s) to become ready in "worker00"
[ℹ]  nodegroup "worker00" has 2 node(s)
[ℹ]  node "ip-192-168-19-13.ap-northeast-1.compute.internal" is ready
[ℹ]  node "ip-192-168-36-85.ap-northeast-1.compute.internal" is ready
[ℹ]  kubectl command should work with "/Users/dorian/.kube/config", try 'kubectl get nodes'
[✔]  EKS cluster "kube00-tokyo" in "ap-northeast-1" region is ready

では実際にkubectlコマンドが通るか試してみましょう。

$ kubectl get nodes
NAME                                               STATUS    ROLES     AGE       VERSION
ip-192-168-19-13.ap-northeast-1.compute.internal   Ready     <none>    8m        v1.12.7
ip-192-168-36-85.ap-northeast-1.compute.internal   Ready     <none>    8m        v1.12.7
$ kubectl describe nodes
Name:               ip-192-168-19-13.ap-northeast-1.compute.internal
Roles:              <none>
Labels:             alpha.eksctl.io/cluster-name=kube00-tokyo
                    alpha.eksctl.io/instance-id=i-0d24521d0fc8630ef
                    alpha.eksctl.io/nodegroup-name=worker00
                    beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/instance-type=t3.micro
                    beta.kubernetes.io/os=linux
                    failure-domain.beta.kubernetes.io/region=ap-northeast-1
                    failure-domain.beta.kubernetes.io/zone=ap-northeast-1d
                    kubernetes.io/hostname=ip-192-168-19-13.ap-northeast-1.compute.internal
Annotations:        node.alpha.kubernetes.io/ttl=0
                    volumes.kubernetes.io/controller-managed-attach-detach=true
CreationTimestamp:  Wed, 03 Jul 2019 20:20:37 +0900
Taints:             <none>
Unschedulable:      false
Conditions:
  Type             Status  LastHeartbeatTime                 LastTransitionTime                Reason                       Message
  ----             ------  -----------------                 ------------------                ------                       -------
  OutOfDisk        False   Wed, 03 Jul 2019 20:25:58 +0900   Wed, 03 Jul 2019 20:20:37 +0900   KubeletHasSufficientDisk     kubelet has sufficient disk space available
  MemoryPressure   False   Wed, 03 Jul 2019 20:25:58 +0900   Wed, 03 Jul 2019 20:20:37 +0900   KubeletHasSufficientMemory   kubelet has sufficient memory available
  DiskPressure     False   Wed, 03 Jul 2019 20:25:58 +0900   Wed, 03 Jul 2019 20:20:37 +0900   KubeletHasNoDiskPressure     kubelet has no disk pressure
  PIDPressure      False   Wed, 03 Jul 2019 20:25:58 +0900   Wed, 03 Jul 2019 20:20:37 +0900   KubeletHasSufficientPID      kubelet has sufficient PID available
  Ready            True    Wed, 03 Jul 2019 20:25:58 +0900   Wed, 03 Jul 2019 20:20:47 +0900   KubeletReady                 kubelet is posting ready status
Addresses:
  InternalIP:   192.168.19.13
  ExternalIP:   xxx.xxx.xxx.xxx
  InternalDNS:  ip-192-168-19-13.ap-northeast-1.compute.internal
  ExternalDNS:  ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com
  Hostname:     ip-192-168-19-13.ap-northeast-1.compute.internal
~~~~

問題なさそうですね。 では、一通り必要な検証が終わったとして、お金節約のため、クラスタを削除しましょう。以下コマンドで実施できます。

eksctl delete cluster --name kube00-tokyo
$ eksctl delete cluster --name kube00-tokyo
[ℹ]  using region ap-northeast-1
[ℹ]  deleting EKS cluster "kube00-tokyo"
[✔]  kubeconfig has been updated
[ℹ]  2 sequential tasks: { delete nodegroup "worker00", delete cluster control plane "kube00-tokyo" [async] }
[ℹ]  will delete stack "eksctl-kube00-tokyo-nodegroup-worker00"
[ℹ]  waiting for stack "eksctl-kube00-tokyo-nodegroup-worker00" to get deleted
[ℹ]  will delete stack "eksctl-kube00-tokyo-cluster"
[✔]  all cluster resources were deleted

削除されました。

Kubernetes自体はローカルでも検証することはできますが、クラウドベンダーの機能(AWSで言えばALBIngress, IAMとRBACの連携など)を試すときはサーバー上に構築する必要があります。
eksctlのおかげで、AWSでも簡単に構築できるようになったので、是非試してみてください。