multipass 上に kubernetes 環境を最速で作る
はじめに
M1 Mac で multipass が動くみたいですね!(M1 持ってません、誰か下さい)
ところで multipass で kubernetes 環境作るの面倒だなぁと思っていたのですが、k3s を使う事で、一瞬で作れる事が分かってしまいました。以下その手順を書いていきます。
最初に答えを書く
最初に答えを書くと以下だけです。Windows でも出来ました。
multipass launch --name k3s
multipass exec k3s -- bash -c "curl -sfL https://get.k3s.io | sh -"
所要時間はおよそ数分。なにそれ簡単すぎない?
使える様にするにはひと手間
インストールは上記だけで完了します。kubectl
から使える様にするには以下を実行します。
multipass exec k3s sudo cat /etc/rancher/k3s/k3s.yaml > k3s.yaml
この k3s.yaml
を環境変数 KUBECONFIG
にパス設定して使うか、もしくは ~/.kube/config
にマージしてお使い下さい。マージする場合は2つの設定ファイルのパスを KUBECONFIG
に設定(Windows の場合は ;
で結合)して以下のコマンドを実行します。
KUBECONFIG=~/.kube/config:./config kubectl config view --flatten
なお、k3s.yaml
はホストの IP が 127.0.0.1
になっているので以下のコマンドで得た IP アドレスで書き換えて下さい。
multipass info k3s | grep IP | awk "{print $2}"
※ VirtualBox の NAT で使う場合はそのままで OK です。
なおマージしておくと kubectx から簡単に切り替えられてとても便利。
VirtualBox から使う場合はもうひと手間
VirtualBox の場合は、ポート 6443 が空いている必要があります。multipass で作った VM は基本 Host-Only network になっているので、NAT にするか Bridge にするかになります。しばらく触ってみた感じ、ブリッジ接続にするメリットはそれほど無かったので、VirtualBox の設定から NAT に変更し、ポートフォワードで 6443 を開けておくといいでしょう。
ちなみにこちら、通常ユーザで VirtualBox を起動しても k3s
の仮想 OS は見えません。管理者権限で動いているからです。pstools をインストールし、管理者権限で以下を実行すると出てきます。
PsExec64.exe -s -i "C:\Program Files\Oracle\VirtualBox\VirtualBox.exe"
このコマンドを管理者権限で動かす必要があるので、僕は以下をバッチファイル化しています。
後から k3s
の CPU 数や使用メモリを変更したくなるので用意しておくと良いでしょう。
@echo off
sudo c:\dev\tools\pstools\PsExec64.exe -s -i "C:\Program Files\Oracle\VirtualBox\VirtualBox.exe"
sudo
はこちら。
おまけ
ちなみに、VirtualBox の様な環境では LoadBalancer で external-IP が払いだされません。Ingress でサービスを公開する事になります。まぁもともと仮想 OS にインストールしている訳ですから、まさかインターネット上で公開するつもりは無いと思います。僕の場合は、この仮想 OS 内に tailscale
をインストールして使っています。
インストールは以下の手順。
multipass exec k3s -- bash -c "curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/focal.gpg | sudo apt-key add -"
multipass exec k3s -- bash -c "curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/focal.list | sudo tee /etc/apt/sources.list.d/tailscale.list"
multipass exec k3s -- bash -c "sudo apt-get update"
multipass exec k3s -- bash -c "sudo apt-get install tailscale"
multipass exec k3s -- bash -c "sudo tailscale up"
インストールが完了し、URL を踏めば完了。
なお Service と Ingress は以下の様に適用。
apiVersion: v1
kind: Service
metadata:
name: app
spec:
selector:
app: app
type: NodePort
ports:
- name: http
port: 80
targetPort: 8080
#- name: https
# port: 443
# targetPort: 8080
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app
spec:
rules:
- host: k3s
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app
port:
number: 80
$ kubectl apply -f service.yaml
$ kubectl apply -f ingress.yaml
これでホスト名でアクセスすればいいので、tailscale 経由でホスト名でアクセスすれば OK。どうしても LoadBalancer でアクセスしたい人は patch で external-IP を更新すればうまく行くかもしれない。
$ kubectl patch svc my-service -p '{"spec": {"type": "LoadBalancer", "externalIPs":["192.168.0.X"]}}'
Discussion
ものすごく有難い内容だったのですが、インスタンス名はk3sではない方が分かりやすかった気もします。
インスタンス名由来か、k3s由来か、素人目線で判断できないためです。