Rancherで簡単・本格Kubernetes

# RancherによるKubernetes環境構築

Rancherはk8sの構築・運用を容易にしてくれるツールです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/cf0d4f1d-4cd1-a9af-3347-4f3652cea4ad.png)
今回は、検証用の簡易なk8s Cluster環境構築が目的なので、Linuxサーバ2台による構成とします。（Rancherサーバ用・Clusterサーバ用）

作業にあたり、事前に全てのサーバにdockerおよびdocker-compose.ymlをインストールしてください。
今回構築に用いた環境は以下の通りです。
・サーバOS：Ubuntu 18.04
・docker：19.03.8
・docker-compose：1.24.0

# Rancher起動

- Rancher自体もdockerコンテナで起動することになります。

`docker-compose.yml`ファイルを作成し、以下内容を記載します。

```docker-compose.yml
version: "3"
services:
  rancher:
    container_name: rancher
    restart: unless-stopped
    image: rancher/rancher
    ports:
      - 80:80
      - 443:443
    volumes:
      - /var/rancher/auditlog:/var/log/auditlog
      - /var/rancher/rancher:/var/lib/rancher
```

上記例では`/var/rancher`ディレクトリにデータ保存用のディレクトリを作成し、それらにコンテナのディレクトリをバインドしています。ボリュームについては必要に応じて設定してください。

`docker-compose.yml`を作成したら、コンテナを起動します。

```
$ docker-compose up -d
```

起動コマンド実行後、コンテナの動作を確認します。

```
$ docker ps
CONTAINER ID  IMAGE            COMMAND          CREATED        STATUS        PORTS                                     NAMES
50b7e0da7e98  rancher/rancher  "entrypoint.sh"  3 minutes ago  Up 3 minutes  0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp  rancher
```

問題無く動作しているようでしたら、ブラウザからRancher `http://(RancherサーバのIPまたはホスト名)` にアクセスします。

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/3bbd3d63-0925-427c-cfb5-64b5c7b58706.png)
初回接続時は上記のような画面が表示されます。
・adminのパスワード設定
・`Allow collection of anonymous atatistics`のチェックはOn/Offお好みで
・`I agree to the Terms and Conditions for using Rancher.`にチェック
以上、入力を終えたら`Continue`押下します。

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/668f2477-a46e-c461-1275-5af027c60aa7.png)
続いてRancherサーバのURLを設定する画面になります。IPアドレスまたはホスト名を入力し`Save URL`押下します。

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/949216f5-509b-3917-eafb-2109465f391f.png)
これでRancherの利用準備はOKです。
簡単ですね！

# Cluster構築

### 初期構築

では続いてClusterを作成していきます。
右上の`Add Cluster`を押下します。

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/19949f83-d27b-9b76-8bf6-30e877d9cf86.png)
今回はオンプレのサーバでClusterを構築するので、左上の`From existing Nodes (Custom)`を選択します。

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/a2f030b9-56c6-04cd-51c0-14b0c4c4b815.png)
`Cluster Name`に任意のClusterの名称を入力します。

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/4616b322-8755-72db-8faa-84cb6849db18.png)
「Cluster Options」は基本的にデフォルト設定で。
POD間通信に利用するNetwork Providerを変えたい人、コンテナのプライベートレジストリを運用している人などは必要に応じて適宜設定を変更してください。
設定が完了したら`Next`を押下します。

---
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/ea00ebf8-1017-403e-b095-7e79665fe5f7.png)
①Node Options でサーバに設定する役割を選択し、②コマンド右側にある`Copy to Clipboard`ボタンを押下します。
（今回は1台のサーバに全ての役割を担ってもらうので`etcd` `Controle Plane` `Worker`全てをチェックしています。サーバの構成によって、チェックする項目を変更してください。）

---
Clusterサーバにて、上記でコピーしたコマンドを実行します。

```
$ sudo docker run -d --privileged --restart=unless-stopped --net=host -v /etc/kubernetes:/etc/kubernetes -v /var/run:/var/run rancher/rancher-agent:v2.4.3 --server https://192.168.0.1 --token XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX --ca-checksum XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX --etcd --controlplane --worker
```
コマンド実行すると、Clusterを構築するためのコンテナのDLや起動が実施されます。
Rancherの先程の画面で`Done`を押下したあと、Clusterのステータスが`Provisioning`になっていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/46c105e0-5894-8c72-9bf3-d73a804de8dc.png)

数分待つと、Clusterのステータスが`Active`になります。これでClusterの構築は完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/3600c8bc-e789-723a-c58f-e69871508401.png)
Cluster Name（例では`hoge-cluster`）をクリックすると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/0d21a096-0ff1-1266-2ed0-e28de9ab505b.png)
Clusterの状態が表示されますね！当然ですが生まれたてなのでリソースはほとんど消費していません。
上部メニューで`Nodes`を選択すると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/f613de1f-1ea4-0283-bbc9-dbd9942b1940.png)
Clusterを構成するサーバの一覧、および各サーバのステータス、ロールが表示されます。

### Clusterへのサーバ追加

Clusterにサーバを追加するときは、上部メニューの`Cluster`を選択し、右上の`︙`→`Edit`を押下します。
`Edit Cluster: hoge-cluster (Custom)`画面が表示されるので、最下部までスクロールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/7daa02bd-3869-1eb1-63de-cc9cf9d772a3.png)
初期構築時と同様に、①Node Options でサーバに設定する役割を選択し、②コマンド右側にある「Copy to Clipboard」ボタンを押下します。
その後追加するサーバにてコピーしたコマンドを実行します。
あとは数分待って追加されたノードが`Active`になれば、Clusterへのサーバの追加は完了です。

# コンテナのデプロイ
Clusterの準備が出来たら、次は実際にサービスを提供するコンテナのデプロイです。

### 名前空間の作成
まずは名前空間の作成です。既存の「Default」を使ってもいいですが、より厳密にPODを管理したい場合は名前空間を作成しましょう。
RancherのクラスタTOP画面で、`Projects/Namespaces`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/562959a2-0323-0314-6c44-c6628300ce06.png)

次に右上の`Add Project`ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/b048de91-3c09-4206-4f6c-30e6cdf89e4c.png)

プロジェクト（名前空間）の入力画面が表示されるので、必要事項入力のうえ`Create`ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/ce19aaa8-3bcd-a438-34ae-18032084d41f.png)

  * まずは、Project Nameに任意の名称を入力、その他項目はデフォルトでOKです。

これでプロジェクト（名前空間）ができました。上部メニューでクラスタ名→クラスタ名と辿り、今作成したプロジェクト（名前空間）を選択しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/bea2a5b0-5a92-97dc-1877-6b0589076e0c.png)

続いて、上部メニューより`Resources`→`Workloads`を選択しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/962470f1-ae38-ba47-ba18-e562f61ebd2b.png)

当然ですが、POD（コンテナ）が何も無い状態です。
POD（コンテナ）を展開するには、右上の`Deploy`ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/d5456741-c668-7b0d-3bbc-2dacbbc26006.png)

展開するPOD（コンテナ）の各パラメータを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/5696b684-bceb-7699-c3e7-1a7986847adc.png)

  * Name：任意のPOD（コンテナ）の名前。
  * Docker Image：dockerコンテナイメージ。
  * Namespace：任意の名前空間名称。プロジェクト（名前空間）内でさらに名前空間を作成しサービス同士を隔離することもできます。
  * Port Mapping
    * Port Name：任意のポート名。
    * Publish the container port：公開したいコンテナのポート番号。
    * Protocol：UDP or TCP
    * As a：ここでは`NodePort(On every node)`とします。（Clusterの全Workerノードで待ち受ける。）
    * On listening port：`As a`でNode Port`を選択したので、「30000」～「327867」の範囲内で任意のポート番号を入力。外部からはこのポート番号で待ち受けることになります。

ほかボリューム等設定項目いろいろありますが、ここでは割愛します。
設定項目の入力を終えたら、下部の`Launch`ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/d8cee987-6707-b5ee-fceb-341b44cc4408.png)
Stateが`Updating`と表示されます。しばらく待つと`Active`に変わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/b43b3709-b8ed-a6b0-334c-31070ceb029d.png)

これでPOD（コンテナ）の準備は完了です。
ブラウザで`http://（ClusterサーバのIPまたはホスト名）:30001（上記で設定したOn listening portの番号）`にアクセスしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/614ea341-8878-245a-76de-b1accafd5c1a.png)

無事サービスが起動していますね。
基本的なPOD（コンテナ）のデプロイ手順は以上になります。GUIの操作のみでコンテナを起動できました。簡単ですね！


# Rancher(k8s)監視
Rancherは様々な機能を具備しており、その中には監視機能もあります。
ここでは監視機能を有効化し、Clusterの監視を行えるようにしたいと思います。
まずはクラスタTOP画面で上部メニューより`Tools`→`Monitoring`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/0aab365b-f5ff-2ad7-d8e2-44d1d31b4bf6.png)

設定画面が表示されます。入力項目がいろいろありますが、とりあえずデフォルトでOKです。
下部の`Enable`ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/583b7ff8-156e-2aee-1683-4ae187920206.png)

上部メニューよりクラスタ画面に戻りましょう。
小さく`Monitoring API is not ready`と表示されていますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/264c78ca-c43d-d4f3-a4de-755278a3c6c8.png)

しばらく待つと下のような表示に切り替わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/53173053-2f14-7688-2b78-682036bc44d7.png)
これで監視機能が働き始め、Clusterの各種メトリックを監視できるようになりました。
ちなみに監視には「Prometheus」が、ダッシュボードには「Grafana」が利用されています。
ただし、この状態では不便なところがあるので、設定に少し手を加えます。
メニューよりクラスタ名→クラスタ名と辿り「System」を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/6c6d5945-8009-b0da-3d73-2ebbbd311902.png)

「Namespace:cattle-prometheus」となっているところが監視を担うPOD群になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/4c420212-cdd9-d08b-ff44-2d369a085cfd.png)
この中で「grafana-cluster-monitoring」の右にある`︙`→`Edit`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/6afaf083-f1ff-a522-0b52-f8552d00959e.png)

「grafana primary」の`Edit`ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/02a55ab6-3917-80bd-5ab2-ea6105a1be37.png)

grafanaの設定編集画面が表示されます。
まずはメール通知を有効にしたいので、環境変数に設定を追加していきます。
`Environment Variables`の項目を展開表示させ`Add Variables`ボタンを押下し設定を追加していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/f55b281c-a947-fa17-dc00-2c1a2f3c2f16.png)
既存の設定に加え、以下設定を追加します。
・GF_SMTP_HOST＝メールサーバのIPアドレスおよびポート番号
・GF_SMTP_FROM_NAME＝メール送信元の任意の名前
・GF_SMTP_FROM_ADDRESS＝メール送信元のアドレス
・GF_SMTP_ENABLED＝true
・GF_SMTP_USER＝メール送信時認証が必要となる場合のユーザ名
・GF_SMTP_PASSWORD＝メール送信時認証が必要となる場合のパスワード

次に、grafanaの設定内容が揮発しないようにしたいので、ボリュームの設定を行います。
`Volumes`の項目を展開表示させ、まずは`grafana-storage`を削除します。
`grafana-storage`の右にある`Remove Volume`ボタンを押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/722efe31-aaa3-f659-4aa0-a1b3b088e678.png)

次に下部`Add Volume`→`Bind-mount a directory from the node`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/bcd3822d-2d29-5f62-d29d-80f73e0369a3.png)

ボリュームの各設定について入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/6b51d2ed-11fa-6cc5-c7c2-181995d7d527.png)
・Volume Name：任意のボリューム名
・Path on the Node：データを保存するノード上のディレクトリのパス
・Mount Point：ノード上のディレクトリにマウントするコンテナ内のディレクトリのパス

上記のように、環境変数とボリュームの設定を入力し終えたら、下部の`Save`ボタンを押下します。
しばらく待って`grafana-cluster-monitoring`のStateが`Active`になったら準備完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/9b3a1779-728e-ed42-57b2-35f0c92e5b38.png)

ClusterのTOP画面に戻りましょう。
所々に ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/2c2ee3ae-4f5d-f078-b0c5-568c1a067437.png)マークが表示されているのが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/f0889bce-f837-fbf0-f61b-b33b2f973e5a.png)
どこでもいいのでマークをクリックしてみましょう。
grafanaのダッシュボードが表示されましたね。
いろいろ見てみる前に、まずはgrafanaにログインしましょう。左下`Sign in`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/a2ae1d40-2bb5-b4d8-8613-83b48d67749a.png)
ユーザ名は`admin`、初期パスワードも`admin`です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/6abeca65-a6d0-f3f9-417b-4d4e077d521c.png)
ログインするとパスワード変更を求められます。任意のパスワードに変更しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/ed2cdc7f-2fdb-8816-ab1c-bd3bd08e9af8.png)
晴れてログイン完了です。左のメニューアイコンが多く並んでいます。
また、ダッシュボードもデフォルトでいくつか作成されています。
これらを表示することでクラスタの様々なメトリックを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/fbcd4234-2838-5ed8-fe10-2634f493da4b.png)
grafanaの詳細な利用方法についての説明は割愛します。別サイト等を参照ください。
情報を参照するのみであればこのままでも構いませんが、通知を実施する場合にはデフォルト設定だとうまくいきません。
通知を実施する場合は、以下手順によりデータソースを作成してそれを用いるようにしてください。

まず左メニューより`Data Sources`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/e5c6080e-9b03-3ac8-7482-b52c62381535.png)

デフォルトで`RANCHER_MONITORING`というPrometheusのデータソースが存在します。
このデータソースを使って各種メトリック監視設定をすると、通知の際エラーとなってしまいます。
そこで新たなデータソースを作成します。
右の`Add data source`ボタンを押下し、続けて`Prometheus`を選択します。

Prometheusデータソースの設定画面が表示されますので必要事項を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/94d96502-15d3-5af7-3b1c-932573dba6cf.png)
・Name：任意のデータソース名
・Default：デフォルトのデータソースにする場合は有効にします（任意）
・URL：http://access-prometheus
・HTTP Method：GET
上記を入力したら`Save & Test`ボタンを押下してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/479194/0aeea6ba-6e91-ee6d-19c1-ef14f8b961ae.png)
上のように`Data source is working`の表示が出れば完了です。
通知を行う際は、ここで作成したデータソースを利用するようにしてください。


# Rancher運用してみて

上記例は2台のサーバによる最小構成ですが、MasterノードおよびWorkerノードをそれぞれ複数台で構成すれば、それなりの規模のサービスの稼働にも耐えられますし、可用性の極めて高いシステムを稼働させることができます。その場合、Rancherサーバがシングル構成のままですが、Rancherが落ちても、ClusterやCluster上にあるPOD（コンテナ）は稼働し続けるためサービスは止まりませんし、オートヒーリングなどのk8sの機能も維持されます。上記例のようにRancherのデータをホスト上のディレクトリに外出ししておけば、再度`docker-compose up -d`するとRancherも元通り！なので、今のところ個人的にはRancherの冗長化まではあまり必要性を感じていません。（簡単な冗長化の手段が思い付かないだけですが・・・）
監視機能もついていますし新しいバージョンではIstioも付いてきます。
またここでの例では英語表示でしたが、日本語表示も可能です。
kubernetesの敷居をかなり低くしてくれるとても優れた仕組みだと感じます。
みなさんも是非利用してみてはいかがでしょうか。