⛷️

multipass 上に kubernetes 環境を最速で作る

2021/11/20に公開1

はじめに

M1 Mac で multipass が動くみたいですね!(M1 持ってません、誰か下さい)

https://japanese.engadget.com/ubuntu-publisher-bring-m1-mac-multipass-215008223.html

ところで 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 をインストールして使っています。

https://tailscale.com/

インストールは以下の手順。

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 は以下の様に適用。

service.yaml
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
ingress.yaml
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

ArashishiArashishi

ものすごく有難い内容だったのですが、インスタンス名はk3sではない方が分かりやすかった気もします。
インスタンス名由来か、k3s由来か、素人目線で判断できないためです。