Rancherを触ってみる

# 環境
- Rancher Server兼Dockerホスト: Ubuntu 16.04 LTS(bento/ubuntu-16.04(v201708.22.0))
- Rancher v1.6.7
- Cattle v0.183.5
- User Interface v1.6.17
- Rancher CLI v0.6.3
- Rancher Compose v0.12.5


# Rancherとは？
Dockerコンテナを管理するためのインフラサービス（ストレージ、ネットワーク、ロードバランサ、DNS、セキュリティ機能など）を提供するソフトウェア
更に、各種CI/CDツールやコンテナオーケストレーションツールと連携する事で、統合的なコンテナ管理環境を実現する。

本番環境レベルの運用管理を目指して開発されている。

# Overview
https://rancher.com/docs/rancher/latest/en/

- インフラサービス: インフラサービス自体のコンテナ化により、マルチクラウド、オンプレミス両方で使える
- コンテナオーケストレーション、スケジューリング: CattleもしくはDocker Swarm, Kubernetes, Methosなどを利用可
- アプリケーションカタログ: クラスター化されたコンテナをアプリケーションの「カタログ」として予め用意し、そこからデプロイ可能。パブリックなカタログを共有する事も出来るし、プライベートなカタログも作成可能。
- エンタープライズレベルの認証機能。Active Directory, LDAP, Github連携。ロールベースのアクセス制御(RBAC)


# クイックスタート
https://rancher.com/docs/rancher/v1.6/en/quick-start-guide/

## インストール
必要なもの

- Dockerが動作可能なLinuxホスト
- Docker

※ プロキシ配下で動かす場合はDockerのProxy設定を入れる事。
https://docs.docker.com/engine/admin/systemd/#httphttps-proxy


## ホスト追加
Host Registration URL
Rancher APIが提供される（＝Rancher Serverが動いているサーバの）URL
Dockerホストから本URLのAPIを叩く必要があるため、全ホストから到達可能である必要あり。
つまりパブリッククラウド上のDockerホスト(AWS,Azure,etc.)をRancherで管理したければ、インターネットもしくは閉域網でRancher Serverへアクセス出来る環境を用意する必要あり。

カスタムの場合、最低限DockerホストのIPアドレスを指定すればdocker runコマンドが生成される。
それを対象のDockerホスト上で実行する事で、Rancher Agentのコンテナが起動し、自動的にRancher Serverと通信し始める。

Environment
Environment templateに従って生成されたinfrastructure servies群と、各種リソース（ホスト、コンテナなど）、ユーザ・グループ情報をまとめたもの。
利用用途として、開発環境と本番環境とでアクセス制限を分ける等。

Environment template
infrastructure servicesの組み合わせを指定するテンプレート
例えば、コンテナオーケストレーションツールとして、デフォルトのCattleではなく、Kubernetesに変更したり。
DNSサーバとして、外部のDNSサービスを指定したり。


## コンテナ起動
RancherのGUIから追加可能。この場合、自動的に10.42.*.*のオーバーレイネットワーク上にデプロイされる。
※オーバーレイネットワークで利用するネットワークアドレスは、Environment TemplateのNetworkingで指定可能。

また、DockerホストでCLIから追加したコンテナをRancherが自動検知してくれる。
Docker CLIで追加した場合、特に指定が無ければ、コンテナが使うIPアドレスはDocker daemon側で割り当てる。
Rancherのオーバーレイネットワーク上にデプロイしたければ、`io.rancher.container.network=true`ラベルを追加してコンテナ起動する。

Stack
コンテナのグループ。アプリケーション/システム単位でまとめる。

## 複数階層のコンテナを用いたアプリケーション
例えば、LB＋Web＋DBのシンプル構成

GUIから一つずつ作成する場合、
DBサーバ、Webサーバ間の接続は、コンテナ作成時にService Linkを指定する事で実現。
LBはinfrastructure servicesの中に含まれるため、サービスとは別に作成する。LB作成時に紐づけたいサービス（今回はWebサーバ）、ポート等を指定すれば、同じStack内にコンテナとしてデプロイされる。

CLIの場合、docker-compseおよびrancher-composeファイルを用いて定義できる。
rancher-composeはRancherに必要な属性を追加するもの。docker-composeと同じYAML形式。
作成済みスタックから各ファイルを生成する場合、Stack画面の[...] -> Export Config

リモートホストからRancherをCLI操作する場合、各OS用のCLIバイナリとAPIキーが必要。
バイナリはRancher ServerのGUIからダウンロード可能。Win/Mac/Linux版あり。
APIキーはRancher ServerのGUIから、API -> Keysで作成

## その他疑問

Q. LBのIPアドレスは指定できるのか？
A. 【TODO】ドキュメント漁って見るも良くわからず。後で調べる。。。
ロードバランサ作成時のオプションには無さそう。。
https://rancher.com/docs/rancher/v1.6/en/cattle/adding-load-balancers/

Rancherでデプロイしたコンテナは自動的にmanagedネットワークへ接続される。
https://rancher.com/docs/rancher/v1.6/en/rancher-services/networking/

Dockerのネットワーク
http://docs.docker.jp/engine/userguide/networking/dockernetworks.html



Q. Service Linkを後で変更できるのか？
A. Service画面のEditで編集可能。

Q. DBサーバのコンテナを作り直すときはどうする？
A. DBサーバのコンテナをアップグレードすればOK。
Cattleの場合、コンテナイメージ更新後、Service画面から対象サービスを選んでUpgrade
指定したイメージの最新版をpullして、新しいコンテナを生成、古いコンテナと入れ替えてくれる。
https://rancher.com/docs/rancher/v1.6/en/cattle/upgrading/

Q. DBデータを永続化したいんだけど？
A. Volume機能でコンテナからアクセス可能な共有ボリュームを作成し、マウントすればOK
https://rancher.com/docs/rancher/v1.6/en/cattle/volumes/

Q. Webサーバのコンテナを追加/削除するときは？
A. EditからScaleを変更

# Catalogからコンテナをデプロイ
## Catalogとは？
Rancherで利用可能なアプリケーションのテンプレート。複数サービスで構成された複雑なStackを簡単にデプロイできる。
Rancher公式認定のRancher certified catalog、コミュニティ発のcommunity-catalogがある。
また、各自のRancher環境独自のprivate catalogを作成し、使用する事も可能。

https://rancher.com/docs/rancher/v1.6/en/catalog/

## デプロイ方法
Stacks -> User -> [Add from Catalog]
後はお好きなCatalogを選択

今回は（何故か？）日本ではチュートリアルによく使われるWordpressのCatalogを使ってみる。
といっても、テンプレートにパラメータを入れてLaunch。デプロイ完了を待てばOK
※ 今回の環境だとデプロイした各種サービスが起動できず。。さすがにbento1個に全部載せるのは辛いか。。。


template version: v0.2-bitmaniの場合、
- 公開ポート番号
- MariaDBユーザ名、パスワード
- WordPress用のDB名
- WordPressユーザ名、パスワード
- Volume driver

最後の「Volume driver」はRancher独自のもの。
Rancher上で動作するコンテナから永続化可能なボリューム（ホストローカル、ないし、共有可能な外部ストレージ上に作成）を扱う際に利用するドライバー
http://rancher.com/docs/rancher/v1.6/en/cattle/volumes/

※ Rancherのストレージ関連は、ynottさんが分かりやすくまとめて下さっていました。ありがとうございます！
http://qiita.com/ynott/items/ca4b440f0d81741447ff


# 所感
- 牧場主になる思想は好感触。家畜化、大事。
- RancherはDevと連携する前提のOpsツールという位置づけ(だと思ってる)
  - CI/CDツールとの連携は必須。
  - 前提として、Devの現場がコンテナでの開発に慣れているor慣れる必要あり。
- 今回の環境でWordpressのCatalogからデプロイしたら、コンテナが起動できないまま止まった。Dockerホストのリソース利用状況を確認する方法を考える必要あり。
  - RancherでのHostリソース情報は、GUIを開いてないと確認できないし、大まかな全体量しか分からないため、別途監視サーバを立てるべきか？
- 今回、Volumeは作成しなかったが、実際にVolume作った場合、どれくらいのI/O性能が出せるか気になる。