手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 22.04 Kubernetes クラスター構築の事前準備 – kubeadm ノードの前提を整える

Ubuntu 22.04 上で kubeadm を使って Kubernetes クラスターを構築する前に、各ノード側で共通の事前準備を行います。ここでは、カーネルモジュール、sysctl、swap 無効化、Kubernetes パッケージリポジトリ、kubelet / kubeadm / kubectl の導入までを整理します。

この記事はクラスター初期化そのものではなく、コントロールプレーンとワーカーノードの両方で実行する OS 側の準備です。実際の環境では構成管理ツールで適用することが多いですが、ここでは手動で確認できる形に落としています。

前提条件

  • Ubuntu 22.04 がインストール済みである
  • 固定 IP、名前解決、時刻同期などの基本設定が完了している
  • コントロールプレーン、ワーカーノードの全台で実行する
  • コンテナランタイムは containerd を前提にする
  • kube-proxy は IPVS モードを使う想定で準備する

Kubernetes のリポジトリやバージョンは時期によって変わります。実際に構築する場合は、使いたい Kubernetes バージョンの公式手順も確認します。

カーネルモジュールを読み込む

Kubernetes ノードで必要になるカーネルモジュールを、起動時に読み込むように設定します。

sudo tee /etc/modules-load.d/k8s.conf >/dev/null <<'EOF'
overlay
br_netfilter
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
sudo modprobe ip_vs
sudo modprobe ip_vs_rr
sudo modprobe ip_vs_wrr
sudo modprobe ip_vs_sh
sudo modprobe nf_conntrack

overlay はコンテナランタイムで使われる OverlayFS 用です。br_netfilter はブリッジを通る通信を iptables / nftables 側で扱うために必要になります。ip_vs 系は kube-proxy の IPVS モードで使います。

sysctl を設定する

Kubernetes のネットワーク処理で必要になるカーネルパラメータを設定します。

sudo tee /etc/sysctl.d/99-kubernetes.conf >/dev/null <<'EOF'
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system

net.ipv4.ip_forward は Pod や Service の通信で必要になります。IPv6 を使う構成では、CNI やクラスタ設計に合わせて IPv6 側の転送設定も確認します。

swap を無効化する

kubelet は、従来の標準的な構成では swap 無効化を前提に扱われてきました。まずは swap を停止します。

sudo swapoff -a
free -h

再起動後も swap が有効にならないように、/etc/fstab の swap 行をコメントアウトします。既存ファイルを確認してから編集します。

grep -n "swap" /etc/fstab

単純な検証環境で swap 行だけをコメントアウトする場合は、次のように置換できます。実環境では、対象行を確認してから実行します。

sudo cp /etc/fstab /etc/fstab.bak
sudo sed -i.bak '/\sswap\s/s/^/#/' /etc/fstab

Kubernetes リポジトリを追加する

Kubernetes パッケージを取得するため、APT リポジトリを追加します。以下は Kubernetes 1.29 系の例です。利用するバージョンに合わせてパスを変更します。

sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl gpg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/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:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list >/dev/null
sudo apt update

古い手順では apt-key を使う例がありますが、現在は keyring と signed-by を使ってリポジトリ単位で鍵を分ける方が自然です。

kubelet / kubeadm / kubectl をインストールする

Kubernetes ノードで使う基本パッケージをインストールします。

sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

apt-mark hold は、意図しない Kubernetes コンポーネントのバージョン更新を避けるために設定します。Kubernetes はコンポーネント間のバージョン関係が重要なので、通常の OS パッケージのように無造作に更新しない方が安全です。

設定を確認する

ここまでの設定が入っているか確認します。

lsmod | grep -E 'overlay|br_netfilter|ip_vs|nf_conntrack'
sysctl net.bridge.bridge-nf-call-iptables
sysctl net.bridge.bridge-nf-call-ip6tables
sysctl net.ipv4.ip_forward
swapon --show
kubelet --version
kubeadm version

swapon --show に何も表示されなければ、swap は無効です。kubelet はクラスターへ参加するまで正常起動しない場合がありますが、パッケージとバージョンが確認できれば事前準備としては進められます。

この段階で完了すること

  • Kubernetes ノードとして必要なカーネルモジュールを読み込める
  • ブリッジ通信と IP forwarding の設定が入っている
  • swap が無効化されている
  • Kubernetes パッケージリポジトリが追加されている
  • kubeletkubeadmkubectl が導入されている

この後は、コンテナランタイムの設定、コントロールプレーンの初期化、CNI の導入、ワーカーノードの参加へ進みます。

まとめ

Kubernetes クラスター構築では、kubeadm init の前に OS 側の前提をそろえることが重要です。カーネルモジュール、sysctl、swap、APT リポジトリ、Kubernetes パッケージの状態が揃っていないと、後続のエラー原因が分かりにくくなります。

この記事の作業は、すべての Kubernetes ノードで共通して実施する準備です。個別のクラスタ構築手順へ進む前に、各ノードが同じ前提に揃っているか確認します。

参考
書籍
参考書籍

Kubernetes完全ガイド 第2版

Kubernetes の仕組み、リソース、ネットワーク、運用観点を体系的に確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。

Amazon で見る

このリンクは Amazon アソシエイトリンクです。

関連記事

Ubuntu 22.04 Kubernetes クラスター構築の事前準備 – kubeadm ノードの前提を整える

コメントを残す

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

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る