ローカルに複数のKubernetesクラスタを立てて切り替える
1年以上ぶりの記事投稿。 部署を異動して業務内容が変わり、久しぶりにKuberneresガッツリ触ることになるのでリハビリがてら記事を作成します。同じようなことやっている人は数多居るけれど気にしないスタンスで
Kubernetesをローカルで簡単に構築することができるようになって久しいです。 内容によっては複数の構成の違うKubernetesクラスタを構築してmanifestを適用して挙動の差異をみたいというモチベーションがあるかもしれません。 手元のPCはMacなので、今回はLimaとMultipassを利用してクラスタを構築し、それぞれをローカルのkubecltから切り替えて使えるところまでやってみます
※Ubuntuの世界に持ち込んで楽をしているのがお分かりかと思いますが気にしてはなりません
やること
Limaを用いてクラスタを構築
Limaはテンプレートを食わせてあげてVMを構築することができるのですが、プリセットで豊富なテンプレートが既にあります。
テンプレート一覧は limactl start --list-templates
で表示可能です。表示させてあげるとk3s
とk8s
が出てきますので、今回はk8s
の方を利用していきます。
起動コマンドは以下の通り。VM名はわかりやすくk8sとしておきました
$ limactl start --name=k8s template://k8s
実行すると以下のウィザードが出てきますので Proceed with the current configuration
で構築を進めます。ウィザードが煩わしい、shellscript等で完全自動化したい場合は --tty=false
オプションをつけましょう
$ limactl start --name=k8s template://k8s ? Creating an instance "k8s" [Use arrows to move, type to filter] > Proceed with the current configuration Open an editor to review or modify the current configuration Choose another example (docker, podman, archlinux, fedora, ...) Exit
構築が進行します。しばらく時間がかかるので待ちましょう。
構築が完了すると、以下の表示がされるのでkubeconfigの場所をメモっておきます(このタイミングで export KUBECONFIG="/Users...
実行しても構いません)
INFO[0459] Message from the instance "k8s": To run `kubectl` on the host (assumes kubectl is installed), run the following commands: ------ export KUBECONFIG="/Users/doridoridoriand/.lima/k8s/copied-from-guest/kubeconfig.yaml" kubectl ... ------
Multipassを用いてクラスタを構築
Mutipassは multipass find
コマンドで minikubeのテンプレートイメージが既に公開されています。こちらを利用してもよいですし、snapからKubernetesをインストールしてもよいです。
今回はsnapからmicrok8sをインストールして利用してみましょう。以下のようなcloud-initを書いて、cloud-config.yml
として保存しましょう
# cloud-config # resolv.conf manage_resolv_conf: true resolv_conf: nameservers: ['1.1.1.1'] # package package_update: true package_upgrade: true snap: commands: 00: snap install microk8s --classic 01: snap install kubectl --classic runcmd: - [ sudo, usermod, -a, -G, microk8s, ubuntu ] - [ /snap/bin/microk8s.enable, dns, dashboard, metric-server ]
以下コマンドで構築します。Limaで構築したスペックと合わせてメモリ4GB、CPU4コアとしました
$ multipass launch --cpus 4 --disk 100 --mem 4GB --name k8s --cloud-init cloud-config.yml;
構築が完了すると Launched: k8s
と表示されます。表示されたら以下コマンドでkubeconfigを取得します。
Limaと違いボリュームマッピングしてないのでローカルに保存されず、VMにコマンドを実行して取得する必要があります
$ multipass exec k8s -- /snap/bin/microk8s config view
それぞれのkubeconfigをマージ
$KUBECONFIG
変数を用いるパターン、--kubeconfig
オプションを用いるパターンなどがありますが、少々面倒なので2つのkubeconfigをマージしてしまいましょう。
kubeconfigの要素を抜き出すと以下のようになります
apiVersion: v1 clusters: - cluster: ... contexts: - context: ... current-context: kind: Config preferences: {} users: - name: admin ...
ここで clusters
、contexts
、users
がリスト型になっているので、それぞれのクラスタで作成したkubeconfigを並べて書いてあげればよさそうです
apiVersion: v1 clusters: - cluster: ... - cluster: ... contexts: - context: ... - context: ... current-context: kind: Config preferences: {} users: - name: admin ... - name: admin ...
実際に挙動を見てましょう。分かりやすさと操作性の向上の観点から kubectx
コマンドを利用しています
$ kubectx kubernetes-admin@kubernetes microk8s
無事2つ表示されました。今は上の kubernetes-admin@kubernetes
が選択されている状態です。kubectlコマンドを実行してnodeの差異を見てみましょう
$ kubectl get nodes NAME STATUS ROLES AGE VERSION lima-k8s Ready control-plane 20h v1.26.2
Lima側のnodeが表示されました。次にcontextを切り替えてMultipass側のクラスタを見てみましょう
$ kubectx microk8s Switched to context "microk8s" $ kubectl get nodes NAME STATUS ROLES AGE VERSION k8s Ready <none> 3h12m v1.26.1
Multipass側のnodeが表示されました。これでローカルで複数のクラスタを構築し、切り替えて利用できるようになりました。 ローカルのマシンパワーの問題はありますが、サクッと構築できるので諸々検証が捗りますね