Contents
Overview
Kubernetes をインストールします。本稿ではクラスター構築直前の状態まで設定します。クラスター構築の手順はこちらを参照して下さい。
前提条件
- こちらを参考に基本設定が完了していること。
- Kubernetes のバージョンは v1.29 を前提としています。
- IPVS モードを前提としています。
- この手順は、master, worker を含む全ての Kubernetes ノードで実行します。
カーネルモジュール
/etc/modules-load.d/k8s.conf
を作成します。
myadmin@ubuntu-22-04:~$ sudo tee /etc/modules-load.d/k8s.conf <<"EOF"
overlay
br_netfilter
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4
nf_conntrack_ipv6
EOF
overlay
: OverlayFS と呼ばれるファイルシステムのモジュールで、複数のディレクトリツリーを単一のディレクトリツリーとしてマウントすることができます。Kubernetes では、Pod の各コンテナが共通のファイルシステムビューを持つために OverlayFS を使用します。br_netfilter
: このモジュールを有効にすると、ブリッジに接続されたインターフェースを通じて行われる通信に対して、ネットワークパケットフィルタリング (Netfilter) が行われます。これは、Kubernetes のネットワークポリシーを適用するのに役立ちます。ip_vs
: ip_vs (IP Virtual Server) は、Linux の IPVS (IP Virtual Server) サービスを提供するモジュールです。IPVS は、Linux Virtual Server プロジェクトの一部であり、負荷分散(ロードバランシング)を実現するための技術です。IPVS は、TCP や UDP プロトコルを使用するサービスに対して仮想サーバーを提供し、複数のリアルサーバーにリクエストを分散します。ip_vs_rr
: ip_vs_rr (IP Virtual Server Round-Robin scheduling) は、IPVS のスケジューリングモジュールの一つで、ラウンドロビン方式の負荷分散を実現します。ラウンドロビン方式は、受信したリクエストを順番にリアルサーバーに割り当てるシンプルなスケジューリングアルゴリズムです。均等にリクエストを分散させるために使用されます。ip_vs_wrr
: ip_vs_wrr (IP Virtual Server Weighted Round-Robin scheduling) は、IPVS のスケジューリングモジュールの一つで、加重ラウンドロビン方式の負荷分散を実現します。加重ラウンドロビン方式は、リアルサーバーごとに異なる重みを設定し、重みに応じてリクエストを割り当てるアルゴリズムです。リアルサーバの処理能力に応じた負荷分散を行うために使用されます。ip_vs_sh
: ip_vs_sh (IP Virtual Server Source Hashing scheduling) は、IPVS のスケジューリングモジュールの一つで、ソースハッシュ方式の負荷分散を実現します。ソースハッシュ方式は、クライアントの IP アドレスを元にハッシュ値を計算し、そのハッシュ値に基づいて特定のリアルサーバーにリクエストを割り当てます。同じクライアントからのリクエストは常に同じリアルサーバに送られるため、セッションの一貫性が保たれます。nf_conntrack_ipv4
: nf_conntrack_ipv4 (Netfilter connection tracking for IPv4) は、IPv4 パケットの接続追跡を行うためのモジュールです。Netfilter フレームワークの一部であり、パケットフィルタリングや NAT (Network Address Translation) などの機能を提供します。接続追跡により、状態に基づくパケット処理が可能になります。nf_conntrack_ipv6
: nf_conntrack_ipv6 (Netfilter connection tracking for IPv6) は、IPv6 パケットの接続追跡を行うためのモジュールです。IPv4 用の nf_conntrack_ipv4 モジュールと同様に、Netfilter フレームワークの一部であり、パケットフィルタリングや NAT などの機能を提供します。IPv6 環境での接続追跡を実現します。
システムを再起動せずに反映するには以下を実行します。
myadmin@ubuntu-22-04:~$ sudo modprobe overlay br_netfilter ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack_ipv4 nf_conntrack_ipv6
以下のように有効性を確認します。
myadmin@ubuntu-22-04:~$ lsmod | grep -E 'overlay|br_netfilter|ip_vs|ip_vs_rr|ip_vs_wrr|ip_vs_sh|nf_conntrack_ipv4|nf_conntrack_ipv6'
カーネルパラメータ
/etc/sysctl.d/90-k8s.conf
を作成します。
myadmin@ubuntu-22-04:~$ sudo tee /etc/sysctl.d/90-k8s.conf <<"EOF"
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.conf.all.forwarding = 1
net.ipv6.conf.all.forwarding = 1
net.ipv4.conf.default.forwarding = 1
net.ipv6.conf.default.forwarding = 1
EOF
net.bridge.bridge-nf-call-iptables = 1
: Linux ブリッジを通過するトラフィックに対して iptables のルールが適用されるようにします。これは、Kubernetes のネットワークポリシーを適用する際に重要です。net.bridge.bridge-nf-call-ip6tables = 1
の説明も同じです。net.ipv4.conf.all.forwarding = 1
: 全てのインターフェイスでフォワーディングを有効にします。これにより、異なるネットワーク間のトラフィックをルーティングできるようになります。net.ipv6.conf.all.forwarding = 1
の説明も同じです。net.ipv4.conf.default.forwarding = 1
: 新規に作成されるインターフェイスでフォワーディングを有効にします。Kubernetes では Pod が頻繁に作成されるため、デフォルト値として設定しておく方が良いと思います。net.ipv6.conf.default.forwarding = 1
の説明も同じです。- 補足事項として、公式サイトでは
net.ipv4.ip_forward = 1
と設定されていますが、IPv6 ではnet.ipv6.ip_forward = 1
が存在せず、net.ipv6.conf.all.forwarding = 1
を指定する必要があります。本稿では IPv4/IPv6 の書式の一貫性を合わせています。
システムを再起動せずに反映するには以下を実行します。
myadmin@ubuntu-22-04:~$ sudo sysctl --system
上記を実行すると以下が出力(一部抜粋)されます。Invalid argument
の部分が気になりますが、最新のカーネルでは、net.ipv4.conf.all.accept_source_route
, net.ipv4.conf.all.promote_secondaries
は廃止されている可能性があり、無視して良いと思います。気になるようなら、/usr/lib/sysctl.d/50-default.conf
を編集してコメントアウトしても良いと思います。
* Applying /usr/lib/sysctl.d/50-default.conf ...
kernel.core_uses_pid = 1
net.ipv4.conf.default.rp_filter = 2
net.ipv4.conf.default.accept_source_route = 0
sysctl: setting key "net.ipv4.conf.all.accept_source_route": Invalid argument
net.ipv4.conf.default.promote_secondaries = 1
sysctl: setting key "net.ipv4.conf.all.promote_secondaries": Invalid argument
net.ipv4.ping_group_range = 0 2147483647
net.core.default_qdisc = fq_codel
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
fs.protected_regular = 1
fs.protected_fifos = 1
以下のように有効性を確認します。
myadmin@ubuntu-22-04:~$ sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.conf.all.forwarding net.ipv6.conf.all.forwarding net.ipv4.conf.default.forwarding net.ipv6.conf.default.forwarding
SWAP の無効化
SWAP を無効化します。
myadmin@ubuntu-22-04:~$ sudo sed -i'.orig' '/^\/swap\.img/d' /etc/fstab
-i'.orig'
: このオプションはファイルを直接編集し(インプレース編集)、元のファイルのバックアップを.orig
という拡張子で保存します。この例では、/etc/fstab
のバックアップは/etc/fstab.orig
として保存されます。'/^\/swap.img/d'
: このパターンは/swap.img
で始まる行を探し、見つかったらその行を削除(d コマンド)します。^
は行の開始を表すため、このパターンは/swap.img
から始まる行にのみマッチします。
上記の設定は、システムを再起動すると有効になりますが、即座に SWAP を無効化するには、以下のコマンドを実行します。この swapoff -a
コマンドは、現在システムによって使用されているすべてのスワップ領域を即座に無効にします。
myadmin@ubuntu-22-04:~$ sudo swapoff -a
設定の有効化
システムを再起動し、ここまでの設定(カーネルモジュール、カーネルパラメータ、SWAP の無効化)をまとめて有効化します。
myadmin@ubuntu-22-04:~$ sudo systemctl reboot
Kubernetes 用 リポジトリ
Kubernetes の APT リポジトリ用の公開鍵ファイル Release.key
をダウンロードし、/etc/apt/keyrings/Release.key
として保存します。
myadmin@ubuntu-22-04:~$ sudo curl -fsSL -o /etc/apt/keyrings/Release.key "https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key"
-f
: フェイルサイレント(サーバーエラー時に非ゼロのステータスで終了)。-s
: サイレントモード(プログレスメーターまたはエラーメッセージが表示されない)。-S
: エラーメッセージを表示する(-s
と組み合わせることで、正常時は何も表示せず、エラー時のみエラーメッセージを表示)。-L
: HTTP リダイレクトに追従する。-o /etc/apt/keyrings/Release.key
: ダウンロードしたファイルの保存先とファイル名を指定。
APT (Advanced Package Tool) が使用する形式に公開鍵ファイルを変換し、APT の keyrings に追加します。これにより、APT は Kubernetes 用リポジトリの署名を検証できるようになり、そのリポジトリからのパッケージの安全性が保証されます。
myadmin@ubuntu-22-04:~$ sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg /etc/apt/keyrings/Release.key
gpg
: GPG (GNU Privacy Guard) のコマンドラインインターフェイス。暗号化、署名、鍵管理などの機能を提供します。--dearmor
: ASCII 形式でエンコードされたデータをバイナリ形式に変換します。通常、公開鍵は人が読めるテキスト形式で配布されますが、このオプションを使うとプログラムが扱いやすいバイナリ形式に戻すことができます。-o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
: 出力ファイルのパスと名前を指定します。/etc/apt/keyrings/Release.key
: 入力ファイルのパスと名前です。このファイルは前述でダウンロードした公開鍵ファイルです。
Kubernetes 用 リポジトリ設定を追加します。
myadmin@ubuntu-22-04:~$ sudo tee /etc/apt/sources.list.d/kubernetes.list <<"EOF"
deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /
EOF
パッケージリストを更新します。
myadmin@ubuntu-22-04:~$ sudo apt update
kubelet, kubeadm のインストール
コアコンポーネントである kubelet
, kubeadm
をインストールします。kubectl
は、本稿の環境では snap でインストールしているため、ここには含めていません。
myadmin@ubuntu-22-04:~$ sudo apt -y -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--force-confold install kubelet kubeadm