doridoridoriand’s diary

主に技術的なことを書いていく予定(たぶん)

ローカルに複数のKubernetesクラスタを立てて切り替える

1年以上ぶりの記事投稿。 部署を異動して業務内容が変わり、久しぶりにKuberneresガッツリ触ることになるのでリハビリがてら記事を作成します。同じようなことやっている人は数多居るけれど気にしないスタンスで

Kubernetesをローカルで簡単に構築することができるようになって久しいです。 内容によっては複数の構成の違うKubernetesクラスタを構築してmanifestを適用して挙動の差異をみたいというモチベーションがあるかもしれません。 手元のPCはMacなので、今回はLimaMultipassを利用してクラスタを構築し、それぞれをローカルのkubecltから切り替えて使えるところまでやってみます

Ubuntuの世界に持ち込んで楽をしているのがお分かりかと思いますが気にしてはなりません

やること

  • Limaを用いてクラスタを構築
  • Multipassを用いてクラスタを構築
  • それぞれのkubeconfigをマージ
  • contextを切り替えてそれぞれのクラスタに接続できているかを確認

Limaを用いてクラスタを構築

Limaはテンプレートを食わせてあげてVMを構築することができるのですが、プリセットで豊富なテンプレートが既にあります。 テンプレート一覧は limactl start --list-templates で表示可能です。表示させてあげるとk3sk8sが出てきますので、今回は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
  ...

ここで clusterscontextsusersがリスト型になっているので、それぞれのクラスタで作成した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が表示されました。これでローカルで複数のクラスタを構築し、切り替えて利用できるようになりました。 ローカルのマシンパワーの問題はありますが、サクッと構築できるので諸々検証が捗りますね