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