AWS EKSに入門してみた

Posted by rhoboro on 2021-02-11

AWS EKSに入門してみたのでメモ。

自分はGCP GKEをライトユーザーという感じで利用していた。 クローラが取得した画像を解析するweb API(Nodeのオートスケールにも対応)を構築して運用していた経験があるが、そのほかはCloud Composerなどを介して触ったり、大規模バッチ処理をJob機能で動かす技術検証を少ししていたくらい。

EKSクラスターの作成

AWS公式のeksctlコマンドを使うと簡単にEKSクラスターを作成できる。 このコマンドはGKEのgcloud container clusters create相当。

$ eksctl create cluster

クラスターの作成が完了したら下記コマンドでクラスター名を取得できる。

$ eksctl get cluster
NAME                REGION      EKSCTL CREATED
wonderful-rainbow-1613008907    ap-northeast-1  True

クラスターさえ作成できてしまえば、その後の操作の多くはK8sを管理するコマンドkubectlが担ってくれるため、GKEかEKSかを意識しないといけないシーンは大きく減る。

とりあえず、 kubectl コマンドがこのクラスターにアクセスしているかを確認するとうまく動いていた。

$ kubectl get nodes
kubectl get nodes
NAME                                                STATUS   ROLES    AGE   VERSION
ip-192-168-45-221.ap-northeast-1.compute.internal   Ready    <none>   65m   v1.18.9-eks-d1db3c
ip-192-168-70-250.ap-northeast-1.compute.internal   Ready    <none>   65m   v1.18.9-eks-d1db3c

もし違うクラスターにアクセスしている場合は kubectl が利用する認証情報を更新する必要がある。 これは次のように aws eks update-kubeconfig で行う。 このコマンドはGKEのgcloud container clusters get-credentials相当。

# 違うクラスターへアクセスしている
$ kubectl get nodes
NAME             STATUS   ROLES    AGE   VERSION
docker-desktop   Ready    master   21d   v1.19.3

$ aws eks update-kubeconfig --name wonderful-rainbow-1613008907
Added new context arn:aws:eks:ap-northeast-1:123456789:cluster/wonderful-rainbow-1613008907 to /Users/rhoboro/.kube/config

# EKSのクラスターにアクセスしている
$ kubectl get nodes
kubectl get nodes
NAME                                                STATUS   ROLES    AGE   VERSION
ip-192-168-45-221.ap-northeast-1.compute.internal   Ready    <none>   65m   v1.18.9-eks-d1db3c
ip-192-168-70-250.ap-northeast-1.compute.internal   Ready    <none>   65m   v1.18.9-eks-d1db3c

これで無事 kubectl コマンドが利用できるようになった。 これ以降はK8sを使ったことがあれば迷うことは少ないはず。

webコンソール上での表示

GKEのときはwebコンソール画面からポチポチしてGKEクラスターを作ることも多かったため、EKSでもwebコンソールを確認してみたがなんとNode一覧が表示されなかった。

unavailable

調べてみると、EKSクラスターの初期状態ではクラスターを作成したユーザーのみがそのクラスターにアクセスできるようになっているらしい。

自分はawsコマンド用にCLI専用のユーザーを用意している。 そのため、webコンソールでアクセスしているのは必然的に非クラスター作成アカウントになる。 したがって、強い権限を持っているからといってもNodeが表示されることはなかった。

ということで、 system:masters グループに自分がwebコンソールのアクセスに利用しているアカウントを追加した。

# 現在の設定を確認
$ eksctl get  iamidentitymapping --cluster wonderful-rainbow-1613008907
ARN                                             USERNAME                GROUPS
arn:aws:iam::123456789:role/eksctl-wonderful-rainbow-16130089-NodeInstanceRole-1COHYLVD2TC7P    system:node:{{EC2PrivateDNSName}}   system:bootstrappers,system:nodes

# 自分のユーザーをsystem:mastersグループに追加
$ eksctl create iamidentitymapping \
 --cluster wonderful-rainbow-1613008907 \
 --arn arn:aws:iam::123456789:user/ReiSuyama \
 --username ReiSuyama \
 --group system:masters

# 追加されていることを確認
$ eksctl get  iamidentitymapping --cluster wonderful-rainbow-1613008907
ARN                                             USERNAME                GROUPS
arn:aws:iam::123456789:role/eksctl-wonderful-rainbow-16130089-NodeInstanceRole-1COHYLVD2TC7P    system:node:{{EC2PrivateDNSName}}   system:bootstrappers,system:nodes
arn:aws:iam::123456789:user/ReiSuyama                           ReiSuyama               system:masters

これにより、無事webコンソールでもNodeの一覧が表示されるようになった。

available

クラスターの削除

EKSやGKEでクラスターを維持するのは無視できない金額がかかるため、一時的な利用なら忘れずに削除することが大切。 EKSなら下記のようにクラスターを削除できる。 このコマンドはGKEのgcloud container clusters delete相当。

$ eksctl delete cluster --name wonderful-rainbow-1613008907

tags: AWS, EKS, K8s, GKE