シングルノードにkubernetesとRancher 2.0を導入して、コンテナ管理してみた

# シングルノードにkubernetesとRancher 2.0を導入して、コンテナ管理してみた

## 背景
小さい構成でも、kubernetesとRancher 2.0を使ってコンテナの管理をしたいと思い、導入してみました。

## 構成情報
* クラウド環境：Azure
* VMサイズ：Standard A2 v2 (2 vcpu 数、4 GB メモリ)
* OS：CentOS Linux release 7.5.1804 (Core) 
* docker：17.03.1-ce
* Rancher：v2.1.1

以下、Rancher 2.0の公式ページにある要件一覧です。適宜参照してください。  
https://rancher.com/docs/rke/v0.1.x/en/os/

## 手順
1. 仮想マシンの準備、初期設定
2. RKEによる、Kubernetesのインストール
3. Rancher 2.0の導入
4. Rancherへの既存kubernetesクラスタの認識

## 1. 仮想マシンの準備、初期設定
### 仮想マシンの作成
Standard A1 v2 (1 vcpu 数、4 GB メモリ)だと、CPUの性能不足でRancherが再起動を繰り返しました。Standard A2 v2 (2 vcpu 数、4 GB メモリ)だと問題ありませんでした。

### セキュリティ設定
今回は手順を簡略化するため、SELinux、iptalbes、firewalldを停止しておきます。

```
$ getenforce
Disabled
$ systemctl status iptables
Unit iptables.service could not be found.
$ systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
```

### Dockerのインストール
以下のRancherの公式ページを参照して、要件にあったバージョンのdockerを導入してください。インストール手順は省きます。  
https://rancher.com/docs/rke/v0.1.x/en/os/

```
$ docker version
Client:
 Version:      17.03.1-ce
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Mon Mar 27 17:05:44 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.03.1-ce
 API version:  1.27 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Mon Mar 27 17:05:44 2017
 OS/Arch:      linux/amd64
 Experimental: false
```

### 公開鍵認証の設定
RKEでkubernetesをインストールする際に、ノードへのアクセスを公開鍵認証で行うため、設定を行います。
手順は省略しますが、以下を参考にしてください。

* ssh公開鍵認証設定まとめ：https://qiita.com/ir-yk/items/af8550fea92b5c5f7fca
* 公開鍵認証を設定してsshで接続する：https://qiita.com/Yuta_Fujiwara/items/827ea0a9b37d20941c51


## 2. RKEによる、Kubernetesのインストール

### RKEとは
Rancher Kubernetes Engine（RKE）は、軽量のKubernetesインストーラで、ベアメタルおよび仮想化サーバーへのインストールをサポートします。

### 導入要件の確認
以下の公式ページで、要件を満たしていることを確認します。  
https://rancher.com/docs/rke/v0.1.x/en/os/

### RKEのインストール

1. RKEのバイナリファイルをダウンロードします（ https://github.com/rancher/rke/releases ）。バイナリファイルを $PATH にあるフォルダにおいて、名前をrkeに変更します。

    ```
    $ mv rke_linux-amd64 rke
    ```

2. RKEを実行できるように、権限を変更します。

    ```
    $ chmod +x rke
    ```

3. RKEが実行可能なことを確認します。

    ```
    $ rke --version
    rke version v0.1.11
    ```

4. cluster.ymlの準備
 
    RKEはcluster.ymlと呼ばれるクラスタ構成ファイルを使用して、クラスタ内のノードとKubernetesの展開方法を決定します。cluster.ymlを作成するのに以下の２つの方法が用意されています。今回は、サンプルを使って最小限のcluster.ymlを作成します。
   * 最小限のサンプルを元に、自分で作成する。（ https://rancher.com/docs/rke/v0.1.x/en/example-yamls/#minimal-cluster-yml-example ）
   * rke config コマンドを利用する

    ``` cluster.yml
    nodes:
        - address: <サーバIP>  # ノードのIPアドレス
          user: <ユーザ名>  # ログインユーザ
          role:
            - controlplane  # 今回はオールインワンなので、すべての役割を追加
            - etcd
            - worker
          ssh_key_path: ~/.ssh/id_rsa  # 秘密鍵のフォルダパス

    ingress:
        provider: nginx  # ingressサービスの設定（ロードバランサ）
    ```
5. kubernetes clusterのデプロイ

    cluster.ymlを作成したら、以下の簡単なコマンドでclusterをデプロイ可能です。

    ```
    $ rke up

    INFO[0000] Building Kubernetes cluster
    INFO[0000] [dialer] Setup tunnel for host [10.0.0.1]
    INFO[0000] [network] Deploying port listener containers
    INFO[0000] [network] Pulling image [alpine:latest] on host [10.0.0.1]
    ...
    INFO[0101] Finished building Kubernetes cluster successfully
    ```

    最後の行に、**Finished building Kubernetes cluster successfully** が表示されたら準備完了です。

    **注意**
    * dockerコマンドを実行できるユーザでログインする必要あり。
        * ログインユーザを**dockerグループに追加しておく**。

1. kubectlのインストール

    kubenertesクラスタを操作するために、kubectlをインストールします( https://kubernetes.io/docs/tasks/tools/install-kubectl/ )

    ```
    $ sudo cat <<EOF > /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
    enabled=1
    gpgcheck=1
    repo_gpgcheck=1
    gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    EOF
    $ sudo yum install -y kubectl
    $
    ```

    kubectlが正常にインストールできていることを確認します。また、`docker ps`コマンドを実行すると、kubernetes関連のコンテナが起動していることが確認できます。


    ```
    $ kubectl version
    Client Version: version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.2", GitCommit:"17c77c7898218073f14c8d573582e8d2313dc740", GitTreeState:"clean", BuildDate:"2018-10-24T06:54:59Z", GoVersion:"go1.10.4", Compiler:"gc", Platform:"linux/amd64"}
    The connection to the server localhost:8080 was refused - did you specify the right host or port?
    $
    $ kubectl --kubeconfig kube_config_cluster.yml get nodes
    NAME           STATUS   ROLES                      AGE   VERSION
    XXX.XXX.XXX.XXX   Ready    controlplane,etcd,worker   5m    v1.11.3
    $
    ```

## 3. Rancher 2.0の導入

### Rancherとは
Rancherは、本番環境でコンテナを展開する組織向けに構築されたコンテナ管理プラットフォームです。Rancherは、Kubernetesクラスタの認証、アクセス制御、および監視をサポートします。以下のようなことが可能です。

1. Active Directoryの資格情報を使用して、Kubenetesにアクセスすることができます。
2. 全てのユーザ、グループ、プロジェクト、クラスタ、およびクラウドにわたるアクセス制御とセキュリティポリシーを設定し、適用できます。
3. web上の単一画面から、Kubenetesクラスタのヘルスチェックや容量を確認できます。

### インストール

1. Rancherのバージョンの選択

    以下の３つのバージョンから、選択可能です。今回は、rancher/rancher:latestを利用します。
   * rancher/rancher:latest: 最新の開発環境です。本番環境への利用は推奨されません。
   * rancher/rancher:stable: 本番環境への利用が推奨されます。
   * rancher/rancher:\<v2.X.X>: DockerHubでバージョンを確認して選択してください。  
    DockerHubのURL: https://hub.docker.com/r/rancher/rancher/

2. SSLオプションの選択とRancherのインストール

    セキュリティのため、Rancherを使うにはSSL通信が必要です。SSLによって、Rancherへのログインやクラスタ操作などの際に、ネットワークのセキュリティ対策を行います。よく使いそうなパターン２つを以下で紹介します。  
   
* パターン１: デフォルトの自己証明書  
        開発環境の場合は、Rancherが生成する自己署名書を利用してインストールする。下記インストールオプションは、自分で自己証明書を生成する手間を省きます。

       ```
        $ docker run -d --restart=unless-stopped \
        -p 81:80 -p 444:443 \
        rancher/rancher:latest
       ```

* パターン2: Let's Encryptを利用する
        本番環境の場合は、Let's Encrypを使用するオプションがあります。Let's Encryptはhttp-01を利用して、ドメインの確認を行います。下記コマンドを<YOUR.DNS.NAME>

      **事前確認事項**
      * DNSにドメインの名前解決の設定をしておく
      * 80番ポートを開けておく

       ```
        $ docker run -d --restart=unless-stopped \
        -p 81:80 -p 444:443 \
        rancher/rancher:latest \
        --acme-domain <YOUR.DNS.NAME>
       ```
 **注意**
 * シングルノードにkubenetes clusterとRacher Serverを導入する際は、ingressのポートとRancherのポートがバッティングしてしまうため、適宜Rancherのポートを変更してください。今回は、適当に81/444ポートを利用します。

     **Proxyを使う場合**: https://rancher.com/docs/rancher/v2.x/en/installation/single-node/proxy/


## 4. Rancherへの既存kubernetesクラスタの認識

### Rancherサーバへのログイン
https://<サーバIP>:444/  にアクセスすると、以下の admin のパスワード設定画面が出現するので、設定してください。(初期ユーザID/パスワードは、admin/admin です)

![rancher1.PNG](https://qiita-image-store.s3.amazonaws.com/0/62976/15bdedbd-5231-4559-8871-bd0839465dea.png)

RancherサーバのURLを設定します。

![さーばIP.PNG](https://qiita-image-store.s3.amazonaws.com/0/62976/725ef2a8-7464-2ec5-9ce9-57a23f83a73d.png)

画面右下で、日本語に切り替え可能です。

![言語設定.PNG](https://qiita-image-store.s3.amazonaws.com/0/62976/d4e4de21-f535-0ceb-9c1d-619baaf26e56.png)

### クラスタの追加
1. [クラスタ]タブをクリックし、画面中央の[クラスタを追加]をクリックします。
2. クラスタを追加で、**IMPORT**をクリックします。
3. クラスタ名を入力します。
4. [作成]をクリックします。

![クラスタついか１.PNG](https://qiita-image-store.s3.amazonaws.com/0/62976/d2c40ee8-7bf8-c759-35f5-e993bbfbbe3a.png)
5. 一番下のコマンドをコピーし、ノードであるサーバ上で実行します。

![クラスタ２.PNG](https://qiita-image-store.s3.amazonaws.com/0/62976/68996b49-7b18-8f52-f60b-6a268a9c83be.png)
6. 少し待つと、Rancherにクラスタが認識されます。

![認識.PNG](https://qiita-image-store.s3.amazonaws.com/0/62976/32a947a6-2acf-cc66-86dd-8e501e6a5c5c.png)

## 今後
コンテナの監視や、デプロイについて書こうと思っています。Go言語もやりたいな～

## 参考
以下の記事を参考にさせていただきました。ありがとうございます。  

* Qiitaの記事
    * ssh公開鍵認証設定まとめ：https://qiita.com/ir-yk/items/af8550fea92b5c5f7fca
    * 公開鍵認証を設定してsshで接続する：https://qiita.com/Yuta_Fujiwara/items/827ea0a9b37d20941c51
* Rancher公式
    * Requirement：https://rancher.com/docs/rke/v0.1.x/en/os/
    * Rancher dockerイメージ：https://hub.docker.com/r/rancher/rancher/
    * HTTP Proxy Configuration:：https://rancher.com/docs/rancher/v2.x/en/installation/single-node/proxy/
    * Install and Set Up kubectl：https://kubernetes.io/docs/tasks/tools/install-kubectl/
    * Config Options：https://rancher.com/docs/rke/v0.1.x/en/config-options/https://rancher.com/docs/rke/v0.1.x/en/config-options/