view slide/slide.md @ 29:01e61c619a1b

update slide
author Ken Miyahira <e175733@ie.u-ryukyu.ac.jp>
date Tue, 01 Sep 2020 15:23:40 +0900
parents 1c5b6f768ae2
children 17d034fa49be
line wrap: on
line source

---
marp: false
title: 情報工学科演習用のコンテナ技術を用いた新規サービスの設計・実装
paginate: true

theme: default
size: 16:9
style: |
  section {
    background-color: #FFFFFF;
    font-size: 28px;
  }

---

# <!--fit--> 情報工学科演習用のコンテナ技術を用いた新規サービスの設計・実装

- 宮平 賢
    - 琉球大学工学部工学科知能情報コース
- 河野 真治
    - 琉球大学工学部

---

# 研究目的

- 情報技術の普及に伴い情報系の学生が課題や演習を行う学習環境が必要である
- 学習環境として VM や コンテナがあるが, 使用には高性能 PC が必要となる
    - 並列処理で GPU の使用など
- 近年ではクラウドサービスが普及しているが, 制限があったり有料だったりする
- オンプレミス環境で学生が利用できる学習環境を提供したい

---

# 本コースで利用しているサービス

本コースでは, 学生が課題や演習などで利用できる VM の貸出を行うサービスがある。

- Akatsuki
    - Web コンソールから VM の作成などができる
    - 利用には申請が必要

- ie-virsh
    - virsh をラップし, CLI で操作できる
    - 手元の PC で作成した VM を移行できる

---

# 本コースで利用しているサービス

VM 貸出サービスはどちらも libvirt と virsh の機能を用いて実装されている。

- libvirt
    - 仮想マシンの制御を抽象化したライブラリ
    - KVM や VMWare, Xen など多くのハイパーバイザに対応している

- virsh
    - libvirt にある CLI ツール
    - libvirt がアクセスできるハイパーバイザを操作できる

---

# 本コースで利用しているサービス

- デフォルトのスペック
    - CPU 1コア
    - メモリ 1GB
    - ディスク 10GB

- GPU の使用に対応していない
- PCI パススルーが必要である
    - VM 1つに 1台の GPU が必要となる

そこで新たにコンテナ技術を用いて学生の学習環境を提供するサービスの実装を行った。

---

# 新規サービスの設計

コンテナ貸出を行うため, コンテナ仮想化を利用できる Docker と Kubernetes, Singularity を利用する。

- Docker
    - OS レベルの仮想化技術を利用して, ソフトウェアをコンテナと呼ばれるパッケージで提供する。

- Kubernetes
    - アプリケーションのデプロイ, スケーリング, 及び管理を用意にするためのコンテナを動的管理するコンテナオーケストレーションである。

- Singularity
    - HCP クラスタ上で複雑なアプリケーションを実行するために開発されたコンテナプラットフォームである。
    - Docker イメージを利用することができる。

---

# 新規サービスの設計

コンテナで学習環境を提供するにあたって以下の用件が必要となる。

- 他のユーザのコンテナを削除や操作ができない

- コンテナで使用するイメージを自由に作成できる

- 学科サーバに搭載される GPU を利用できる

- ファイル共有

---

# 新規サービスの設計

他のユーザのコンテナを削除や操作ができなくするために, Web コンソールを用意する。
- 学生は学科アカウントでログインする
- 作成したコンテナとアカウントを紐付ける

![](images/conlist.png)

---

# 新規サービスの設計

イメージの作成には, 学科で使用している GitLab の CI/CD 機能を利用する。
- Web コンソールで CI トークンを設定する
- 学科の GitLab の CI で Dockerfile をビルドする

![](images/gitlab.png)

---

# 新規サービスの設計

GPU を利用するために, NVIDIA Container Toolkit を導入する。
- NVIDIA Container Toolkit である nvidia-docker を利用する
- CUDA のバージョンを指定できる

```yaml
FROM nvidia/cuda:10.0-base
```

---

# 新規サービスの設計

ファイル共有のとして, Singularity を利用する。
- $HOME, /tmp, /proc, /sys, /dev がコンテナにマウントされる
- `--nv` で GPU を利用することも可能となる

---

# 新規サービスの実装

コンテナ貸出を行うサービスとして以下の機能を実装した。

- Web コンソール
- Docker の操作
- Kubernetes の操作
- Singularity イメージの提供

---

# 新規サービスの実装

Web コンソールとして以下の機能を実装した。
- 本コースの教員や学生が利用できるように LDAP 認証
- コンテナやイメージの管理を行う DB

---

# 新規サービスの実装

Docker の操作には Docker Engine SDKs を使用し, コンテナやイメージの操作に必要な機能を抜き出し実装した。実装した機能は以下である。

- コンテナの作成
- コンテナの削除
- コンテナへデータのコピー
- コンテナでコマンドの実行
- イメージの削除
- イメージの一覧取得

---

# 新規サービスの実装

GPU を利用する場合, コンテナに割り当てるリソースを宣言する。

```go
resource = container.Resources{
    DeviceRequests: []container.DeviceRequest{
        {
            Driver:    "",
            Count:     -1,
            DeviceIDs: []string{},
            Capabilities: [][]string{
                {
                    "gpu",
                },
            },
            Options: map[string]string{},
        },
    },
}
```

---

# 新規サービスの実装

Kubernetes の操作には Kubernetes クラスターと対話するライブラリである client-go を使用し, 必要な機能を抜き出し実装した。

- コンテナの作成
- コンテナの削除
- Kubernetes API のアクセス制御

---

# 新規サービスの実装

学生ごとの Namespace を作成する。また Role を以下のように定義することで, 学生が手元の PC から自身の Namespace のリソースを操作することができる。

```go
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 から操作できるようにする。
- 学生は ssh でサーバへ接続し利用する
- イメージのビルドには sudo 権限が必要となる
    - Web コンソールからイメージをダウンロード

![w:450 h:300](images/singularity.png)

--- 

# サービスの使用例

Web コンソールからコンテナを作成する例である。

![w:1000 H:700](images/create2.png)

---

# サービスの使用例

コンテナ作成時に GPU を使用するにチェックを入れることで, コンテナから GPU を利用することができる。

![w:850 h:530](images/ope.png)

---

# サービスの使用例

Kubernetes で作成したコンテナには, 手元の PC からコンテナの操作を行うことができる。

![](images/kube.png)

```shell
>>> 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 貸出サービス
    - コンテナに使用する Docker イメージで構築されたアプリケーションに限定される
    - Docker イメージを作成しなければいけないため, Docker について学習する必要がある
    - 他のユーザにイメージを共有することで同じ環境を利用することができる

---

# 比較

本コースでは VM 貸出サービス以外にコンテナを利用できるサービスもある。
- ie-docker
    - Docker をラップしたツールであり, CLI から利用できる
    - ユーザの UID 及び GID 情報を取得することで, 他のユーザのコンテナを操作させない
- digdog
    - Kubernetes を利用したコンテナ貸出サービスである

---

# 比較

- ie-docker
    - Docker Hub に登録されているイメージ, または作成したイメージを利用することができる
    - 管理者の負担が少なくなる

- digdog
    - Docker Hub に登録されているイメージを利用できる
    - Docker にも対応している

---

# 比較

- クラウドサービス
    - オンプレミス環境のため利用の制限がない
    - 物理サーバなどのメンテナンスや, サービスの導入にあたって環境構築が必要である

---

# 改善点

- データの永続化
    - Singularity でデータの永続化はできるが, Docker や Kubernetes のコンテナでは永続化ができない
    - 学生のディレクトリに保存するなどの設定が必要
- イメージの管理
    - Docker イメージ, Singularity イメージで容量を圧迫する可能性がある
    - 使用されていないイメージを削除するなどの対策が必要
    - Docker イメージのセキュリティ対策を考える必要
- リソースの占有
    - ユーザごとにリソースの制限
    - GPU などをジョブスケジューラで管理する

---

# まとめ

- 本コースで利用する新規サービスの設計と実装, また本コースで利用しているサービスとの比較を行った
- 学生がコンテナ技術を用いて学習環境を利用できるサービスの実装をすることができた
- 今後テスト環境にデプロイを行い, ユーザやシステム管理チームからのフィードバックをもらい, 改善や実証実験を目指す