すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:Terway を使用する Linux ノードにおける潜在的な CPU 使用率の高さ

最終更新日:Sep 09, 2025

最近の Linux カーネルパッチの拡張 Berkeley Packet Filter(eBPF)プログラムへの影響により、eBPF ベースの DataPath V2 機能(NetworkPolicy を含む)が有効になっている Container Network Interface(CNI)プラグイン Terway を使用しているクラスターでは、ノードで断続的な CPU 使用率の急上昇が発生する可能性があります。

影響範囲

以下のすべての条件を満たす場合、ノードは影響を受けます。

  • オペレーティングシステム: ノードは Alibaba Cloud Linux 3 または ContainerOS を実行しています。

  • カーネルバージョン: カーネルバージョンは 5.10.134-15 から 5.10.134-19.1 の間です(両端を含む)。

  • ネットワーク構成: クラスターは、DataPath V2 モードが有効になっている Terway CNI プラグインを使用しています(このモードは、NetworkPolicy が有効になっている場合、自動的に有効になります)。

解決策

ステップ 1:ノードが影響を受けているかどうかを確認する

クラウドアシスタント を使用して、クラスターノードで次のスクリプトを実行し、修正が必要かどうかを判断します。

診断スクリプト

#!/bin/bash

# スクリプトの機能:
# 1. /sys/fs/bpf/tc/globals/cilium_ct4_global が存在するかどうかを確認します
# 2. カーネルリリースに 'al8' または 'lifsea8' が含まれている場合にのみ続行します
# 3. カーネルバージョンが 5.10.134-15 から 5.10.134-19.1 の範囲内にあるかどうかを確認します(両端を含む)
# 4. kpatch_22519882 モジュールがロードされているかどうかを確認します
# 5. 動作はカーネルタイプによって異なります。
#    - al8:修正を許可する(-y を指定)か、インストールするように促します
#    - lifsea8:インストールしないでください。代わりに、ユーザーに ContainerOS 3.5.1 にアップグレードするように警告します
# 6. その他のカーネル(例:el8)はスキップされます。

set -euo pipefail

# デフォルト:ドライランモード(インストールなし)
INSTALL=false # true に設定すると、修正が自動的に適用されます

# 引数を解析します
while getopts "y" opt; do
  case $opt in
    y)
      INSTALL=true
      ;;
    \?)
      echo "Usage: $0 [-y]" >&2
      exit 1
      ;;
  esac
done


# 確認する重要なパスを定義します(優先順)
declare -a CT4_GLOBAL_PATHS=(
    "/sys/fs/bpf/tc/globals/cilium_ct4_global"
    "/.lifsea/rootfs/sys/fs/bpf/tc/globals/cilium_ct4_global"
)

# 見つかったパスを格納する変数
CT4_GLOBAL_PATH=""

# 各パスを順番に確認します
for path in "${CT4_GLOBAL_PATHS[@]}"; do
    if [[ -e "$path" ]]; then
        CT4_GLOBAL_PATH="$path"
        break
    fi
done

# 有効なパスが見つからない場合は、チェックをスキップします
if [[ -z "$CT4_GLOBAL_PATH" ]]; then
    echo "Warning: None of the expected paths for cilium_ct4_global exist. Skipping check."
    exit 0
fi

echo "Detected $CT4_GLOBAL_PATH, proceeding with kernel version check..."

# 完全なカーネルリリースを取得します
KERNEL_RELEASE=$(uname -r)
echo "Current kernel release: $KERNEL_RELEASE"

# ベースバージョンを抽出します(例:5.10.134-19.1)
if [[ $KERNEL_RELEASE =~ 5\.10\.134-[0-9]+(\.[0-9]+)? ]]; then
    KERNEL_VERSION="${BASH_REMATCH[0]}"
else
    echo "Error: Unable to extract kernel version from $KERNEL_RELEASE" >&2
    exit 1
fi

# カーネルタイプを決定します
if [[ $KERNEL_RELEASE == *"al8"* ]]; then
    KERNEL_TYPE="al8"
elif [[ $KERNEL_RELEASE == *"lifsea8"* ]]; then
    KERNEL_TYPE="lifsea8"
else
    echo "Kernel type not supported (neither al8 nor lifsea8), skipping."
    exit 0
fi

echo "Detected kernel type: $KERNEL_TYPE"

# バージョン範囲を定義します(両端を含む):5.10.134-15 <= version <= 5.10.134-19.1
MIN_VERSION="5.10.134-15"
MAX_VERSION="5.10.134-19.1"

# 自然順ソートを使用したバージョン比較関数
version_ge() {
    [[ "$1" == "$(printf '%s\n' "$1" "$2" | sort -V | tail -n1)" ]]
}

version_le() {
    [[ "$1" == "$(printf '%s\n' "$1" "$2" | sort -V | head -n1)" ]]
}

# バージョン範囲を確認します
if ! version_ge "$KERNEL_VERSION" "$MIN_VERSION"; then
    echo "Kernel version $KERNEL_VERSION is below $MIN_VERSION, skipping."
    exit 0
fi

if ! version_le "$KERNEL_VERSION" "$MAX_VERSION"; then
    echo "Kernel version $KERNEL_VERSION is above $MAX_VERSION, skipping."
    exit 0
fi

echo "Kernel version $KERNEL_VERSION is within range $MIN_VERSION ~ $MAX_VERSION."

# kpatch_22519882 モジュールがロードされているかどうかを確認します
if lsmod | grep "kpatch_22519882" >/dev/null; then
    echo "kpatch_22519882 module is already loaded, no action needed."
    exit 0
fi

# ここに到達した場合、修正プログラムがありません
HOTFIX_PKG="kernel-hotfix-22519882-$KERNEL_VERSION"

case "$KERNEL_TYPE" in
    "al8")
        echo "kpatch_22519882 module is not loaded. Hotfix package '$HOTFIX_PKG' needs to be installed."

        if [[ "$INSTALL" == true ]]; then
            echo "Installing $HOTFIX_PKG..."
            if yum install -y "$HOTFIX_PKG"; then
                echo "Installation successful."
                exit 0
            else
                echo "Installation failed. Please check yum repository or permissions." >&2
                exit 1
            fi
        else
            echo "Running in dry-run mode. Use -y to install the hotfix."
            exit 1
        fi
        ;;
    "lifsea8")
        echo "WARNING: This is a lifsea8 kernel ($KERNEL_RELEASE)." >&2
        echo "The issue cannot be fixed by hotpatch. You must upgrade to ContainerOS 3.5.1 or later." >&2
        echo "See official documentation or contact support for upgrade instructions." >&2
        exit 1
        ;;
esac

結果の解釈

次の出力が返された場合は、操作が必要です。

Alibaba Cloud Linux 3

Detected /sys/fs/bpf/tc/globals/cilium_ct4_global, proceeding with kernel version check...
Current kernel release: 5.10.134-18.al8.x86_64
Detected kernel type: al8
Kernel version 5.10.134-18 is within range 5.10.134-15~5.10.134-19.1.
kpatch_22519882 module is not loaded. Hotfix package 'kernel-hotfix-22519882-5.10.134-18' needs to be installed.
Running in dry-run mode. Use -y to install the hotfix.

ContainerOS

Detected /sys/fs/bpf/tc/globals/cilium_ct4_global, proceeding with kernel version check...
Current kernel release: 5.10.134-18.0.1.lifsea8.x86_64
Detected kernel type: lifsea8
Kernel version 5.10.134-18.0 is within range 5.10.134-15 ~ 5.10.134-19.1.
WARNING: This is a lifsea8 kernel (5.10.134-18.0.1.lifsea8.x86_64).
The issue cannot be fixed by hotpatch. You must upgrade to ContainerOS 3.5.1 or later.
See official documentation or contact support for upgrade instructions.

次のいずれかの出力が返された場合は、操作は必要ありません。

  • ノードで Terway eBPF 機能が有効になっていません。パッチのインストールはスキップされます。

    Path /sys/fs/bpf/tc/globals/cilium_ct4_global does not exist, skipping check.
  • パッチは既にインストールされています。

    ...
    kpatch_22519882 module is already loaded, no actions needed.

ステップ 2:修正を適用する

修正は、オペレーティングシステムによって異なります。

ContainerOS ノード

この問題は ContainerOS バージョン 3.5.1 で解決されます。ContainerOS イメージのリリースノート で更新を監視してください。バージョン 3.5.1 がリリースされたら、ノードを更新してください。アップグレード手順については、「オペレーティングシステムを変更する」をご参照ください。

Alibaba Cloud Linux 3 ノード

新しいノードの場合

新しく作成されたノードにパッチが自動的に適用されるようにするには、ノードプールを作成または編集する 際に、[事前定義されたカスタムデータ] フィールドに次のスクリプトを追加します。

image.png

事前定義されたカスタムデータ

#!/bin/bash

# 関数:check_and_apply_hotfix
# 目的:現在のカーネルバージョンとタイプを確認し、サポートされている範囲内にあるかどうかを検証し、
#          修正プログラムパッケージ(kpatch_22519882)がまだ適用されていない場合はインストールします。
check_and_apply_hotfix() {
    local KERNEL_RELEASE
    local KERNEL_VERSION
    local KERNEL_TYPE
    local MIN_VERSION="5.10.134-15"
    local MAX_VERSION="5.10.134-19.1"
    local HOTFIX_PKG

    # 完全なカーネルリリース文字列を取得します
    KERNEL_RELEASE=$(uname -r)
    echo "Current kernel release: $KERNEL_RELEASE"

    # ベースカーネルバージョンを抽出します(例:5.10.134-19.1)
    if [[ $KERNEL_RELEASE =~ 5\.10\.134-[0-9]+(\.[0-9]+)? ]]; then
        KERNEL_VERSION="${BASH_REMATCH[0]}"
    else
        echo "Error: Unable to extract kernel version from $KERNEL_RELEASE" >&2
        return 1
    fi

    # カーネルタイプ(al8 または lifsea8)を検出します
    if [[ $KERNEL_RELEASE == *"al8"* ]]; then
        KERNEL_TYPE="al8"
    elif [[ $KERNEL_RELEASE == *"lifsea8"* ]]; then
        KERNEL_TYPE="lifsea8"
    else
        echo "Kernel type not supported (neither al8 nor lifsea8), skipping."
        return 0
    fi

    echo "Detected kernel type: $KERNEL_TYPE"

    # 自然(バージョン)ソートを使用したバージョン比較関数
    version_ge() {
        [[ "$1" == "$(printf '%s\n%s' "$1" "$2" | sort -V | tail -n1)" ]]
    }

    version_le() {
        [[ "$1" == "$(printf '%s\n%s' "$1" "$2" | sort -V | head -n1)" ]]
    }

    # カーネルバージョンがサポートされている最小バージョン以上かどうかを確認します
    if ! version_ge "$KERNEL_VERSION" "$MIN_VERSION"; then
        echo "Kernel version $KERNEL_VERSION is below $MIN_VERSION, skipping."
        return 0
    fi

    # カーネルバージョンがサポートされている最大バージョン以下かどうかを確認します
    if ! version_le "$KERNEL_VERSION" "$MAX_VERSION"; then
        echo "Kernel version $KERNEL_VERSION is above $MAX_VERSION, skipping."
        return 0
    fi

    echo "Kernel version $KERNEL_VERSION is within range $MIN_VERSION ~ $MAX_VERSION."

    # kpatch モジュールがすでにロードされているかどうかを確認します
    if lsmod | grep "kpatch_22519882" >/dev/null; then
        echo "kpatch_22519882 module is already loaded, no action needed."
        return 0
    fi

    # モジュールがロードされていない場合は、修正プログラムパッケージ名を準備します
    HOTFIX_PKG="kernel-hotfix-22519882-$KERNEL_VERSION"

    # カーネルタイプに基づいてインストールを処理します
    case "$KERNEL_TYPE" in
        "al8")
            echo "kpatch_22519882 module is not loaded. Hotfix package '$HOTFIX_PKG' needs to be installed."
            echo "Installing $HOTFIX_PKG..."

            if yum install -y "$HOTFIX_PKG"; then
                echo "Installation successful."
                return 0
            else
                echo "Installation failed. Please check yum repository or permissions." >&2
                return 1
            fi
            ;;
        "lifsea8")
            echo "Kernel type 'lifsea8' is recognized but not currently supported for automatic installation."
            return 0
            ;;
        *)
            echo "Unknown kernel type: $KERNEL_TYPE"
            return 1
            ;;
    esac
}

# =====================
# 関数を呼び出します
# =====================
check_and_apply_hotfix
既存のノードの場合

修正するノードで、ECS クラウドアシスタント を介して診断スクリプトを実行します。

ノードの修正

#!/bin/bash

# スクリプトの機能:
# 1. /sys/fs/bpf/tc/globals/cilium_ct4_global が存在するかどうかを確認します
# 2. カーネルリリースに 'al8' または 'lifsea8' が含まれている場合にのみ続行します
# 3. カーネルバージョンが 5.10.134-15 から 5.10.134-19.1 の範囲内にあるかどうかを確認します(両端を含む)
# 4. kpatch_22519882 モジュールがロードされているかどうかを確認します
# 5. 動作はカーネルタイプによって異なります。
#    - al8:修正を許可する(-y を指定)か、インストールするように促します
#    - lifsea8:インストールしないでください。代わりに、ユーザーに ContainerOS 3.5.1 にアップグレードするように警告します
# 6. その他のカーネル(例:el8)はスキップされます。

set -euo pipefail

# デフォルト:ドライランモード(インストールなし)
INSTALL=true

# 引数を解析します
while getopts "y" opt; do
  case $opt in
    y)
      INSTALL=true
      ;;
    \?)
      echo "Usage: $0 [-y]" >&2
      exit 1
      ;;
  esac
done


# 確認する重要なパスを定義します(優先順)
declare -a CT4_GLOBAL_PATHS=(
    "/sys/fs/bpf/tc/globals/cilium_ct4_global"
    "/.lifsea/rootfs/sys/fs/bpf/tc/globals/cilium_ct4_global"
)

# 見つかったパスを格納する変数
CT4_GLOBAL_PATH=""

# 各パスを順番に確認します
for path in "${CT4_GLOBAL_PATHS[@]}"; do
    if [[ -e "$path" ]]; then
        CT4_GLOBAL_PATH="$path"
        break
    fi
done

# 有効なパスが見つからない場合は、チェックをスキップします
if [[ -z "$CT4_GLOBAL_PATH" ]]; then
    echo "Warning: None of the expected paths for cilium_ct4_global exist. Skipping check."
    exit 0
fi

echo "Detected $CT4_GLOBAL_PATH, proceeding with kernel version check..."

# 完全なカーネルリリースを取得します
KERNEL_RELEASE=$(uname -r)
echo "Current kernel release: $KERNEL_RELEASE"

# ベースバージョンを抽出します(例:5.10.134-19.1)
if [[ $KERNEL_RELEASE =~ 5\.10\.134-[0-9]+(\.[0-9]+)? ]]; then
    KERNEL_VERSION="${BASH_REMATCH[0]}"
else
    echo "Error: Unable to extract kernel version from $KERNEL_RELEASE" >&2
    exit 1
fi

# カーネルタイプを決定します
if [[ $KERNEL_RELEASE == *"al8"* ]]; then
    KERNEL_TYPE="al8"
elif [[ $KERNEL_RELEASE == *"lifsea8"* ]]; then
    KERNEL_TYPE="lifsea8"
else
    echo "Kernel type not supported (neither al8 nor lifsea8), skipping."
    exit 0
fi

echo "Detected kernel type: $KERNEL_TYPE"

# バージョン範囲を定義します(両端を含む):5.10.134-15 <= version <= 5.10.134-19.1
MIN_VERSION="5.10.134-15"
MAX_VERSION="5.10.134-19.1"

# 自然順ソートを使用したバージョン比較関数
version_ge() {
    [[ "$1" == "$(printf '%s\n' "$1" "$2" | sort -V | tail -n1)" ]]
}

version_le() {
    [[ "$1" == "$(printf '%s\n' "$1" "$2" | sort -V | head -n1)" ]]
}

# バージョン範囲を確認します
if ! version_ge "$KERNEL_VERSION" "$MIN_VERSION"; then
    echo "Kernel version $KERNEL_VERSION is below $MIN_VERSION, skipping."
    exit 0
fi

if ! version_le "$KERNEL_VERSION" "$MAX_VERSION"; then
    echo "Kernel version $KERNEL_VERSION is above $MAX_VERSION, skipping."
    exit 0
fi

echo "Kernel version $KERNEL_VERSION is within range $MIN_VERSION ~ $MAX_VERSION."

# kpatch_22519882 モジュールがロードされているかどうかを確認します
if lsmod | grep "kpatch_22519882" >/dev/null; then
    echo "kpatch_22519882 module is already loaded, no action needed."
    exit 0
fi

# ここに到達した場合、修正プログラムがありません
HOTFIX_PKG="kernel-hotfix-22519882-$KERNEL_VERSION"

case "$KERNEL_TYPE" in
    "al8")
        echo "kpatch_22519882 module is not loaded. Hotfix package '$HOTFIX_PKG' needs to be installed."

        if [[ "$INSTALL" == true ]]; then
            echo "Installing $HOTFIX_PKG..."
            if yum install -y "$HOTFIX_PKG"; then
                echo "Installation successful."
                exit 0
            else
                echo "Installation failed. Please check yum repository or permissions." >&2
                exit 1
            fi
        else
            echo "Running in dry-run mode. Use -y to install the hotfix."
            exit 1
        fi
        ;;
    "lifsea8")
        echo "WARNING: This is a lifsea8 kernel ($KERNEL_RELEASE)." >&2
        echo "The issue cannot be fixed by hotpatch. You must upgrade to ContainerOS 3.5.1 or later." >&2
        echo "See official documentation or contact support for upgrade instructions." >&2
        exit 1
        ;;
esac

パッチがインストールされていることを示す、予想される出力:

......
Total                                                                                                                                                                                                                                                                                    1.0 MB/s |  52 kB     00:00     
トランザクションチェックを実行中
トランザクションチェックに成功しました。
トランザクションテストを実行中
トランザクションテストに成功しました。
トランザクションを実行中
  準備中:                                                                                                                                                                                                                                                                                                 1/1 
  インストール中: kpatch-dnf-0.9.7_0.4-2.0.1.al8.noarch                                                                                                                                                                                                                                                           1/3 
  スクリプトレットを実行中: kpatch-dnf-0.9.7_0.4-2.0.1.al8.noarch                                                                                                                                                                                                                                                           1/3 
kpatch パッチの自動サブスクリプションを有効にするには、次を実行します:
        $ dnf kpatch auto

  インストール中: kpatch-0.9.7-2.0.1.al8.noarch                                                                                                                                                                                                                                                                   2/3 
  スクリプトレットを実行中: kernel-hotfix-22519882-5.10.134-18-1.0-20250804154834.al8.x86_64                                                                                                                                                                                                                                3/3 
  インストール中: kernel-hotfix-22519882-5.10.134-18-1.0-20250804154834.al8.x86_64                                                                                                                                                                                                                                3/3 
  スクリプトレットを実行中: kernel-hotfix-22519882-5.10.134-18-1.0-20250804154834.al8.x86_64                                                                                                                                                                                                                                3/3 
シンボリックリンク /etc/systemd/system/multi-user.target.wants/kpatch.service → /usr/lib/systemd/system/kpatch.service を作成しました。
/var/khotfix/5.10.134-18.al8.x86_64/22519882/kpatch-22519882.ko (5.10.134-18.al8.x86_64) をインストールしています
パッチモジュールを読み込んでいます: /var/khotfix/5.10.134-18.al8.x86_64/22519882/kpatch-22519882.ko

  検証中: kpatch-0.9.7-2.0.1.al8.noarch                                                                                                                                                                                                                                                                   1/3 
  検証中: kpatch-dnf-0.9.7_0.4-2.0.1.al8.noarch                                                                                                                                                                                                                                                           2/3 
  検証中: kernel-hotfix-22519882-5.10.134-18-1.0-20250804154834.al8.x86_64                                                                                                                                                                                                                                3/3 

インストール済み:
  kernel-hotfix-22519882-5.10.134-18-1.0-20250804154834.al8.x86_64                                                            kpatch-0.9.7-2.0.1.al8.noarch                                                            kpatch-dnf-0.9.7_0.4-2.0.1.al8.noarch                                                           

完了しました!
インストールに成功しました。

参考資料

Alibaba Cloud Linux 3 eBPF プログラムの LRU ハッシュによって引き起こされる CPU 使用率の高さのトラブルシューティング