おひとり

できる限りひとりで楽しむための情報やプログラミング情報など。

【EKS】kubeconfigにeks上のクラスタの情報を追加する

実験用にeksctlでk8sクラスタを作っていたのですが、その最中にコネクションが切れてしまいました。
eksctlでクラスタを作ると、10〜20分程度でクラスタが完成した後、kubeconfigに自動で情報が追加されます。
しかし途中で接続が切れるとkubeconfigが更新されず、kubectlから使えない状態に。
今回はそれを解消するために手動で設定を追加してみます。

TL;DR

以下のコマンドを使います。

aws eks --region ap-northeast-1 update-kubeconfig --name <EKSのクラスタ名>

※クラスタ名の確認は以下のコマンドが使えます。

eksctl get cluster

ゴミ情報を削除

まず、自分の場合はよく実験用のk8sクラスタをeksctlで作成します。
基本的にクラスタはいくつか試したあとすぐに削除するのですが、今回はkubeconfigの中に使っていないクラスタの情報が残っていました。

以下のコマンドでkubeconfigの中身を確認できます。

kubectl config view

自分の場合は、以下の3つの不要な情報が残っていました。

  • contexts
  • clusters
  • users

自動で削除されず残った情報があった、と言うことですね。
コマンドで情報を追加する前に念のため削除しておきます。

kubectl config unset contexts.<name>

kubectl config unset clusters.<name>

kubectl config unset users.<name>

<name>には各項目のname属性で置き換える。

eks上のk8クラスタの情報をkubeconfigに追加

以下のコマンドを使って追加できます。

aws eks --region ap-northeast-1 update-kubeconfig --name <EKSのクラスター名>

※EKSのクラスター名は確認する場合はマネジメントコンソールから、もしくは以下のコマンドを使います。

eksctl get cluster

kubectl config get-contextsを使って当該クラスタが追加されていること、また追加したcontextに切り替わっていることを確認します。

自動でcontextが切り替わらない時

基本的にクラスタを追加したらcontextが自動で切り替わるはずですが、切り替わらない時は以下のコマンドで切り替えます。

kubectl config use-context <clusterのname>

なお、<clusterのname>はEKS上のクラスター名ではありません。kubeconfig中のcusters.nameです。つまり、以下のコマンドで取得できる値、ということです。

kubectl config view -o jsonpath='{.clusters[*].name}'

この辺の対応は混乱しやすいですよね。

まとめ

EKS上のk8sクラスタの情報をローカルのkubeconfigに追加するには以下のコマンドを使う。

aws eks --region ap-northeast-1 update-kubeconfig --name <EKSのクラスター名>

eksctlでスニペット的にさっと8sクラスタを作成できるのは便利ですが、やはり10分〜20分くらいかかってしまいます。
となると、自然と「離席するタイミングでクラスタ作っておこう」となるんですが、するとPCがスリープになりコネクションが切れてしまいがちです。
普段自動で行われていたkubeconfigの更新が行われないことになります。
そうなった場合に手動で解決する方法を調べました。

k8sは抽象度の高い技術ということもあり、その分ツール群は裏側で自動でいろいろ行ってくれ、こちらとしてはまるで「魔法」。
こちらから歩み寄らないとその「裏側」が見にくいと言ったこともしばしば。
今回のトラブルでその「裏側」が少し見えてきた気がします。

参考ページ

docs.aws.amazon.com

f:id:hitoridehitode:20210619153558p:plain:w250
kubernetes