入門 Rancher v2


食べログ Advent Calendar も終盤に差し掛かってきましたね。
20日目は DevOps チームの @kamina_zzz が Rancher 環境の構築を紹介します。
よろしくお願いいたします!

# はじめに

今回は Rancher について、役割の紹介から導入までをお話します。
こんな人を対象にしています。

- コンテナを Kubernetes で運用したい
- Rancher を触ってみたいけど v2.x 系の入門記事を読みながら簡単な実践をしてみたい
- Rancher の名前は聞いたことがあるけど実際のところ何者なのかわからない、知りたい
- リソースが *オンプレ/AWS/GCP* など、多岐に渡るシステムを運用したい
  - メインはクラウドだけど、 [GPU環境だけはオンプレ](https://qiita.com/kamina_zzz/items/58d831c7b238fb4b409c) みたいなチーム、わりとありそうですよね
- Kubernetes を勉強したいがクラウドサービスを使わずに環境を用意したい
- Rancher を使いたいがメンバーへの布教用に v2.x の簡単な紹介記事がほしい

# そもそも Rancher って?

Rancher は一言で言うと「複数の Kubernetes Cluster を管理・運用するためのツール」です。

ちなみに Rancher OS と Rancher は別物です。
また [Rancher 1.6 と 2.x も **別物と思ったほうが良い**](https://rancher.com/docs/rancher/v2.x/en/v1.6-migration/) です。

Rancher が何者なのかを理解するのに一番手っ取り早いのは「何をしてくれるのかについて知る」だと思いますので早速 Rancher の構成要素を紹介します。

## 主な構成要素

### Cluster Controller/Agent

Rancher がメイン機能である Kubernetes (以下 k8s) クラスタの管理がこのコンポーネントによって提供されています。
Cluster Agent は各 k8s クラスタに対して存在しており、Rancher は Cluster Controller を通して Agent とやりとりすることで k8s 内部のことを知ることができます。

### Auth Proxy

名前の通りユーザー認証周りのことをやってくれるコンポーネントです。
ピュアな k8s では「操作対象」「操作者」「操作内容」に対しては無関心であるため、様々なユーザーによって運用されるシステムではシステム構築者が考えてやる必要があります。

この認証機能のおかげで「このユーザーはこのクラスタに対してこの操作はできる/できない」といったことの管理がしやすくなります。
`kubectl` や k8s の WebAPI などのピュアな k8s が提供している機能もこの認証機能を通して実行することで適切に権限の管理ができます。

### WebAPI

k8s はそれ自身にも WebAPI の機能がありますが、 Rancher 自体にも WebAPI が備わっています。
この WebAPI を通すことで Rancher が提供するクラスタ管理の機能などを GUI を使わずとも操作することができ、自動化などの応用に夢が広がります。

# やってみる

Rancher が何をしてくれるものなのか、ぼんやり見えてきたかと思いますがやっぱり自分で手を動かすに越したことはありません。
今回は Mac で [公式の vagrant を使った構築](https://rancher.com/docs/rancher/v2.x/en/quick-start-guide/deployment/quickstart-vagrant/) をしてみましょう。

## 準備

公式のリポジトリがとても良くできているのであっという間にできます。

```bash
git clone https://github.com/rancher/quickstart
cd quickstart/vagrant
vagrant up
```

これだけ。

## 使ってみる

デフォルトでは `https://172.22.101.101` にサーバーが立ち上がります。ここへアクセスするとログイン画面が出てくると思います。
デフォルトの ID/Pass は `admin/admin` なので、入力してクラスタを見てみます。

<img width="1261" alt="quickstart" src="https://qiita-image-store.s3.amazonaws.com/0/39318/ab730944-b6f3-ef65-8970-284b15eba5c4.png">


`quickstart` という名前でクラスタができていますね。
中を見てみるとノードがひとつだけあり、こいつが k8s の master と worker を兼ねています。

実際に Workload を追加してみましょう。

`quickstart` クラスタの Default を開いて

<img width="706" alt="default tab" src="https://qiita-image-store.s3.amazonaws.com/0/39318/c7a45862-3ac9-4e15-8024-f890093d227e.png">


`Deploy` を押して nginx の pod を追加してみましょう。

- name  は何でも良いですが今回は `nginx` としました
- イメージは `nginx:latest` を使います

<img width="666" alt="nginx" src="https://qiita-image-store.s3.amazonaws.com/0/39318/77462a78-f003-1a47-5328-16738b3db90e.png">


このまま `save` を押すと `nginx` の pod がデプロイされます。

次に疎通するための Ingress LB を作りましょう。

`Load Balancing` タブを選び、以下の内容で `nginx` をバックエンドとした LB をつくります。

- name は例によって何でも良いですが `lb` としました
- Target のプルダウンから `nginx` を選択
- Port に `80` を指定

<img width="1279" alt="lb" src="https://qiita-image-store.s3.amazonaws.com/0/39318/4ff7eb5a-7583-ea48-d760-cd3fcff9e4da.png">


これで `save` すると `nginx` へ疎通するための LB ができ、しばらくすると`http://lb.default.xxx.xxx.xxx.xxx.xip.io/` のようなアドレスが生成されます。

<img width="612" alt="lb created" src="https://qiita-image-store.s3.amazonaws.com/0/39318/9cbecfe4-a2e0-b13f-4004-00d7a8fde5e8.png">

ここにアクセスするとローカルIPに名前解決され、nginx へ接続できます。

![welcome to nginx](https://qiita-image-store.s3.amazonaws.com/0/39318/8200643d-9e43-cbdf-f528-40c947b16d52.png)


# おわりに

本来であれば他にも

- `rancher` コマンドのセットアップ
- カタログからワークロードの追加
- High Availability 構成

などの話題も触れておくべきかと思いましたが、思った以上に長くなってしまいましたのでまた別の機会にでも書こうと思います。

特に、HA 構成については面白い (rke で k8s クラスタ作って helm で rancher server の chart をインストールして構築…k8s がネストする!) ので興味がある方は [公式のドキュメント](https://rancher.com/docs/rancher/v2.x/en/installation/ha/) を参考に作ってみるのも良いかと思います。

明日は @uribou による 「MS Teams を使って例外が起きたら通知するようにしてみた」です。お楽しみに〜

# ref

- https://rancher.com/
- https://rancher.com/docs/rancher/v2.x/en/