Giter Club home page Giter Club logo

kubernetes-construction's Introduction

$マークはコピペしやすい様にあえて付けていません。

Kubernetes + Nvidia Docker の構築

検証済み環境

OS ARCH docker Ver. ESXi
Ubuntu 18.04 amd64 Docker version 19.03.5, build 633a0ea838 6.7 Custom ISO
Ubuntu 18.04 ppc64le Docker version 18.06.1-ce, build e68fc7a None

ppc64le はIBM Power System AC922 POWER9で検証

コンテナイメージはそれぞれのアーキテクチャに合わせる必要があります。

docker のインストール(docker-ce)

既存のアンインストール

sudo apt-get remove docker docker-engine docker.io containerd runc

docker-ce のインストール

# パッケージの更新
sudo apt-get update
# 必要モジュールのインストール
sudo apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

# キーの追加
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88

# リポジトリの追加
# amd64
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

# ppc64le
sudo add-apt-repository \
   "deb [arch=ppc64el] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

# パッケージの更新
sudo apt-get update

# dockerのインストール
sudo apt-get install -y docker-ce

# ユーザーの追加
sudo usermod -aG docker $USER

# dockerサービスの自動起動
sudo systemctl enable docker

# dockerサービスの起動
sudo systemctl start docker


補足情報

# インストール可能なリスト
apt-cache madison docker-ce

# バージョンを指定してインストール
sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io

kubernetes インストール(Master/Worker)

特段何も記載されていない場合はMaster/Worker両方の作業です。

リポジトリにキーの登録

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"

リポジトリの更新

sudo apt update
sudo apt install -y kubeadm

スワップ OFF

## 都度適応?
## /etc/fstabを削除すると泣くことになる -> なぜかdockerが立ち上がらなくなる
sudo swapoff -a

/etc/fstabを以下のようにコメントアウトを行うことで一旦は対応できました。

sudo nano /etc/fstab

- /swap.img      none    swap    sw      0       0
+ #/swap.img      none    swap    sw      0       0

kubeadm でセットアップ(Worker Node)

sudo kubeadm init --pod-network-cidr=10.244.0.0/16

kubernetes config の追加(Master)

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

iptables の編集

sudo sysctl net.bridge.bridge-nf-call-iptables=1

これをしないとcore-dnsの pod が起動しない

flannel.yaml の追加(Master)

kubectl apply -f flannel.yml

LoadBranser の構築(Master)

metallb.yamlを適用する

kubectl apply -f metallb.yaml

LAN 内の IP に割り振る yaml を apply する

---
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - xxx.xxx.xxx.xxx-xxx.xxx.xxx.xxx # この部分をLAN内のIPに変更する

Master Nodes にもデプロイする場合(シングルマスタノード構成の場合とか)

kubectl taint nodes 名前空間 node-role.kubernetes.io/master:NoSchedule-

名前空間部分はkubectl get nodeで取得できるNameを設定(Master の Name)

kubectl describe node node名

# ~~ 中略 ~~
Taints:             <none>
# ~~ 中略 ~~
# 上記になっていることを確認

Master へ Node を追加する(Worker)

sudo kubeadm join xxx.xxx.xxx.xxx:6443 --token xxxxxx.xxxxxxxxxxxxx --discovery-token-ca-cert-hash sha256:xxxxxxx

Master を構築した時に最後に表示される--token --discovery-token-ca-cert-hashを設定する

Token が不明になった場合(Master)

# tokenが不明になった場合は再度発行すれば良い
kubeadm token create --print-join-command

Node が追加されたか確認(Master)

kubectl get nodes
NAME           STATUS   ROLES    AGE     VERSION
Master         Ready    master   3m11s   v1.17.1
Node1          Ready    <none>   2m10s   v1.17.1

DashBorad(v2.0.0-rc2) のデプロイ(以下、Masterでの作業)

kubernetes リポジトリから直接デプロイする場合はクラスタ内部からしかアクセス出来ないため、 NodePort を設定したrecommended.yamlをデプロイする。 ただし、リポジトリから直接デプロイし、NodePort を設定しても issue にある様なエラーが発生するためここではすでに用意しているdashboard/recommended.yamlを使用する また、その際に証明書の設定をする必要があるため、下記を実施すること

自己証明書の発行

mkdir certs
openssl req -nodes -newkey rsa:2048 -keyout certs/dashboard.key -out certs/dashboard.csr -subj "/C=JP/ST=kubernetes/L=kubernetes/O=kubernetes/OU=kubernetes/CN=kubernetes-dashboard"
openssl x509 -req -sha256 -days 365 -in certs/dashboard.csr -signkey certs/dashboard.key -out certs/dashboard.crt

すでに定義されている分を削除(直接デプロイした場合)

# 削除
kubectl -n kubernetes-dashboard delete secret kubernetes-dashboard-certs

証明書を pod から使用できる様にする

  • certs/dashboard.crt
  • certs/dashboard.csr
  • certs/dashboard.key

上記の証明書ファイルを Secret オブジェクトへ設定できる形にする(改行コードは含めず1行で設定)

# base64形式で設定する必要があるのでbase64コマンドで設定する
# それぞれのファイルで実施する
# certs/dashboard.crt
# certs/dashboard.csr
# certs/dashboard.key
cat certs/dashboard.crt | base64
cat certs/dashboard.csr | base64
cat certs/dashboard.key | base64

recommended.yaml の編集

---
apiVersion: v1
data:
  dashboard.crt: base64に変換された.crtファイルを記述
  dashboard.csr: base64に変換された.crsファイルを記述
  dashboard.key: base64に変換された.keyファイルを記述
kind: Secret
metadata:
  name: kubernetes-dashboard-certs
  namespace: kubernetes-dashboard
  labels:
    k8s-app: kubernetes-dashboard
type: Opaque

apply する!

kubectl apply -f dashboard/recommended.yaml

ログイン用のトークンを設定

ログイン画面には token or kubeconfig が求められます。 今回は Token を用いてログインする方法を記載します。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: admin-user
    namespace: kubernetes-dashboard
kubectl apply -f admin-user.yaml
kubectl get secret -n kubernetes-dashboard | grep admin
  admin-user-token-xxxx             kubernetes.io/service-account-token   3
kubectl describe secret -n kubernetes-dashboard admin-user-token-xxxxx

表示されたtokenをコピーし、

トークンを選択し、トークンを入力にペーストし、サインインを行う。

dashboard

GPUへの対応(以下、Workerでの作業)

ESXi上のUbuntuへ対応する場合は下記を設定する(シャットダウンをした状態で)

GPUパススルーの設定

ホスト > 管理 > ハードウェア > 該当のGPUを選択し、パススルーの切り替えを押下 > 再起動

PCIデバイスの追加

設定の編集からPCIデバイスの追加 GPU以外にパススルーされてるものも一緒に追加する

ゲストOS上からGPUが認識出来るように設定

仮想マシンのオプション > 詳細 > 構成の編集に下記の設定を追加

キー
hypervisor.cpuid.v0 FALSE

グラボの確認

lspci | grep -i nvidia

正しく表示されなかった場合は情報をアップデートする

sudo update-pciids

CUDAのインストール(docker:v19.03は不要)

以下のサイトから自身のGPUに適応出来るCUDAをインストールする

CUDA toolkit

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
sudo mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo add-apt-repository "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ /"
sudo apt-get update
sudo apt-get -y install cuda

.bashrcにパスを追加

export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"

再起動を行う

sudo shutdown -r now

NVIDIA Graphics Driver をインストールする

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update

推奨ドライバーをインストール

sudo apt -y install ubuntu-drivers-common
sudo ubuntu-drivers autoinstall

NVIDIA Container Toolkitのインストール

NVIDIA Container Toolkitをインストールする為にリポジトリにaptに追加

distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

NVIDIA Container ToolkitのインストールとDockerの再起動

sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker

再起動を行う

sudo shutdown -r now

インストール後の確認 ドライバーとCUDAのバージョンが確認出来る

nvidia-container-cli info

NVRM version:   440.48.02
CUDA version:   10.2

Device Index:   0
Device Minor:   0
Model:          GeForce RTX 2070
Brand:          GeForce
GPU UUID:       GPU-2318f1ba-cc45-3c5b-a000-798ad9ba8390
Bus Location:   00000000:0b:00.0
Architecture:   7.5

Dockerから使用可能かどうか確認

docker run --rm --gpus all -it ubuntu nvidia-smi

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.48.02    Driver Version: 440.48.02    CUDA Version: N/A      |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce RTX 2070    Off  | 00000000:0B:00.0 Off |                  N/A |
| 29%   33C    P8    21W / 175W |      0MiB /  7982MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

KubernetesにGPUを認識させる

nvidia-container-runtimeをインストール(docker:v19.03で必要)

sudo apt-get install nvidia-container-runtime

kubernetesから使用出来るようにDockerのデフォルトランタイムをGPUに変更

{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

gpu-pluginを適用(Master)

kubectl apply -f https://raw.githubusercontent.com/ncs-nozomi-nishinohara/kubernetes-Construction/master/nvidia-device-plugin.yml

kubernetes-construction's People

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.