前提
使用するマシンは、Linuxがインストール可能なコンピュータであれば何でも構いません。本記事では中古で格安で手に入れたFujitsu futro s720を利用します。
クラスタに使用するマシンがすべて同LAN内に置かれるように配置してください。
1. Linux環境の構築
Linuxのインストール
Linux Server 26.04をマシンにインストール(詳細は省略)
手順:
- rufusの公式サイトからrufusをダウンロード
- Linuxの公式サイトから Ubuntu Server 26.04 LTSをダウンロード
- rufusでUSBメモリにUbuntu Server 26.04 LTSのisoイメージを書き込む
- USBメモリをクラスタに使用するマシンに差し込む
- BIOSを立ち上げてBoot OptionからUSBメモリの起動順位を一番上にして再起動
- Ubuntuのインストール画面が表示されるので、順番に設定していく
- Install OpenSSH serverにチェック
- Featured server snapsは特に何もチェックしない
各種設定
1. スワップの無効化
swappoffでスワップを無効化
sudo swapoff -a
/etc/fstab を編集してスワップファイルの行をコメントアウト
# /swap.img none swap sw 0 0
2. カーネルモジュールのロード
/etc/modules-load.d/k8s.conf を作成して以下の内容を書き込む
overlay
br_netfilter
モジュールをロード
sudo modprobe overlay
sudo modprobe br_netfilter
3. ネットワーク設定
/etc/sysctl.d/k8s.conf を編集してipフォワーディングとブリッジを設定
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
設定を反映
sudo sysctl --system
2. コンテナランタイムのインストール
コンテナランタイムとして標準の containerd を使用。
1. containerdのインストール
sudo apt update
sudo apt install -y containerd
2. デフォルト設定の生成とSystemdCgroupの有効化
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
/etc/containerd/config.toml を編集してSystemCgroupを有効化
SystemdCgroup = true
サービスの再起動と有効化
sudo systemctl restart containerd
sudo systemctl enable containerd
3. kubeadm, kubelet, kubectlのインストール
1. 必要パッケージのインストール
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
2. kubeadm, kubelet, kubectlのインストール
Kubernetesパッケージリポジトリの公開証明鍵をダウンロード
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.36/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
aptにKubernetesのリポジトリを追加
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.36/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
4. クラスタの初期化(Masterノードのみ)
以下のコマンドでクラスタを初期化
※192.168.0.0/16はPodネットワーク用のCIDR(Calicoのデフォルト値)で、ホストのLANサブネットとは別のもの
※ホストのLANサブネットが192.168.1.0/24などの環境では、192.168.0.0/16だとホストのLANの設定と重複し、最悪ネットワークが使えなくなる可能性があるので、その場合は 10.244.0.0/16 など重複しないCIDRを指定
sudo kubeadm init --pod-network-cidr=192.168.0.0/16
クラスタの初期化が完了すると以下のメッセージが表示されるので、コピーして控える
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
...(中略)...
Alternatively, if you are the root user, you can run:
sudo kubeadm join <MasterノードのIP>:6443 --token <トークン> \
--discovery-token-ca-cert-hash sha256:<ハッシュ>
(任意)一般ユーザーでもkubectlを実行できるように、configファイルの権限を設定する
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
5. CNI(Calico)のインストール
Pod同士のネットワーク接続のためにCNIをインストール(ここではCalicoをCNIとして使用)
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.32.0/manifests/calico.yaml
6. Workerノードの追加(Workerノードのみ)
4. クラスタの初期化(Masterノードのみ)で控えたコマンドをWorkerノードで実行して、Workerノードをクラスタに参加させる
sudo kubeadm join <MasterノードのIP>:6443 --token <トークン> \
--discovery-token-ca-cert-hash sha256:<ハッシュ>
7. 動作確認
1. workerノードの確認
以下のコマンドをMasterノードで実行して、ノードの一覧を出力する
kubectl get nodes
以下のようにノードが表示されれば成功
kubectl get nodes
NAME STATUS ROLES AGE VERSION
worker Ready <none> 16h v1.36.0
master Ready control-plane 16h v1.36.0
2. podの追加
試しに、Nginxをpod上で動作させてみる
nginxイメージを使用して、nginxという名前のDeploymentを作成
kubectl create deployment nginx --image=nginx
deploymentとpodを確認
kubectl get deployments
kubectl get pods
以下のようにpodの一覧が表示される。
NAME READY STATUS RESTARTS AGE
nginx-7f8fbb96d-rxn4w 1/1 Running 0 22s
3. Serviceの追加
このままではpodのIPアドレスが毎回変わってしまうので、podに対してIPとPort番号を割り当てる service を作成する
kubectl expose deployment nginx --port=80 --type=NodePort
サービスの一覧を確認する
kubectl get services
以下のようにサービス一覧が表示されたら成功
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 1h
nginx NodePort 10.100.200.50 <none> 80:31234/TCP 1m
サービス一覧のPORT(S)列の80:31234/TCPの31234が、外部に公開されているPort番号となる。
ブラウザでMasterノードもしくはWorkerノードのIPアドレス:Port番号にアクセスして、Nginxの画面が出れば成功
ちなみに、WorkerノードのIPアドレス一覧は次のコマンドで確認できる
kubectl get nodes -o wide