手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 22.04 Kubernetes Cilium 導入の事前確認

目次に戻る

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-inm であれば、is enabled as module で出力します。my の違いは、機能が動的にロード可能なモジュールとしてコンパイルされるか、静的にカーネルに組み込まれるかの違いです。

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 ユーザーとして、または特権コンテナとして実行することです。

目次に戻る
Ubuntu 22.04 Kubernetes Cilium 導入の事前確認

コメントを残す

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

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

トップへ戻る