最近、自宅のラボ環境をいじるのが楽しくなってきたので、ちょっと気合を入れてKubernetesクラスターの構築にチャレンジしてみました。
「kubeadmで構築って結構面倒そうだな……」なんて思ってましたが、やってみたら意外とサクッとできてしまったので、その記録を備忘録がてらまとめておこうと思います。
今回はProxmox VE上にVMを立てて、そこにUbuntu Serverを入れて作業しました。
ハードウェア的にはかなり控えめなスペックですが、検証程度であれば必要十分。
「環境の破壊と再構築がラク」という意味でも、Proxmoxとの相性は最高ですね。
内容としては、ドキュメント通りに手順をなぞっていく形なので、技術的な深掘りはあまりありません。
ただ、実際に動かす中で「これ忘れてたらハマるな〜」みたいなポイントもいくつかあったので、そういう視点で見てもらえると何かの参考になるかもしれません。
Contents
実行環境
環境の破壊と創造が簡単にできるように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.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の公式ドキュメントを参考にインストールします
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になってたら起動成功です。
systemctl start crio.service
systemctl status crio.service
kubeadmのインストール
参考: 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 nano /etc/fstab
kubeadmをインストールする
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の初期化を行う
何もエラーが出ないことを祈りながら、以下のコマンドを実行します。
sudo kubeadm init
以下のように表示されたら、インストラクション通りコマンドを実行して初期化完了です。
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.0
CNIのインストール
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/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のインストール
こちらのドキュメントを参考にインストールしていきます。
# 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をインストールします。
# 変数の宣言
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}
以下のコマンドを叩くと、動作しているか確認できます。
cilium status
nodeの確認
再度以下のコマンドを叩き、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的な運用とか、複数ノードへの拡張なんかもやってみたいところです。ちまちま遊びながら、また面白いネタが出てきたら書いていこうと思います。
次回の記事↓