#contents
 *Rancher/Kubernetes の概要 [#jd3d060a]
 #ref(Rancher-Kubernetes.png)
 -Rancher (牧場主) は、Kubernetes (k8s) の管理アプリ
 --https://rancher.com/
 --k8s のほとんどの機能を Web GUI から操作できる
 --Rancher 自体も Docker 上で動く
 --Version 1 では、独自の Docker コンテナ管理基盤を持っていたが、Version 2 から k8s の管理に特化 → 'Kubernetes-as-a-Service.'
 -Kubernets (k8s)
 --https://kubernetes.io/
 --Docker コンテナのオーケストレーション基盤
 --サービスを実行しているコンテナは、IA サーバのクラスタ上のどっかで動く
 --外部への公開は、Ingress を通して行う
 ---Ingress は、内部的には Nginx の Reverse Proxy
 ---Reverse Proxy の物理的な接続先は k8s が勝手に管理してくれる
 ---外部に見せる URL と接続先のサービス (Docker コンテナ) との対応は、k8s に設定する必要がある。この設定は Rancher から行うことができる
 -Docker コンテナ永続化領域は、Rancher が "Volume" から切り出す
 --"Volume" には、NFS の他 Amazon EBS、iSCSI などを設定できる
 *Kubernetesの概要 [#gfe1c864]
 -Kubernetes の設定は、Rancher の Web GUI からできるとしても、Kubernetes の概要を知らないと何を設定していいのかもわからん
 -ということで、登場人物だけ整理
 #ref(Kubernetes.png)
 **ハードウェア [#j7318cbc]
 |Kubernetes Cluster|Kubernetes システム|
 |Master Node       |管理ノード。ここが死ぬとKubernetes全体が死ぬので、本番システムでは3台以上で冗長化する|
 |Node              |計算ノード|
 **Kubernetes全体の管理 [#sfcd5210]
 |kubectl|管理コマンド。RancherではWebから実行できる|
 |kube apiserver|kuberctlからの処理依頼を受付|
 |kube scheduler|Nodeを管理して、どの Node で Pod を動かすかを制御|
 |kube control management|Kubernetes の資産を管理|
 |etcd|分散KVS。Kubernetes自体の設定内容を格納|
 **アプリコンテナ [#yff3d38f]
 |namespace|Podの論理的な管理単位。初期設定で Default が作られている|
 |Pod      |Containerの論理的な単位。Nodeをまたぐことはない|
 |Service  |Pod (内の Container 上で動くアプリ) 同士で通信する場合に、パケットのルーティングを行う|
 **Podの構成 [#c1bb64ea]
 --ネットワーク
 ---Podに内部ネットワークのIPアドレスが振られる
 ---ただしIPアドレスは起動するごとに変わるので、内部ネットワークのIPアドレスはアプリやユーザは使わない
 --Podは、Dockerが動いている仮想マシンと考えるとわかりやすい
  +--------------+
  | Pod          |
  |              | 172.17.0.3
  | Nginx(80)----+-8080----
  | Container    |
  |    |         |
  |    | (5432)  |
  | Postgis      |
  | Container    |
  +--------------+
 Port変換で、Container上で動いているアプリが listen している Port を Pod 外に公開する
 **Service [#d39ab536]
 |Cluster IP Serice    |Pod間で通信をするための Service。通常 Service と言ったら Cluster IP Service|
 |Node Port IP Service |あるノード(物理マシン)の Port 経由で Pod にアクセスするための Service|
 |External Name Service|Pod から namespace 外のサービスを呼び出すための Serivce|
 |Load Balancer Service|大規模 Kubernetes で、物理 Load Balancer と連携するための Service の総称。AWS とか Google Cloud Platform のうらで動いている Service|
 -冗長化
 |Replica Set|同一構成のPodの組。並列性能の向上、障害対応のために用いる|
 |Deployment |本番サービスでは Deployment でアプリを管理。過去の Replica Set をもっていて、Replica Set に対してダウンタイムがないようにバージョンアップやロールバックを行える|
 -Podへの外部からのアクセスは Service (L4 Switch相当) が振り分ける
 --Pod はそれぞれラベルを持っていて、ラベルに従ってパケットを振り分ける。(そういうふうに Service を設定する)
 --Replica Set 内の Pod はすべて同じラベルを持っていて、Service はそのことを知っているので、負荷分散がおこなわれる&br;
 こんなかんじ
 |IN Port                    |Label                           |h
 |4848ポートに来たパケットは    |"本番環境の管理アプリ" ラベルのPodにルーティング|
 |8080ポートに来たパケットは    |"本番環境" ラベルのPodにルーティング|
 |14848ポートに来たパケットは   |"テスト環境の管理アプリ" ラベルのPodにルーティング|
 |18080ポートに来たパケットは   |"テスト環境" ラベルのPodにルーティング|
 ---"本番環境"ラベルのPodが3つあったら順繰りに呼ばれる。
 ---パケット単位なんでアプリのセッションごとに振り分け先 Pod を固定するなんてことはできない → Ingress を使う
 **Ingress [#abeaecb2]
 -クラスタ全体の HTTP Reverse Poxy (L7 Switch相当)
 -内部的には、外部からの HTTP Request を受け付けて、Service (Cluster IP Serice) 経由で Pod に HTTP パケットを投げなおしている
 -中身は Nginx
 **永続化領域 [#xf087301]
 #ref(PersistentVolume.png)
 -Pod 内で動く Docker Container の データ永続化領域(Volume)をどう確保するか
 |PV (Persistent Volume)| Kubernetes 上で動くアプリケーションのデータを格納する領域。まとめて確保して PVC に切り出す|
 |PVC (Persistent Volume Claim)| Pod が必要とするデータ領域のスペックと容量の要求(Claim)。Claim をもとに自動的に適切な PV が選ばれて PVC のデータ領域が作られる。通常は Volume Container が作られる|
 |Pod| Pod では、PVC の name とアプリケーションからのマウントポイントを決める|
 -PVCの例
 #code(plain){{{
 apiVersion: v1
 kind: PersistentVolumeClaim
 metadata:
   name: mysql-data
 spec:
   accessModes:
     - ReadWriteMany
   resources:
     requests:
       storage: 8Gi
   storageClassName: ssd
 }}}
 -PVの例
 #code(plain){{{
 apiVersion: v1
 kind: PersistentVolume
 metadata:
   name: nfs001
 spec:
   capacity:
     storage: 500Gi
   accessModes:
     - ReadWriteMany
   persistentVolumeReclaimPolicy: Recycle
   storageClassName: ssd
   mountOptions:
     - hard
   nfs:
     path: /opt/nfs
     server: ai-chan.local
 }}}
 -accessMode
 |ReadWriteOnce|1つのPodから読み書きできる|
 |ReadOnlyMany |複数のPodから読み取りができる|
 |ReadWriteMany|複数のPodから読み書きができる|
 -persistentVolumeReclaimPolicy
 |Retain |PVCが削除されても、データ領域(Volume Container)を残す|
 |Recycle|PVCが削除されたら、データ領域(Volume Container)の中身を削除する|
 |Delete |PVCが削除されたら、データ領域(Volume Container)を削除する|
 -storageClassName
 --任意に設定可能。Rancher ではデフォルトで何も登録されていない
 *今回の実行環境 [#adaee6b5]
 -[[DeepLearning 計算機調達]]
 -[[DeepLearning XUbuntuインストール]]
 -[[DeepLearning nvidia-docker2]]
 -結局欲しいのは、Computing Node
 --"--runtime=nvidia --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864" オプション付きで動かし、GPUを使った計算ができるノード
 --こいつに macOS 上で動く PyCharm PRO (開発環境) をリモート接続する
 -データを格納するために elastic search がほしい
 -計算ノードの Dockerfile 及び Docker image を管理するために Gitlab が必要
 *Rancherのインストール [#g4ad5bcd]
 +Rancher を起動する。
  $ sudo docker run -d --restart=unless-stopped -p 10080:80 -p 10443:443 rancher/rancher:latest
 --明示的に docker stop されない限り再起動する
 --公開するIPアドレスは 10080/10433。Kubernetes の Ingress が 80/433 を使うのでずらす
 +https://ai-chan.local:10433 にアクセスする。証明書が (Rancherの) 自己証明書なのでアクセスを許可する必要がある
 #ref(rancher-0.png)
 +adminのパスワードを決める
 #ref(rancher-1.png)
 +Rancherのアドレスは https://ai-chan.local:10433 ですよ
 #ref(rancher-2.png)
 --ちなみに https://ai-chan.local だと *.local はダメだよと怒られる
 *Kubernetes のインストール [#d89c7461]
 +Add Cluster
 #ref(rancher-3.png)
 +種別は CUSTOM
 #ref(rancher-4.png)
 +適当にクラスタの名前をつける
 #ref(rancher-5.png)
 +一台構成なので、etcd Control Worker 全てにチェックをつける。インストールスクリプトが提示されるので、ターミナルで実行する
 #ref(rancher-6.png)
 +Done
 #ref(rancher-7.png)
 +しばらく待ちます
 #ref(rancher-8.png)
 +クラスタができた
 #ref(rancher-9.png)
 +Kubernetes が動いている。ここまで 5 分
 #ref(rancher-10.png)
 *PV (Persistent Volume) の作成 [#z5d2a5d7]
 
 #ref(pv-0.png)
 #ref(pv-1.png)
 #ref(pv-2.png)
 ----
 [[Deep Learning]]

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS   sitemap
Short-URL: http://at-sushi.com/pukiwiki/index.php?cmd=s&k=7368f032a2
ISBN10
ISBN13
9784061426061