最近、自宅のラボ環境をいじるのが楽しくなってきたので、ちょっと気合を入れてKubernetesクラスターの構築にチャレンジしてみました。
「kubeadmで構築って結構面倒そうだな……」なんて思ってましたが、やってみたら意外とサクッとできてしまったので、その記録を備忘録がてらまとめておこうと思います。
今回はN150搭載のミニPC上にProxmox VEを立てて、そこにVMを作成して作業しました。
ハードウェア的にはかなり控えめなスペックですが、検証程度であれば必要十分です。
内容としては、ドキュメント通りに手順をなぞっていく形なので、技術的な深掘りはあまりありません。
ただ、実際に動かす中で「これ忘れてたらハマるな〜」みたいなポイントもいくつかあったので、そういう視点で見てもらえると何かの参考になるかもしれません。
実行環境
環境の破壊と創造が簡単にできるように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フォワーディングを有効化
# ドキュメントママcat <<EOF | sudo tee /etc/modules-load.d/k8s.confoverlaybr_netfilterEOF
sudo modprobe overlaysudo modprobe br_netfilter
# この構成に必要なカーネルパラメーター、再起動しても値は永続しますcat <<EOF | sudo tee /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call-iptables = 1net.bridge.bridge-nf-call-ip6tables = 1net.ipv4.ip_forward = 1EOF
# 再起動せずにカーネルパラメーターを適用sudo sysctl --systemcri-o(コンテナランタイム)をインストールする
cri-oの公式ドキュメントを参考にインストールします
CRIO_VERSION=v1.32
# 作業に必要な依存をインストールsudo apt-get updatesudo 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 updatesudo apt-get install -y cri-oインストール出来たらcri-oを起動します。statusがactiveになってたら起動成功です。
systemctl start crio.servicesystemctl status crio.servicekubeadmのインストール
参考: https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm
swapを無効化する
swapがなければこの項は無視して問題ないです。
# swapがあることを確認free -h
# 一時的なswapの無効化(再起動で復活する)sudo swapoff -a
# 永続化する場合は/etc/fstabのswap行をコメントアウトか削除しますsudo sed -i '/ swap / s/^$.*$$/#\1/g' /etc/fstabkubeadmをインストールする
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 updatesudo apt-get install -y kubelet kubeadm kubectlsudo apt-mark hold kubelet kubeadm kubectlクラスタの作成
参考: https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm
kubeadmの初期化を行う
何もエラーが出ないことを祈りながら、以下のコマンドを実行します。もしciliumのkube-proxy置き換え機能を試す場合はkube-proxyのセットアップをここでスキップします。
# 通常はこちらsudo kubeadm init
# ciliumでkube-proxyの置き換えをしたい場合はこちらkubeadm init --skip-phases=addon/kube-proxy以下のように表示されたら、インストラクション通りコマンドを実行して初期化完了です。
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がインストールされていないことが原因のため、次の項でインストールしていきます。
kubectl get nodes
# NAME STATUS ROLES AGE VERSION# test-01 NotReady control-plane 6m21s v1.33.0CNIのインストール
helmのインストール
ciliumはhelm経由で導入するため、まずhelmをインストールします。
※helmはkubernetes用のパッケージマネージャーです(デプロイ定義の管理など別にも用途はありますが詳細は割愛)
例の通り公式ドキュメントの手順を踏んでいきます。
# 作業用の依存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/nullecho "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 updatesudo apt-get install helmCiliumのインストール
こちらのドキュメントを参考にインストールしていきます。もしkube-proxy置き換え機能を試す場合はkubeProxyReplacement=trueを使ってください。
# ciliumのリポジトリを追加helm repo add cilium https://helm.cilium.io/
# ciliumのインストール(通常)helm install cilium cilium/cilium --version 1.17.3 \ --namespace kube-system
# ciliumのインストール(kube-proxyをciliumで置き換えたい場合)API_SERVER_IP=<your_api_server_ip># Kubeadm default is 6443API_SERVER_PORT=<your_api_server_port>helm install cilium cilium/cilium --version 1.17.4 \ --namespace kube-system \ --set kubeProxyReplacement=true \ --set k8sServiceHost=${API_SERVER_IP} \ --set k8sServicePort=${API_SERVER_PORT}Cilium CLIのインストール
CNIの状態確認やカスタマイズに必須なので、CLIをインストールします。
# 変数の宣言CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)CLI_ARCH=amd64if [ "$(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/binrm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}以下のコマンドを叩くと、動作しているか確認できます。
cilium statusnodeの確認
再度以下のコマンドを叩き、kubeletが動作する状態になっているかを確認します。Readyの状態になっていれば成功です。もしNotReadyの場合は多分どこかでミスってます。
kubectl get node
# statusがreadyになっていれば成功# NAME STATUS ROLES AGE VERSION# test-01 Ready control-plane 28m v1.33.0最後に
というわけで、無事にシングルノード構成のKubernetesクラスターを起動するところまで完了しました!Ciliumの導入も含めて全部CLIベースでやったので、「自分で作った感」があってちょっとテンション上がってます。
次はこの環境を使ってGitOps的な運用とか、複数ノードへの拡張なんかもやってみたいところです。ちまちま遊びながら、また面白いネタが出てきたら書いていこうと思います。
次回の記事↓
>-









