性能検証
Kubernetesを使ってGPUサーバークラスターを構築してみた
2021.09.15

NTTPC GPUエンジニア

複数人が共同で作業するための大規模AI研究基盤を構築する場合、実行環境をどのように整備していくかは大きな検討ポイントです。
GPUサーバーを1台導入してみたものの、リソースの拡充のため、さらにサーバー台数を増やしたい・・・とスケールアップをお考えの方も多いのではないでしょうか。
今回はそんな方のために、複数台のサーバーのリソース管理・監視をラクに行うため、図1のように、Kubernetesを利用して、Masterサーバー - 2台のNodeサーバーによるクラスターを構築する手法を解説します。商用運用をイメージし、Monitorサーバーでの監視も行います。
※本記事は2021年時点の情報に基づいたものです

図1 Kubernetesを利用したクラスター化
本記事では、Kubernetes、Dockerをひととおり触ったことがある方向けに、GPUサーバーのクラスター化を行うための考え方や留意点、詰まりがちなポイントをお伝えします。みなさまの参考になれば幸いです。
Kubernetesによるクラスター化
通常、複数台のサーバー(ホスト)間でやり取りを行う場合、ネットワークスイッチやルーターを介した通信が必要になります。
しかし、Kubernetesを活用することで、複数台のホストから構成される環境を1かたまりのクラスターとして扱うことができるようになります。クラスター内では、統一的な管理・運用・リソース割り当てを行うことができます。
さらに、クラスター内のサーバースペックが足りなくなった場合は、単にノードを3つ4つと増やしていくだけで簡単に増強が可能です。
Kubernetesを利用して、複数台のGPUサーバーをクラスター化してみましょう!
検証構成
Kubernetesを利用したクラス化には
① Masterサーバー
② Nodeサーバー
が最低限必要となります。今回はより商用に近い環境を想定し、
③ Monitorサーバー
も準備しました。各サーバーの役割は表1の通りです。
表1 各サーバーの役割
Master | ・Kubernetesで管理されるクラスター全体の管理を行う ・クラスターの監視ツールを実行させる |
---|---|
Node | ・Kubernetesで管理されるクラスター全体の管理を行う ・クラスターの監視ツールを実行させる |
Monitor | ・Kubernetesの管理GUIアプリケーションを動作させる ・クラスター監視ツールを実行しにいく ・SSH接続時の踏み台サーバーになる |
検証構成(論理)は図2のとおり。Masterサーバーにはリソース監視ソフトウェアの「Prometheus」、ダッシュボードツールの「Grafana🄬」をインストールし、それぞれMonitorサーバーのブラウザ上から監視できるようにします。
また保守管理のしやすさを考慮し、Monitorサーバーには、Kubernetes の管理コマンドラインツールである kubectl を GUI ベースで操作できるデスクトップアプリ「Lens」を入れています。

図2 論理検証構成
使用ソフトウェア
今回は主に下記のツールを使って監視・可視化を行っています。これでなければならないというわけではないので、ツールの選定はお好みで。
1. Prometheus
Prometheus(プロメテウス)は、もともとSoundCloudのエンジニアが中心となって開発されたリソース監視システムです。監視対象(サーバーだけでなく、ソフトウェアやサービスなどなんでもOK)を設定すると、能動的にアクセスしに行ってデータを引っ張ってくるという「Pull型」の監視アーキテクチャを備えています。
オープンソースの監視システムとしては、ElasticsearchやZabbixが有名どころですが、Prometheusは
- DockerやKubernetesとの連携が深い
- 多種多様なExporter(コンポーネント)によるカスタマイズ性がある
というメリットを持っており、様々な用途で導入がすすんでいます。今回のようなコンテナサービスの監視にはぴったりです。
2. Grafana🄬
Prometheusのデフォルト可視化画面は使い心地がイマイチなので、グラフィカルなダッシュボードを作れる「Grafana🄬」もセットでインストールします。というか、Prometheus OperatorでPrometheusを導入すると、自動的にGrafanaもインストールされます。
Prometheusで取得したデータをWEBGUIで可視化できます。表示させるタイムスケールを変えたり、異常を示している特定のノードだけ拡大表示するなど、リアルタイムに画面表示を操作することも可能なツールです。

図3 Grafana🄬ダッシュボード画面
3. Lens(Kubernetes IDE Lens)
Kubernetesには、コマンドラインツールの「kubectl」を持っていますが、直感的に操作したい方はLensでGUI化しておきましょう。デスクトップアプリでインストールも簡単です。
kubectlと比べても、情報量が削減されることはなく、名前やコンテナ数などの詳細をそのまま表示することができます。

図4 リソースのデプロイ画面

図5 Helmの管理画面
ハードウェアスペック・ソフトウェアバージョン情報
本検証に使用した各ハードウェアのスペックは下記の通りです。ご参考まで。
Master
筐体:Supermicro SYS-1029GQ-TRT
CPU:Intel🄬 Xeon Silver 4214R x2枚
Mem:16GB x12枚(計192GB)
Disk:480GB SSD x2枚
Node
筐体:Supermicro SYS-1029GQ-TRT
GPU:NVIDIA T4 Tensor Core GPU x2枚
CPU:Intel🄬 Xeon Silver 4214R x2枚
Mem:16GB x12枚(計192GB)
Disk:480GB SSD x2枚
Monitor
筐体:Supermicro SYS-1029GQ-TRT
CPU:Intel🄬 Xeon Silver 4214R x2枚
Mem:16GB x12枚(計192GB)
Disk:480GB SSD x2枚
L2SW
Cisco WS-C2960CX-8PC-L
各ソフトウェアのバージョンは次の通りです。いずれも検証実施時(2021年7月)での最新安定版をインストールしています。
Master
Ubuntu20.04 Server
Kubernetes v1.5.2
Docker version 1.12.6, build 88a4867/1.12.6
Prometheus 2.29.2
Grafana 8.1.2
Node
Ubuntu20.04 Server
NvidiaDriver 471.41
Monitor
Ubuntu20.04 Desktop
Lens v5.1.3-latest.20210722.1
ツールインストール
各サーバーにはそれぞれ下記のソフトウェア、ツール群をインストールしていきます。OSやCUDAなどは事前にセットアップ済みとします。
表2 インストールソフトウェア一覧
インストール 対象 |
ソフトウェア | 用途 |
---|---|---|
Master | kubeadm | Kubernetesコマンドラインツール |
kubelet | Kubernetesコンテナの管理(Pod起動、コンテナの作成/削除、リソース割り当て) | |
kubectl | クラスターにアクセスするためのコマンドライン・インターフェース | |
Docker | コンテナ仮想化ツール | |
Helm | Kubernetes向けパッケージマネジャー。Linuxでいうところのyumにあたる | |
Prometheus | リソース監視ソフトウェア | |
Grafana🄬 | ダッシュボードツール | |
Node | kubeadm | Kubernetesコマンドラインツール |
kubelet | Kubernetesコンテナの管理(Pod起動、コンテナの作成/削除、リソース割り当て) | |
kubectl | クラスターにアクセスするためのコマンドライン・インターフェース | |
Docker | コンテナ仮想化ツール | |
NVIDIAドライバ | NVIDIA GPUを利用するためのドライバ。利用するGPUに合わせてインストールする | |
NVIDIA Container Toolkit | DockerコンテナからCUDA経由でGPUが利用できるようになる | |
Monitor | Lens | Kubernetes の管理GUIツール |
1. Masterサーバーへのツールインストール
表2のツール群を順次インストールします。公式ドキュメントにも記載がありますが、インストール時は下記にご注意ください。
<Kubeadmインストール時の注意事項>
- iptablesがブリッジを通過するトラフィックを処理できるようにする
- iptablesがnftablesバックエンドを使用しないようにする
- Swapはオフにしておく
なお、下記のポートは必ず開けておく必要があります。
表3 Masterサーバー 必須ポート
ポート番号 | 使用目的 | 使用者 | 備考 |
---|---|---|---|
6443 | Kubernetes API server | すべて | ポート番号は任意に書き換え可能 |
2379-2380 | etcd server client API | kube-apiserver、etcd | |
10250 | Kubelet API | 自身、コントロールプレーン | |
10251 | kube-scheduler | 自身 | |
10252 | kube-controller-manager | 自身 |
<Prometheusインストール時の注意事項>
煩雑なPrometheusのインストールは、「Prometheus Operator」を入れると簡略化できます。Helmで名前空間をつけてインストールしましょう。Grafanaも勝手にインストールされるので一石二鳥です。
また、同じくHelmにて「DCGM-Exporter」もインストールしておきます。PrometheusでGPUを監視するためのコンポーネントです。
Prometheusのインストール、構成については下記URLもご参照ください。
https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack
https://docs.nvidia.com/datacenter/cloud-native/kubernetes/dcgme2e.html#gpu-telemetry
2. Nodeサーバーへのツールインストール
続いて、Nodeサーバーにも必要なソフトウェアをインストールしていきます。kubeadmをインストールする際の注意事項は「1.Masterサーバーへのツールインストール」を参照ください。
なお、下記のポートは必ず開けておく必要があります。
表4 Nodeサーバー 必須ポート
ポート番号 | 使用目的 | 使用者 | 備考 |
---|---|---|---|
10250 | Kubelet API | 自身、コントロールプレーン | |
30000-32767 | NodePort Service | すべて | NodePort Serviceのデフォルトのポートの範囲 |
また、Dockerインストール時には、Dockerのデフォルトランタイムがnvidia-container-runtimeになっていることをご確認ください。
Kubernetesでは、PodがGPU(NVIDIA or AMD)にアクセスするための専用プラグインが実装されており非常に有用です。詳細は下記を参照ください。
https://kubernetes.io/ja/docs/tasks/manage-gpus/scheduling-gpus/
3. Monitorサーバーへのツールインストール
通常のデスクトップアプリケーションと同じ要領でLensをインストールします。インストール方法やその後の操作手順などを特に解説する必要がないのがLensのいいところですね。
クラスター構築
通常のデスクトップアプリケーションと同じ要領でLensをインストールします。インストール方法やその後の操作手順などを特に解説する必要がないのがLensのいいところですね。。
1. MasterサーバーでKubernetesを実行
- クラスター初期化
コマンド実行時、[kubeadm join ----]を忘れずメモしておきましょう。この後のステップで使います。
$ kubeadm init
- Podネットワークアドオンのインストール
クラスター内での通信を許可します。
ネットワークアドオンは、スタンダードにflannelを使用します。 - kubectlコマンドが実行できるよう、admin.confをコピー
/etc/kubernetes/admin.conf から $HOME/.kube/config にコピーします
2. Nodeサーバー参加
- Node参加
前述のクラスター初期化時にメモしたコマンドを実行します - NVIDIA device plugin for Kubernetes
MasterサーバーでNVIDIA device-pluginを適用します
ここまでの実装で、Kubernetesクラスター上のNodeに、PodをデプロイしてContainerを立ち上げることができます。
参考:https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/
3. MonitorサーバーとMasterサーバーの紐づけ
最後の仕上げとして、Monitorサーバーからクラスターの監視ができるよう、Masterサーバーと紐づけておきましょう。
- クラスターへのアクセス
kubeconfig本体のファイルを登録します(kubectl config viewではないので注意!)
※Masterサーバーにアクセスするイメージです

図6 kubeconfig
構築結果
このように、Kubernetesを利用することで、GPUサーバーのクラスター化を行い、リソース管理・監視ができるようになりました。
今回の構成は、複数のソフトウェアを組み合わせて管理・監視体制を構築しました。それぞれのソフトウェア間で連携するための機能や公式ドキュメントが整備されており、複雑すぎないスタンダードな構成で実現できたと思います。
本記事が、GPUサーバーのクラスタリングを行われる方の参考になれば幸いです。