NICの研究開発
MANO基盤の開発
NIC ネットワーク制御ソフトウェアプロジェクト
松井 裕太郎(まつい ゆうたろう)
#MANO#コンテナ基盤
2026/4/23
はじめに
以前の記事にて、ネットワーク制御ソフトウェアプロジェクトで「仮想化制御機能部(MANO[1] 機能)」(以降、MANOと記載します)の開発についてご紹介しました。本開発では、MANOの主要部分である、仮想化基盤のリソース制御や仮想化されたネットワーク機能のライフサイクル制御(以降、MANOオペレーションと記載します)を担う各種機能部をコンテナ化されたアプリケーションとして開発しています。よって、MANOを動作させるためには、それらのコンテナ(以降、MANOアプリコンテナと記載します)を実行するコンテナ基盤が必要となります。本記事では、このコンテナ基盤の開発や、私たちの開発しているコンテナ基盤の概要についてご紹介します。
MANO基盤について
本開発では、MANOアプリコンテナが動作するために共通的に必要となる機能を、コンテナ基盤と併せてMANO基盤として開発します。私たちのMANOは商用サービスで利用することを想定して開発しており、例えば以下のような機能が必要となります。
MANO基盤の役割は、そういったMANOアプリコンテナをデプロイし運用するための機能、および保守者によるログ・システム状態監視の仕組みを提供することです。
NICで開発しているMANOの全体像およびMANO基盤の構成を示すと下図のようになります。
MANO基盤は、Kubernetesベースのコンテナ実行環境に、MANOアプリコンテナの動作やシステム運用に必要な各種機能をデプロイすることで構築されます。デプロイされる機能には以下のようなものがあります。
MANO基盤開発について
開発業務について
MANO基盤開発のミッションは、MANOのシステム要件や事業会社の要件を満たす、MANOアプリコンテナ実行環境を提供することです。コンテナ実行環境やMANO基盤に必要な各種機能を実現するソフトウェアは、市中製品やOSSが存在しており、それらの組み合わせで私たちの求める基盤は実現可能です。そのため、開発規模・コストや開発期間も鑑み、MANO基盤はゼロベースでの開発ではなく、それらを利用して開発しています。このような開発においては、MANO基盤を構成する機能部の構築手順の確立や動作確認検証が業務の多くを占めます。特に、市中製品やOSSは設定方法や依存関係が環境によって異なり、MANO基盤が求める環境へそのまま適用できるとは限りません。したがって、製品やOSSの公式マニュアルに基づきながら、MANO基盤向けの正しい構築手順を整理することや、採用する複数の製品・OSSの組み合わせ・相互作用によって実際にMANO基盤が求める期待動作ができるかどうかの検証が必要となります。
具体的に手順の確立・動作確認検証を行う対象としては、
等が挙げられます。また、それらの組み合わせにより
をMANOアプリコンテナの開発者とも連携しながら確認します。
ただし、それらの組み合わせだけでは全ての要件を満たせませんので、そういった要件を満たすためのMANO基盤独自の開発も必要となります。
MANO基盤に込められた工夫
ここでは、各要件を満たしたり、発生する運用課題へ対処したりするためにMANO基盤開発チームが独自に開発した工夫ポイントを例示します。
開発①コンテナ障害自動復旧
要件や運用課題: 単一機能故障時は自動復旧が求められるが、一部の機能は、ノード故障やネットワーク断等に起因するコンテナ障害発生時に自動で復旧されない
Kubernetesベースのコンテナ実行環境は自動修復機能を兼ね備えており、ノード不接等によりコンテナやそれを動かしているPodが故障した際には、自動的にそれらの再起動や正常なノードへの退避等(まとめてフェイルオーバーと記載します)を行って可用性を確保します。しかし、一部機能のPodについてはフェイルオーバーが自動で行われず、機能の性能劣化や動作停止を引き起こしてしまいます[2] 。具体的にはDBクラスタや監視機能が該当しており、DBクラスタ故障はMANOオペレーションそのものに影響を与えること、監視機能はそれ自体が故障しても監視画面を見ている保守者にはそれが分からず故障を検知できないこと等、クリティカルな影響をこの問題は及ぼしていました。
この問題に対処するため多方面から検討を行った結果、MANO基盤開発チームでは「障害ノードに載っている障害Podを検知して自動削除し、フェイルオーバーを促す仕組み」を開発することで、この問題を解決に導きました。
この問題は既知であり、Kubernetesコミュニティ等でソリューションが提案されています。そのソリューションは例えばコンテナ基盤に新たなOperatorを導入することですが、Operatorの導入にはMANO基盤の設計や試験の見直し、影響範囲の再調査が必要となります。我々の開発した仕組みは一定時間毎に数行のスクリプトを走らせるだけであり、コンピュートリソースの消費が軽微であることや、この仕組みを導入しても定常的な背景負荷を発生させないことといった利点があり、MANO基盤に適した開発であると考えています。
開発②PVデータ削除済領域解放
要件や運用課題: PVのドライブ上の使用領域が単調増加し続け、最終的に設定した容量上限に達してデータが書き込めなくなる
MANO基盤では、外部ストレージをシンプロビジョニングしてPV用途に利用しています。通常、ストレージ上でデータを削除するとそのデータサイズ分の空き容量が増え、他のデータを書き込めるようになります。しかし、シンプロビジョニングされたストレージでは以下のような挙動となります。
結果として、コンテナ側ではPV容量を使い切らないような実装(ログローテーション等)がされていても、ストレージ側ではディスク領域を消費し続け、いずれはディスクフルとなってPVへのデータ書込ができなくなってしまいます。
この問題の解決にはspace reclamation(空き領域回収)が必要となります。これは、ファイルシステムにて不要になった領域をストレージに返却し、ストレージ側でその領域を回収する仕組みです。これによってPod内で再利用されない領域を抱え続けることがなくなり、またストレージ側でも回収されたディスク領域分、PVの使用量が下がったと認識することができます。
MANO基盤開発においては、このspace reclamationを、Kubernetesを構成するノード上でPVの実体に対してMANOオペレーションの閑散時間帯に実行するというアプローチをベースに機能を開発し、この問題を解決しました。
このspace reclamationが必要となる問題自体も既知であり、様々なアプローチが提案されています。例えば、PVの構成設定でspace reclamationが自動・即時に行われるファイルシステムを採用したり、space reclamationを実行するKubernetesのカスタムリソースを適用したりすることが挙げられます。しかし、前者ではIO性能への影響が懸念される[4] 、後者は利用するストレージ製品に依存性がある、といった制約があり、それらと比較すると本開発のアプローチは製品を選ばず、MANOオペレーションへの性能影響を最小限に収めているという点で優位な実装であると考えています。
MANO基盤開発チームについて
以前の記事で紹介している通り、MANOの開発はその工程において複数のサブシステム単位のチームを編成しています。MANO基盤については、それ自体を一つのサブシステムとし、一つの開発チーム(MANO基盤開発チーム)で開発を行っています。
「MANO基盤開発」の章に記載した通り、MANO基盤を構成する機能は多種多様です。それを一つの開発チームで開発していくことから、MANO基盤開発チームでは技術ドメインベースでさらに小さな(2~4名程度の)グループ分けを行っています。例えば
といったグループ分けです。このグループ分けにより、以下のようなメリットを得ることができ、開発品質の向上に役立っています。
また、新規にプロジェクトへ参加したチームメンバに関しては、いくつかの開発をグループの有識者とペアプログラミングによって進めることで、開発業務の理解や実務知識の習得等の早期実現を図っています。
おわりに
本記事では、MANOアプリコンテナを実行するMANO基盤の概要と、MANO基盤開発チームが進めている開発内容についてご紹介しました。本記事を通じて、MANOのような大規模システムにおける基盤部分の開発やNICで取り組んでいるプロダクト開発について、興味を持っていただけましたら幸いです。
また、開発対象のMANOの詳細な技術については、技術ジャーナルの記事もご覧ください[5] 。
脚注(用語解説)
[1] Management and Orchestration:ネットワーク仮想化において、ネットワークサービスやリソースを統合的に管理・制御・最適化する機能
[2] KubernetesにおけるStatefulSetや、同様にステートフルな管理が要求される一部のカスタムリソースがこのような挙動となる
[3] MANO基盤におけるStorageClassで指定しているext4やxfsの挙動によるもの。データ削除によって生まれた断片化された領域ではなく、連続した新しい領域へ優先してデータ書込を行う。通常のストレージであれば、そのような断片化はデフラグを行って解消するが、シンプロビジョニング環境でデフラグを行うと、データの再配置によって確保済領域外の未割り当てブロックを確保・消費してしまい、「必要な分だけストレージを使う」というメリットを得られない。また、ストレージへのIO増加によるパフォーマンス劣化を引き起こす可能性があることからデフラグは推奨されない
[4] space reclamation自体はストレージに対する比較的重めの処理であり、MANO基盤にて閑散時間帯に実行するようにしたのもそのため
参考文献
関連するプロジェクト
プロジェクト一覧へ採用情報
採用情報
