Contents
Overview
Kubernetes の CNI (Container Network Interface) として Cilium を導入するため、Ubuntu 22.04を前提として公式サイトのシステム要件を確認します。Cilium は、eBPF (extended Berkeley Packet Filter) という先進的な技術に基づいた CNI であり、ホストのカーネルと緊密に連携して動作します。そのため、システム要件を正確に確認することが重要です。
前提条件
- こちらを参考に基本設定が完了していること。
- Kubernetes のバージョンは v1.30 を前提としています。
- 本稿では、Ubuntu 22.04 への導入を前提としており、Flatcar, Raspberry Pi の考慮は除外しています。
- clang+LLVM の考慮は除外しています。clang+LLVM は eBPF コードのコンパイルに必要となるツールです。コンテナには含まれていますが、ネイティブにインストールする場合は clang+LLVM のインストールが必要となります。
- ファイアウォールルールに関する制約事項は公式サイトを参照して下さい。
アーキテクチャ
Cilium は 以下のアーキテクチャをサポートしています。
- AMD64
- AArch64 (ARM64)
Linux ディストリビューションとの互換性
Cilium は Ubuntu 18.04.3 以上と互換性があります(ユーザーのフィードバックに基づく)。本稿の環境では Ubuntu 22.04 を使用しています。
Linux カーネル
基本要件
Cilium は、カーネルの eBPF 機能およびそれと統合するサブシステムを活用します。そのため、Cilium エージェントを実行するには最新の Linux カーネルが必要です。最新のカーネルでは、Cilium が自動的に検出して使用する追加の eBPF 機能が提供される場合があります。カーネルバージョンは、4.19.57 以降の使用が推奨されます。
まず、uname
コマンドを実行してカーネルバージョンを確認します。-r
はカーネルのリリースバージョン(以下の例における 5.15.0-107-generic
)、-v
はカーネルのバージョン情報(カーネルのビルド日時やその他のバージョン情報を含む詳細情報)を表示します。
myadmin@ubuntu-22-04:~$ uname -rv
カーネルバージョンは 5.15.0
です。
5.15.0-107-generic #117-Ubuntu SMP Mon Apr 29 14:37:09 UTC 2024
eBPF 機能を正しく有効にするために、以下のカーネル設定オプションが必要です。
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
CONFIG_NET_CLS_BPF=y
CONFIG_BPF_JIT=y
CONFIG_NET_CLS_ACT=y
CONFIG_NET_SCH_INGRESS=y
CONFIG_CRYPTO_SHA1=y
CONFIG_CRYPTO_USER_API_HASH=y
CONFIG_CGROUPS=y
CONFIG_CGROUP_BPF=y
CONFIG_PERF_EVENTS=y
CONFIG_SCHEDSTATS=y
Iptables-based Masquerading
BPF を使用せずに IP マスカレードを行う(デフォルト設定)を使用する場合は、これらのモジュールが必要です。Ciliumのデフォルト値は enable-bpf-masquerade=false
です。本稿では、iptables を使用せずに BPF を使用する想定なので、この項目は無視します。
CONFIG_NETFILTER_XT_SET=m
CONFIG_IP_SET=m
CONFIG_IP_SET_HASH_IP=m
L7 and FQDN Policies
L7 プロキシリダイレクションと FQDN ポリシーを使用する場合、以下のカーネル設定が必要です。
CONFIG_NETFILTER_XT_TARGET_TPROXY=m
CONFIG_NETFILTER_XT_TARGET_CT=m
CONFIG_NETFILTER_XT_MATCH_MARK=m
CONFIG_NETFILTER_XT_MATCH_SOCKET=m
IPsec
IPsec の透過的な暗号化機能を使用する場合、以下のカーネル設定が必要です。{,6}
は、INET, INET6 に置き換えて確認が必要です。
CONFIG_XFRM=y
CONFIG_XFRM_OFFLOAD=y
CONFIG_XFRM_STATISTICS=y
CONFIG_XFRM_ALGO=m
CONFIG_XFRM_USER=m
CONFIG_INET{,6}_ESP=m
CONFIG_INET{,6}_IPCOMP=m
CONFIG_INET{,6}_XFRM_TUNNEL=m
CONFIG_INET{,6}_TUNNEL=m
CONFIG_INET_XFRM_MODE_TUNNEL=m
CONFIG_CRYPTO_AEAD=m
CONFIG_CRYPTO_AEAD2=m
CONFIG_CRYPTO_GCM=m
CONFIG_CRYPTO_SEQIV=m
CONFIG_CRYPTO_CBC=m
CONFIG_CRYPTO_HMAC=m
CONFIG_CRYPTO_SHA256=m
CONFIG_CRYPTO_AES=m
Bandwidth Manager
帯域幅管理機能を使用する場合、以下のカーネル設定が必要です。
CONFIG_NET_SCH_FQ=m
カーネルモジュールの確認
各カーネルモジュールを簡単なスクリプトを作成して確認します。このスクリプトは、上記の設定をチェックし、y
であれば is enabled as built-in
、m
であれば、is enabled as module
で出力します。m
と y
の違いは、機能が動的にロード可能なモジュールとしてコンパイルされるか、静的にカーネルに組み込まれるかの違いです。
myadmin@ubuntu-22-04:~$ tee check_kernel_settings.sh << 'EOF'
#!/bin/bash
# カーネル設定を確認する設定リスト
basic_settings=(
CONFIG_BPF
CONFIG_BPF_SYSCALL
CONFIG_NET_CLS_BPF
CONFIG_BPF_JIT
CONFIG_NET_CLS_ACT
CONFIG_NET_SCH_INGRESS
CONFIG_CRYPTO_SHA1
CONFIG_CRYPTO_USER_API_HASH
CONFIG_CGROUPS
CONFIG_CGROUP_BPF
CONFIG_PERF_EVENTS
CONFIG_SCHEDSTATS
)
iptables_masquerading_settings=(
CONFIG_NETFILTER_XT_SET
CONFIG_IP_SET
CONFIG_IP_SET_HASH_IP
)
l7_fqdn_policies_settings=(
CONFIG_NETFILTER_XT_TARGET_TPROXY
CONFIG_NETFILTER_XT_TARGET_CT
CONFIG_NETFILTER_XT_MATCH_MARK
CONFIG_NETFILTER_XT_MATCH_SOCKET
)
ipsec_settings=(
CONFIG_XFRM
CONFIG_XFRM_OFFLOAD
CONFIG_XFRM_STATISTICS
CONFIG_XFRM_ALGO
CONFIG_XFRM_USER
CONFIG_INET_ESP
CONFIG_INET6_ESP
CONFIG_INET_IPCOMP
CONFIG_INET6_IPCOMP
CONFIG_INET_XFRM_TUNNEL
CONFIG_INET6_XFRM_TUNNEL
CONFIG_INET6_TUNNEL
CONFIG_INET_XFRM_MODE_TUNNEL
CONFIG_CRYPTO_AEAD
CONFIG_CRYPTO_AEAD2
CONFIG_CRYPTO_GCM
CONFIG_CRYPTO_SEQIV
CONFIG_CRYPTO_CBC
CONFIG_CRYPTO_HMAC
CONFIG_CRYPTO_SHA256
CONFIG_CRYPTO_AES
)
bandwidth_manager_settings=(
CONFIG_NET_SCH_FQ
)
# カーネルバージョンを取得
kernel_version=$(uname -r)
# 設定ファイルのパス
config_file="/boot/config-$kernel_version"
# 設定の確認関数
check_settings() {
local settings=("$@")
local category=$1
shift
echo "$category settings:"
for setting in "$@"; do
if grep -q "$setting=y" "$config_file"; then
echo " $setting is enabled as built-in"
elif grep -q "$setting=m" "$config_file"; then
echo " $setting is enabled as module"
else
echo " $setting is not enabled or not present"
fi
done
echo
}
# 各カテゴリの設定を確認
check_settings "Basic" "${basic_settings[@]}"
check_settings "Iptables-based Masquerading" "${iptables_masquerading_settings[@]}"
check_settings "L7 and FQDN Policies" "${l7_fqdn_policies_settings[@]}"
check_settings "IPsec" "${ipsec_settings[@]}"
check_settings "Bandwidth Manager" "${bandwidth_manager_settings[@]}"
EOF
スクリプトに実行権限を付与します。
myadmin@ubuntu-22-04:~$ chmod +x check_kernel_settings.sh
スクリプトを実行します。
myadmin@ubuntu-22-04:~$ ./check_kernel_settings.sh
本稿の環境では以下のようになりました。IPsec の CONFIG_INET_XFRM_MODE_TUNNEL
だけが存在しないようです。今回、IPsec の使用は想定していないので、一旦無視することにします。
Basic settings:
CONFIG_BPF is enabled as built-in
CONFIG_BPF_SYSCALL is enabled as built-in
CONFIG_NET_CLS_BPF is enabled as module
CONFIG_BPF_JIT is enabled as built-in
CONFIG_NET_CLS_ACT is enabled as built-in
CONFIG_NET_SCH_INGRESS is enabled as module
CONFIG_CRYPTO_SHA1 is enabled as built-in
CONFIG_CRYPTO_USER_API_HASH is enabled as module
CONFIG_CGROUPS is enabled as built-in
CONFIG_CGROUP_BPF is enabled as built-in
CONFIG_PERF_EVENTS is enabled as built-in
CONFIG_SCHEDSTATS is enabled as built-in
Iptables-based Masquerading settings:
CONFIG_NETFILTER_XT_SET is enabled as module
CONFIG_IP_SET is enabled as module
CONFIG_IP_SET_HASH_IP is enabled as module
L7 and FQDN Policies settings:
CONFIG_NETFILTER_XT_TARGET_TPROXY is enabled as module
CONFIG_NETFILTER_XT_TARGET_CT is enabled as module
CONFIG_NETFILTER_XT_MATCH_MARK is enabled as module
CONFIG_NETFILTER_XT_MATCH_SOCKET is enabled as module
IPsec settings:
CONFIG_XFRM is enabled as built-in
CONFIG_XFRM_OFFLOAD is enabled as built-in
CONFIG_XFRM_STATISTICS is enabled as built-in
CONFIG_XFRM_ALGO is enabled as module
CONFIG_XFRM_USER is enabled as module
CONFIG_INET_ESP is enabled as module
CONFIG_INET6_ESP is enabled as module
CONFIG_INET_IPCOMP is enabled as module
CONFIG_INET6_IPCOMP is enabled as module
CONFIG_INET_XFRM_TUNNEL is enabled as module
CONFIG_INET6_XFRM_TUNNEL is enabled as module
CONFIG_INET6_TUNNEL is enabled as module
CONFIG_INET_XFRM_MODE_TUNNEL is not enabled or not present
CONFIG_CRYPTO_AEAD is enabled as built-in
CONFIG_CRYPTO_AEAD2 is enabled as built-in
CONFIG_CRYPTO_GCM is enabled as built-in
CONFIG_CRYPTO_SEQIV is enabled as built-in
CONFIG_CRYPTO_CBC is enabled as built-in
CONFIG_CRYPTO_HMAC is enabled as built-in
CONFIG_CRYPTO_SHA256 is enabled as built-in
CONFIG_CRYPTO_AES is enabled as built-in
Bandwidth Manager settings:
CONFIG_NET_SCH_FQ is enabled as module
高度な機能に必要なカーネルバージョン
Cilium のいくつかの機能は、新しいカーネルバージョンに依存しており、これらの機能を使用するには以下のカーネルバージョンが必要です。本稿のカーネルバージョンは 5.15 となり、IPv4/IPv6 BIG TCP サポートのみ非対応となっています。
Cilium 機能 | 必要なカーネルバージョン | 5.15 |
---|---|---|
帯域幅管理 (Bandwidth Manager) | >= 5.1 | ○ |
Egress Gateway | >= 5.2 | ○ |
VXLAN トンネルエンドポイント (VTEP) 統合 | >= 5.2 | ○ |
WireGuard 透過的暗号化 | >= 5.6 | ○ |
セッションアフィニティの完全サポート | >= 5.7 | ○ |
BPF ベースのプロキシリダイレクション | >= 5.7 | ○ |
Pod ネットワーク名前空間におけるソケットレベルのロードバランサーバイパス | >= 5.7 | ○ |
L3 デバイス | >= 5.8 | ○ |
BPF ベースのホストルーティング | >= 5.10 | ○ |
IPv6 BIG TCP サポート | >= 5.19 | × |
IPv4 BIG TCP サポート | >= 6.3 | × |
キー・バリュー・ストア
Cilium は、オプションで、セキュリティアイデンティティを管理、同期、配布するために分散型キー・バリュー・ストアを使用します。現在サポートされているキー・バリュー・ストアは以下の通りです。
- etcd >= 3.1.0
Ciliumは、Kubernetes の CRD ベースの状態管理を使用する場合、キー・バリュー・ストアなしで使用できます。これは新しい Cilium インストールのデフォルト設定です。ただし、大規模なクラスターでは、キー・バリュー・ストアによるアイデンティティ管理の方がパフォーマンスが向上します。
Kubernetes v1.30 の etcd のバージョンは、v3.5.11 が使用されているようです。
eBPF ファイルシステムのマウント
一部のディストリビューションでは、eBPF ファイルシステムが自動的にマウントされます。以下のコマンドでマウント状況を確認できます。
myadmin@ubuntu-22-04:~$ mount | grep /sys/fs/bpf
最新の Ubuntu 22.04 では以下のように出力されており、マウントされていることが確認できます。
bpf on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,relatime,mode=700)
マウントされていない場合、Cilium が自動的にマウントします。
eBPF ファイルシステムをマウントすることで、cilium-agent が再起動やアップグレード時に eBPF リソースを保持でき、データパスの継続的な動作が可能になります。
事前に手動でマウントする場合、以下のコマンドを実行します。
myadmin@ubuntu-22-04:~$ mount bpffs /sys/fs/bpf -t bpf
永続的にマウントするには、/etc/fstab
に以下の行を追加し、mount /sys/fs/bpf
コマンドを実行します。
bpffs /sys/fs/bpf bpf defaults 0 0
systemd を使用して kubelet を管理している場合は、systemd でのマウント方法も参照してください。
必要な権限
Cilium を実行するために必要な権限は以下の通りです。標準の Kubernetes DaemonSet で実行する場合、これらの権限は自動的に付与されます。
- CAP_SYS_ADMIN 権限: Cilium は、Linux カーネルと連携して eBPF プログラムをインストールし、ネットワークタスクとセキュリティルールを実行するため、この権限が必要です。cilium-agent にこの権限を付与する必要があります。
- ホストネットワークネームスペースへのアクセス: このため、Cilium ポッドはホストネットワークネームスペースで直接実行されます。
最も簡単な方法は、cilium-agent を root ユーザーとして、または特権コンテナとして実行することです。
目次に戻る