Terraformでサッと使える検証用EKS環境を作った

2021/09/11に公開

なにこれ

個人でKubernetesおよびEKSを学習するにあたって、
簡単に検証用のクラスタを作り消しできるようにTerraformを書きましたので共有します🍥

terraform apply すると、10〜15minほどかかったのちEKS環境がうまれます👶
空の状態で起動しっぱなしの時のコストは 約15~20円/h 程度の想定(EKSクラスター0.1USD + EC2インスタンス0.04USD)ですが、
このZennを書いてる時点で 全然わからない俺たちは雰囲気で 状態で環境を作ってるので、もし間違ってたらすみません

k8sのバージョンは 1.21 で、ノードとして t3.small インスタンスが2つ作成されます
その他作成されるAWSリソースには、 study-k8s というPrefixが付くように設定しています

また、追加で以下を設定しています

ローカルに必要なものは以下です

  • direnv
  • awscli
  • terraform
    • 1.0.5
  • kubectl

導入手順

一式はこちらのリポジトリに格納しています

https://github.com/yktakaha4/study-k8s-terraform

apply手順は以下です

# AdministratorAccessを持つユーザのID/シークレットを用意しておいてください
$ cp -p .envrc.sample .envrc
$ direnv allow

# デフォルトでは 172.17.0.0/16 のVPCを作ってその中で色々やるので、
# 既存で作っているものと重複している場合は以下ファイルを作成して上書きしてください
$ cp -p terraform.tfvars.sample terraform.tfvars

# S3バックエンドを利用する場合、以下ファイル内のコメントアウトを解除してください
$ ls -l terraform.tf

# AWS環境にapply
$ terraform init
$ terraform apply

略

Apply complete! Resources: 48 added, 0 changed, 0 destroyed.

Outputs:

cluster_name = "study-k8s-XXXXXXXX"

# 接続設定を更新 / 確認
$ aws eks update-kubeconfig --name study-k8s-XXXXXXXX
$ kubectl config current-context
arn:aws:eks:ap-northeast-1:1234567890:cluster/study-k8s-XXXXXXXX

# Server VersionのGitVersionに `eks` が入っていればEKSに接続できてますたぶん
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.1", GitCommit:"632ed300f2c34f6d6d15ca4cef3d3c7073412212", GitTreeState:"clean", BuildDate:"2021-08-19T15:45:37Z", GoVersion:"go1.16.7", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"21+", GitVersion:"v1.21.2-eks-0389ca3", GitCommit:"8a4e27b9d88142bbdd21b997b532eb6d493df6d2", GitTreeState:"clean", BuildDate:"2021-07-31T01:34:46Z", GoVersion:"go1.16.5", Compiler:"gc", Platform:"linux/amd64"}

$ kubectl get nodes
NAME                                              STATUS   ROLES    AGE     VERSION
ip-172-16-2-184.ap-northeast-1.compute.internal   Ready    <none>   4m32s   v1.21.2-eks-55daa9d
ip-172-16-3-4.ap-northeast-1.compute.internal     Ready    <none>   4m41s   v1.21.2-eks-55daa9d

$ kubectl get pods --all-namespaces
NAMESPACE     NAME                                            READY   STATUS    RESTARTS   AGE
kube-system   aws-load-balancer-controller-5fb99754b5-tjdmk   1/1     Running   0          5m54s
kube-system   aws-node-5t57d                                  1/1     Running   0          4m8s
kube-system   aws-node-w7k8d                                  1/1     Running   0          4m17s
kube-system   coredns-76f4967988-bm6ld                        1/1     Running   0          7m48s
kube-system   coredns-76f4967988-sq5p7                        1/1     Running   0          7m48s
kube-system   kube-proxy-7s87r                                1/1     Running   0          4m8s
kube-system   kube-proxy-z8ps8                                1/1     Running   0          4m17s
kube-system   metrics-server-569b4c5df9-4knbj                 1/1     Running   0          5m57s

実際に手を動かしてみると色々分かった気になれてたのしいぞ🍠
(本当にわかったかは別)

# 飽きたら削除しましょう
$ terraform destroy

参考文献

作成にあたり、ためになったものをはっておきます

https://github.com/terraform-aws-modules/terraform-aws-eks/tree/master/examples/managed_node_groups

https://zenn.dev/yukin01/articles/6dd6542993ab166d51c2

Discussion