本コースでは, 学生が課題や演習などで利用できる VM の貸出を行うサービスがある。
Akatsuki
ie-virsh
デフォルトのスペック
GPU の共有に対応していない
PCI パススルーが必要である
そこで新たにコンテナ技術を用いて学生の学習環境を提供するサービスの実装を行った。
コンテナ貸出を行うため, コンテナ仮想化を利用できる Docker と Kubernetes, Singularity を利用する。
Docker
Kubernetes
Singularity
コンテナで学習環境を提供するにあたって以下の用件が必要となる。
他のユーザのコンテナを削除や操作ができない
コンテナで使用するイメージを自由に作成できる
学科サーバに搭載される GPU を利用できる
ファイル共有
他のユーザのコンテナを削除や操作ができなくするために, Web コンソールを用意する。
イメージの作成には, 学科で使用している GitLab の CI/CD 機能を利用する。
GPU を利用するために, NVIDIA Container Toolkit を導入する。
FROM nvidia/cuda:10.0-base
ファイル共有のとして, Singularity を利用する。
--nv
で GPU を利用することも可能となるコンテナ貸出を行うサービスとして以下を実装した。
Web コンソールとして以下の機能を実装した。
Docker の操作には Docker Engine SDKs を使用し, コンテナやイメージの操作に必要な機能を抜き出し実装した。実装した機能は以下である。
GPU を利用する場合, コンテナに割り当てるリソースを宣言する。
resource = container.Resources{
DeviceRequests: []container.DeviceRequest{
{
Driver: "",
Count: -1,
DeviceIDs: []string{},
Capabilities: [][]string{
{
"gpu",
},
},
Options: map[string]string{},
},
},
}
Kubernetes の操作には Kubernetes クラスターと対話するライブラリである client-go を使用し, 必要な機能を抜き出し実装した。
学生ごとの Namespace を作成する。また Role を以下のように定義することで, 学生が手元の PC から自身の Namespace のリソースを操作することができる。
role := &unstructured.Unstructured{
Object: map[string]interface{}{
"apiVersion": "rbac.authorization.k8s.io/v1",
"kind": "Role",
"metadata": map[string]interface{}{
"name": namespace + "-role",
},
"rules": []map[string]interface{}{
{
"apiGroups": []string{"*"},
"resources": []string{"pods", "pods/log", "deployments", "services", "ingresses"},
"verbs": []string{"get", "list", "watch"},
},
{
"apiGroups": []string{""},
"resources": []string{"pods/exec"},
"verbs": []string{"create"},
},
},
},
}
Singularity はマルチユーザに対応しているため, CLI から操作できるようにする。
Web コンソールからコンテナを作成する例である。
コンテナ作成時に GPU を使用するにチェックを入れることで, コンテナから GPU を利用することができる。
Kubernetes で作成したコンテナには, 手元の PC からコンテナの操作を行うことができる。
>>> kube get pods
NAME READY STATUS RESTARTS AGE
e175733-web1-7b88fb4b6b-sdnnb 1/1 Running 0 104s
e175733-web2-6775767cc8-4rmt9 1/1 Running 0 92s
本コースでは VM 貸出サービス以外にコンテナを利用できるサービスもある。
ie-docker
digdog