Otama's Playground > サーバー > おうちKubernetesを構築してみた話【kubeadm + CRI-O + Cilium】

おうちKubernetesを構築してみた話【kubeadm + CRI-O + Cilium】

最近、自宅のラボ環境をいじるのが楽しくなってきたので、ちょっと気合を入れてKubernetesクラスターの構築にチャレンジしてみました。
「kubeadmで構築って結構面倒そうだな……」なんて思ってましたが、やってみたら意外とサクッとできてしまったので、その記録を備忘録がてらまとめておこうと思います。

今回はProxmox VE上にVMを立てて、そこにUbuntu Serverを入れて作業しました。
ハードウェア的にはかなり控えめなスペックですが、検証程度であれば必要十分。
「環境の破壊と再構築がラク」という意味でも、Proxmoxとの相性は最高ですね。

内容としては、ドキュメント通りに手順をなぞっていく形なので、技術的な深掘りはあまりありません。
ただ、実際に動かす中で「これ忘れてたらハマるな〜」みたいなポイントもいくつかあったので、そういう視点で見てもらえると何かの参考になるかもしれません。

実行環境

環境の破壊と創造が簡単にできるようにProxmox上のVMで実行しています。

  • CPU: Intel N150(VMに割当中のコア数=2)
  • RAM: 8GB
  • ディスク: 256GB
  • OS: ubuntu server 24.04.2

手順

公式ドキュメントを参考に以下の作業を行っていきます。

  • コンテナランタイムのインストール
  • kubeadmのインストール
  • クラスターの起動
  • CNIのインストール

コンテナランタイムのインストール

参考: https://kubernetes.io/ja/docs/setup/production-environment/container-runtimes/

IPv4フォワーディングを有効化
Bash
# ドキュメントママ
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# この構成に必要なカーネルパラメーター、再起動しても値は永続します
cat <<EOF | sudo 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

# 再起動せずにカーネルパラメーターを適用
sudo sysctl --system
cri-o(コンテナランタイム)をインストールする

cri-oの公式ドキュメントを参考にインストールします

Bash
CRIO_VERSION=v1.32

# 作業に必要な依存をインストール
sudo apt-get update
sudo apt-get install -y software-properties-common curl
    
# cri-oのリポジトリを追加
curl -fsSL https://download.opensuse.org/repositories/isv:/cri-o:/stable:/$CRIO_VERSION/deb/Release.key |
    sudo gpg --dearmor -o /etc/apt/keyrings/cri-o-apt-keyring.gpg

echo "deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://download.opensuse.org/repositories/isv:/cri-o:/stable:/$CRIO_VERSION/deb/ /" |
    sudo tee /etc/apt/sources.list.d/cri-o.list
    
# cri-oをインストール
sudo apt-get update
sudo apt-get install -y cri-o

インストール出来たらcri-oを起動します。statusがactiveになってたら起動成功です。

Bash
systemctl start crio.service
systemctl status crio.service

kubeadmのインストール

参考: https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm

swapを無効化する

swapがなければこの項は無視して問題ないです。

Bash
# swapがあることを確認
free -h 

# 一時的なswapの無効化(再起動で復活する)
sudo swapoff -a

# 永続化する場合は/etc/fstabのswap行をコメントアウトか削除します
sudo nano /etc/fstab
kubeadmをインストールする
Bash
KUBERNETES_VERSION=v1.33

# Kubernetesのリポジトリを追加
curl -fsSL https://pkgs.k8s.io/core:/stable:/$KUBERNETES_VERSION/deb/Release.key |
    sudo 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:/$KUBERNETES_VERSION/deb/ /" |
    sudo tee /etc/apt/sources.list.d/kubernetes.list
    
# kubelet, kubeadm, kubectlをインストール
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

クラスタの作成

参考: fCNIhttps://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm

kubeadmの初期化を行う

何もエラーが出ないことを祈りながら、以下のコマンドを実行します。

Bash
sudo kubeadm init

以下のように表示されたら、インストラクション通りコマンドを実行して初期化完了です。

Bash
To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

ここで以下のコマンドを実行してみます。するとcontrol-planeが作成されているのが見て取れますが、まだNotReadyの状態です。CNIがインストールされていないことが原因のため、次の項でインストールしていきます。

Bash
kubectl get nodes

# NAME      STATUS     ROLES           AGE     VERSION
# test-01   NotReady   control-plane   6m21s   v1.33.0

CNIのインストール

helmのインストール

ciliumはhelm経由で導入するため、まずhelmをインストールします。

※helmはkubernetes用のパッケージマネージャーです(デプロイ定義の管理など別にも用途はありますが詳細は割愛)

例の通り公式ドキュメントの手順を踏んでいきます。

Bash
# 作業用の依存
sudo apt-get install apt-transport-https --yes

# helmのリポジトリを追加
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list

# helmをインストールする
sudo apt-get update
sudo apt-get install helm
Ciliumのインストール

こちらのドキュメントを参考にインストールしていきます。

Bash
# ciliumのリポジトリを追加
helm repo add cilium https://helm.cilium.io/

# ciliumのインストール
helm install cilium cilium/cilium --version 1.17.3 \
  --namespace kube-system
Cilium CLIのインストール

CNIの状態確認やカスタマイズに必須なので、CLIをインストールします。

Bash
# 変数の宣言
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi

# packageをダウンロードしてくる
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}

# ハッシュの確認
sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum

# 解凍して/usr/local/binに配置
sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}

以下のコマンドを叩くと、動作しているか確認できます。

Bash
cilium status
nodeの確認

再度以下のコマンドを叩き、kubeletが動作する状態になっているかを確認します。Readyの状態になっていれば成功です。もしNotReadyの場合は多分どこかでミスってます。

Bash
kubectl get node

# statusがreadyになっていれば成功
# NAME      STATUS   ROLES           AGE   VERSION
# test-01   Ready    control-plane   28m   v1.33.0

最後に

というわけで、無事にシングルノード構成のKubernetesクラスターを起動するところまで完了しました!Ciliumの導入も含めて全部CLIベースでやったので、「自分で作った感」があってちょっとテンション上がってます。

次はこの環境を使ってGitOps的な運用とか、複数ノードへの拡張なんかもやってみたいところです。ちまちま遊びながら、また面白いネタが出てきたら書いていこうと思います。

次回の記事↓

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です