🐳

GitHub Actionsでcgroup v1を使う

はじめに

3月中にGitHubがGitHub Actionsでのubuntu-20.04のサポートを終了します。 ubuntu-20.04からubuntu-22.04以降のバージョンに移行することで、cgroup v2がデフォルトになります。 それに伴い、コンテナランタイム開発で使われるActionsにおいて、cgroup v1を使う方法を探してみました。

背景

youkiというコンテナランタイムでは、cgroup v1とv2の両方に対応するテストを実行しています。 GitHub Actionsの環境がUbuntu 20.04から24.04にアップグレードされることで、cgroup v2がデフォルトになり、cgroup v1のテストが困難になりました。

これは単にyoukiだけでなく、コンテナ技術に関わる多くのプロジェクトに影響する問題です。後方互換性のテストは重要であり、cgroup v1をテストする方法を見つける必要がありました。

問題点

Ubuntu 22.04以降では、カーネルはcgroup v2を優先的に使用するようになっています。 Ubuntu 20.04ではデフォルトでcgroup v1が使われていました。 しかしながら、GitHub Actionsが22.04や24.04にアップグレードすることで、cgroup v1のテストが難しくなりました。

特に以下の問題が発生しました。

  • cgroup v2とv1ではAPIが異なるため、両方のテストが必要(cgroup v2ではeBPFを使用するため挙動が異なる)
  • 実際の運用環境ではまだcgroup v1を使用しているケースも多い(RHEL8系は2029年までサポート)
  • GitHub Actionsの環境ではカーネルパラメータを変更できない

解決策

この問題を解決するために、LimaAlmaLinux 8を組み合わせたアプローチを採用しました。 AlmaLinux 8はRHEL 8互換のディストリビューションで、デフォルトでcgroup v1を使用しています。

Lima + AlmaLinux 8によるcgroup v1テスト環境

実装の詳細は以下の通りです。

  • GitHub ActionsのUbuntu 24.04ランナー上でLimaを使用してAlmaLinux 8の仮想マシンを起動
  • ゲストVM内にDockerをインストールし、ホストにDockerソケットを転送
  • テストマトリックスに応じて、cgroup v1テスト用にLima VM内のDockerを使用し、cgroup v2テスト用にホストのDockerを使用

このアプローチはcontainerd/nerdctlの実装を参考にしています。nerdctlでも同様の方法でcgroup v1互換テストを実現していました。

実装例

こちらのPRを参考にしてください。

Ubuntu 24.04への移行で発生した他の問題

GitHub ActionsのUbuntu 24.04への移行では、cgroup v1/v2の問題以外にも以下の課題がありました。

1. AppArmorの制限強化

Ubuntu 24.04(Noble Numbat)では、非特権ユーザー名前空間に対するAppArmorの制限が強化されました。 これにより、コンテナのテストが失敗するようになりました。

この問題の解決には一時的にAppArmorの制限を緩和する方法があります。 リリースノートにあるように、 以下のように、GitHub ActionsのジョブでAppArmorの制限を無効化することで、テストを実行できます。

- name: Disable AppArmor restrictions for unprivileged user namespaces
  run: |
    echo 1 | sudo tee /proc/sys/kernel/unprivileged_userns_apparmor_policy

2. cgroup v2 CPUコントローラーの変更

Ubuntu 24.04のcgroup v2 CPUコントローラーの挙動が変更され、以下のテストが失敗するようになりました。

  • test_cpu_period_valid_set
  • test_cpu_weight_too_high_maximum_set

詳しくはこちらのコミットを参照してください。

これらの問題に対応するため、テストコードを修正して新しい挙動に対応しました。これらの変更はLinuxカーネル6.10+の実装に合わせたものです。

まとめ

GitHub ActionsのUbuntu 20.04サポート終了に伴い、cgroup v1のテストを継続する方法として、Lima + AlmaLinux 8を使用する方法が有効だとわかりました。 この方法により、新しいUbuntu 24.04ランナーを使いながらも、cgroup v1のテストを引き続き実行できます。

またUbuntu 24.04への移行に伴い、AppArmorの制限強化やcgroup v2の挙動変更などいくつかの課題に直面しましたが、それぞれ適切な対応策を見つけることができました。

コンテナランタイム周りに関わる方々にとって、この記事が参考になれば幸いです。