はじめに
M1 MacBook Proでkubeadmを使ってKubernetesクラスタを立ち上げてみます。
構成図
kubeadmを使って構築するKubernetesクラスタの構成図は以下です。

環境情報
| Component | Version |
|---|---|
| PC | M1 MacBook Pro |
| OS | macOS 26.2 |
| multipass | 1.16.1+mac |
| Ubuntu | 24.04 |
| Kubernetes | 1.35 |
| Calico | 3.31 |
構築手順
仮想マシンを立てる
multipassというCanonical社製の仮想マシン管理ツールを利用します。
❯ brew install --cask multipass
マスターノード用とワーカーノード用のVMを作成します
# マスターノード (CPU:2, Mem:4GB, Disk:10GB)
multipass launch --name k8s-master --cpus 2 --memory 4G --disk 10G lts
# ワーカーノード (CPU:2, Mem:2GB, Disk:10GB)
multipass launch --name k8s-worker --cpus 2 --memory 2G --disk 10G lts
注意
もし仮想マシン作成時にタイムアウトで失敗する場合があります。
❯ multipass launch --name k8s-worker --cpus 2 --memory 2G --disk 10G lts
launch failed: The following errors occurred:
k8s-worker: timed out waiting for response
そのときは、中途半端に作成した仮想マシンを1度削除し、multipassデーモンを再起動した上で、再度仮想マシンを作成してみてください。
❯ multipass delete k8s-worker
❯ multipass purge
❯ sudo pkill -f multipassd
❯ multipass launch --name k8s-worker --cpus 2 --memory 2G --disk 10G lts
Launched: k8s-worker
コンテナランタイム (containerd) の準備
以下はマスターノードを対象とした手順ですが、全てのノードで実施する必要があります。
multipass shellコマンドで仮想マシンのシェルにログインします。
❯ multipass shell k8s-master
以下の作業をrootユーザーで実行します。
sudo -i
必要なカーネルモジュールをロードします。
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
lsmod | grep -i -E "(overlay|br_netfilter)"
iptablesがブリッジトラフィックを見れるようにするため、ネットワーク設定をします。
cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
スワップを無効化します。
swapoff -a
sed -i '/swap/d' /etc/fstab
containerdをインストールします。
apt update
apt install -y containerd
systemctl status containerd
containerd の設定ファイルを生成と SystemdCgroup を有効化します。
mkdir -p /etc/containerd
containerd config default | tee /etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml
grep SystemdCgroup /etc/containerd/config.toml
containerdを再起動します。
systemctl restart containerd
kubeadm, kubelet, kubectl のインストール
こちらも全ノードに適用します。
rootユーザーで実行します。
sudo -i
必要なパッケージをインストールします。
apt update
apt install -y apt-transport-https ca-certificates curl gpg
Kubernetesの公開鍵を取得します。
mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.35/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
リポジトリを追加します。
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.35/deb/ /' | tee /etc/apt/sources.list.d/kubernetes.list
ツールをインストールします。
apt update
apt install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl
マスターノードの構築
マスターノードにログインします。
そこで、rootユーザーでkubeadm initを実行します。
sudo -i
kubeadm init --pod-network-cidr=192.168.0.0/16 --control-plane-endpoint=$(hostname -I | awk '{print $1}')
実行するとkubeadm joinコマンドの例が表示されるためメモしておきます。
一般ユーザーに戻り、kubectlの設定をします。
# exit で root を抜けてから実行
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
CNIとしてCalicoをインストールします。
wget https://raw.githubusercontent.com/projectcalico/calico/refs/heads/release-v3.31/manifests/tigera-operator.yaml
wget https://raw.githubusercontent.com/projectcalico/calico/refs/heads/release-v3.31/manifests/custom-resources.yaml
kubectl apply -f tigera-operator.yaml
kubectl apply -f custom-resources.yaml
ワーカーノードの参加
メモした kubeadm join コマンドを root 権限 (sudo) で実行します。
sudo kubeadm join ...
ノードの状態の確認
マスターノードに戻ってkubectlでノードの状態を確認します。
kubectl get nodes
STATUSがReadyになれば動作確認が成功です。
macのターミナルからkubeadmで構築したKubernetesクラスタに接続する
上記の手順ではマスターノードにログインする必要がありました。
KUBECONFIG環境変数にkubeadmで構築したKubernetesクラスタのconfigを指定することで、macのターミナルからkubectlで接続できるようになります。
brew install kubectl
multipass transfer k8s-master:/home/ubuntu/.kube/config ./k8s-config
export KUBECONFIG=$(pwd)/k8s-config
kubectl get nodes
最後に
kubeadmを使ってKubernetesクラスタを構築することができました。