Amazon EKS にNvidia Dockerを乗せてみる(※更新中)
Amazon EKS にNvidia Dockerを乗せてみる(※更新中):
基本的には公式ドキュメント(Amazon EKSの使用開始)に沿って実施
背景
- Kubernetes(k8s)を使ってNvidia Dockerを動かせるのかを確認してみたい
- 現時点では成功していないので、失敗した方法を記述します…
- k8sはAWSのマネージドサービスであるElastic Container Service for Kubernetes (Amazon EKS)を使用
Kubernetesとは
- コンテナのデプロイや運用を自動化するためのコンテナオーケストレーションシステムの1つ
- ホスト管理、コンテナ配置、スケーリング、ロードバランサー、死活監視などなど
- Googleによって開発された
- 2017年10月にDockerとKubernetesの統合が発表され、Dockerから正式採用となった
- k8sはDocker本来のエコシステムであるCompose、Swarm、Stackの機能を統合しつつ、より高度に管理できる機能を備えている
Amazon EKSのセットアップ
基本的には公式ドキュメント(Amazon EKSの使用開始)に沿って実施
前提条件
- IAM コンソールで Amazon EKS サービスロールを作成
- Amazon EKS クラスター VPC を作成
kubectlのセットアップ
- kubectlとは
- k8sを操作するためのコマンドラインツール
- 操作する端末のローカルにインストールすればよい
-
OSによってインストール方法が異なる。
-
こちらを参照を参照
-
-
続いてaws-iam-authenticatorをインストール
- EKSを操作するための認証をIAMを使用して実施してくれるツール
- AWS CLIがインストールされていない場合はここでインストールする
Amazon EKS クラスターを作成
-
クラスターとは
- MasterサーバとNodeから成る。
- Masterサーバーはクラスタ全体を管理するサーバー、Nodeはクラスタ管理下に登録されるDockerホストのことで、コンテナのデプロイ先にあたる
- Masterサーバーのコンポーネントは下記の4つ
- kube- apiserver
- k8sのAPIを公開するコンポーネント。kubectlからのリソース操作を受け付ける。
- etcd
- 高可用性を備えた分散キーバリューストアで、k8sクラスタのバッキングストアとして利用される。
- kube-sceduler
- Nodeを監視し、コンテナを配置する最適なNodeを選択する
- kube-controller-manager
- リソースを制御するコントローラーを実行する。
- kube- apiserver
- コンソールとCLIのどちらからでも作成可
- クラスターの作成と言っても、ここではVPC、サブネット、セキュリティグループの設定を行うのみ
- 先ほどMasterサーバーのコンポーネントを4つ挙げたが、今回のようにマネージドサービスを利用する場合はMasterの存在を意識する必要はあまりない
- k8sのバージョンは現時点で最新の1.10を選択
Amazon EKS の kubectl を設定
- ローカルでkubeconfigをAWS CLIから作成
- ここで先ほど作成したクラスタとの紐づけを行う
Amazon EKS ワーカーノードを起動して設定
ワーカーノードの作成
- Cloud Formationから操作
- リージョンは米国西部 (オレゴン) (us-west-2)か米国東部 (バージニア北部) (us-east-1)を選択
- 以下の項目に適切な値を設定
- Stack name
- 任意のスタック名
- ClusterName
- 作成したクラスタ名
- ClusterControlPlaneSecurityGroup
- 作成したVPC
- NodeGroupName
- 任意のNode名
- NodeAutoScalingGroupMinSize
- スケールインする最小ノード数
- NodeAutoScalingGroupMaxSize
- スケールアウトする最大ノード数
- NodeInstanceType
- 後述
- NodeImageId
- 後述
- KeyName
- SSH接続する際に指定する鍵
- Stack name
ワーカーノードをクラスターと結合するには
- aws-auth-cm.yamlをダウンロードする
- Rolearnの箇所に、先ほど作成したノードのNodeInstanceRoleの値を設定する
apiVersion: v1 kind: ConfigMap metadata: name: aws-auth namespace: kube-system data: mapRoles: | - rolearn: <ARN of instance role (not instance profile)> username: system:node:{{EC2PrivateDNSName}} groups: - system:bootstrappers - system:nodes
- 設定を適用する
$ kubectl apply -f aws-auth-cm.yaml
失敗ケース1
- Amazon EKS GPU 対応最適化 AMIを使用
-
公式ドキュメントに沿ってやりましたがなぜか上手くいきませんでした
Amazon EKS GPU 対応最適化 AMI
- EKS向けに最適化されているAMIの中でも、GPUワークロードをサポートしているもの
- AMI自体は無料だがSubsucribeが必要
リージョン | Amazon EKS 最適化 AMI (GPU 対応) |
---|---|
米国西部 (オレゴン) (us-west-2) | ami-0731694d53ef9604b |
米国東部 (バージニア北部) (us-east-1) | ami-058bfb8c236caae89 |
欧州 (アイルランド) (eu-west-1) | ami-0706dc8a5eed2eed9 |
- P2 or P3のインスタンスをサポート
- 以下が含まれる
- NVIDIA ドライバー
- nvidia-docker2 パッケージ
- nvidia-container-runtime (デフォルトのランタイム)
- 以下のコマンドでNVIDIA device plugin for Kubernetes を次のコマンドを使用してクラスターのデーモンセットとして適用
$ kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v1.10/nvidia-device-plugin.yml
- 以下のコマンドでノードに GPUが割り当てられたことを確認する
$ kubectl get nodes "-o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu"
サンプルのPodを作成
- これが上手くいきません
- 公式ドキュメントに沿ってポッドマニフェスト(nvidia-smi.yaml)を作成
apiVersion: v1 kind: Pod metadata: name: nvidia-smi spec: restartPolicy: OnFailure containers: - name: nvidia-smi image: nvidia/cuda:latest args: - "nvidia-smi" resources: limits: nvidia.com/gpu: 1
- 以下のコマンドで適用
$ kubectl apply -f nvidia-smi.yaml
- ここで
$ kubectl get pod
を実行してみると、nvidia-smiのstatusがCrashLoopBackOffになる…つまりずっど起動に失敗してリトライしている状態
失敗ケース2
-
Kubernetes on NVIDIA GPUsを参考にしてみる
- NVIDIAが公式に提供しているKubernetesのパッケージ
- 記載されている手順とは異なるが、ここで使用されているAMIを今までの手順に適用してみた
NVIDIA Volta Deep Learning AMI
- こちらもAMI自体は無料だがSubscribeが必要
- インスタンスはP3のみが指定可
- このAMIを指定しても同様にワーカーノードの作成には成功
- しかし今度は
$kubectl get nodes
をしてもずっとノードが認識されない…
今後の方針
- 今度はKubernetes on NVIDIA GPUsの手順をそのまま実行してみます
- Kubernetesを0からセットアップするためいろいろと手間はありますが、ここまでのやり方が失敗しているためチャレンジしてみる価値有かと
コメント
コメントを投稿