﻿# 使用 Multipass 與 cloud-init 快速建立 MicroK8s 叢集所需的虛擬機器 (VMs)

週日玩了一下 [cloud-init](https://cloud-init.io) 工具，我發現文件看[官方文件](https://cloudinit.readthedocs.io/)不是那麼好上手，但是[官網首頁的影片](https://www.youtube.com/watch?v=-zL3BdbKyGY)卻一看就知道怎麼設定。簡單來說，[cloud-init](https://cloud-init.io) 專門用來幫你初始化 Linux 的出廠設定，不但支援大多數 Linux 散佈版本 (distributions)，也支援大多數雲端平台業者，也可以讓你在地端的 Bare-Metal 主機進行初始化，可謂是業界標準的初始化 VM 方法。我發現 [Multipass](https://multipass.run) 也有支援 [cloud-init](https://cloud-init.io) 設定，所以這篇文章我來大致說明一下設定的過程與套用的方式。

### 建立 `microk8s-vm` 虛擬機

我是用 [Multipass](https://multipass.run) 來建立 MicroK8s 虛擬機，因此在建立好 VM 之後，還需要手動執行三行命令。除此之外，我還希望把我個人常用的 SSH 公鑰加入到 VM 中，讓我可以從我常用的 WSL 2 環境快速登入主機。再者，無論安裝哪個版本的 Linux，我都想在首次建立 VM 的同時，自動更新並升級所有套件。

我們先撰寫 `microk8s-vm.init` 腳本

```yaml
apt_update: true
apt_upgrade: true
ssh_import_id:
- lp:doggy8088
- gh:doggy8088
runcmd:
- snap install microk8s --classic
- usermod -a -G microk8s ubuntu
```

上述腳本包含了三個部分：

1.  自動更新並升級套件
    
    ```yaml
    apt_update: true
    apt_upgrade: true
    ```
    
2.  從 [LaunchPad](https://launchpad.net) 與 [GitHub](https://github.com) 匯入 `doggy8088` 帳號的 SSH 公開金鑰
    
    ```yaml
    ssh_import_id:
    - lp:doggy8088
    - gh:doggy8088
    ```
    
3.  首次開機用 `root` 身份執行兩行命令
    
    ```yaml
    runcmd:
    - snap install microk8s --classic
    - usermod -a -G microk8s ubuntu
    ```
    

接著我們就可以直接用以下命令啟動這台 VM：

```bash
multipass launch --name 'microk8s-vm' --bridged --disk 50G --cpus 2 --memory 2G --cloud-init=microk8s-vm.init
```

接著你可能會想要設定固定 IP 地址，請參見 [利用 Multipass 在區域網路架設一套 MicroK8s 叢集環境](/post/2022/01/15/Build-your-own-MicroK8s-with-Multipass-with-Fixed-IP) 文章說明。

然後在 `microk8s-vm` 虛擬機中啟動 MicroK8s 服務：

```bash
multipass exec 'microk8s-vm' -- microk8s start
```

### 建立 MicroK8s 的 Worker Nodes 虛擬機

要加入 MicroK8s 的 Worker Nodes 虛擬機到叢集中的話，叫只需要先安裝好 `microk8s` 與設定好群組即可，因此可以沿用同一份 [cloud-init](https://cloud-init.io) 腳本。

```bash
multipass launch --name 'node1' --bridged --disk 50G --cpus 1 --memory 2G --cloud-init=microk8s-vm.init
multipass launch --name 'node2' --bridged --disk 50G --cpus 1 --memory 2G --cloud-init=microk8s-vm.init
```

當 `node1` 與 `node2` 都建立完成後，基本上將會連同 `microk8s` 套件一起安裝完畢，接著就直接將節點加入叢集即可，相當便利！ 👍

### 相關連結

-   [cloud-init - The standard for customising cloud instances](https://cloud-init.io/)
-   [cloud-init Documentation — cloud-init 21.4 documentation](https://cloudinit.readthedocs.io/en/latest/)
-   [playbooks/cloud-init-lab at master · brennancheung/playbooks](https://github.com/brennancheung/playbooks/tree/master/k8s/cloud-init-lab)
