Rancher+Kubernetes+AWSでマイクロサービス基盤環境構築　〜シリーズスタート(1)　Rancer Serverクラスタ構築〜

# 背景・目的
Dockerでサーバー構築やアプリを実行することが世の中には結構流行っている。特に、OSやライブラリの設定などの手続きを省いてくれるおかげでサービスをスピーディーに提供することが実現できている。一方的に、サービスの増加に伴い、サーバやアプリの数も増える、Dockerの管理も課題となる。株式会社フリックフィットでは世の中の人に靴をレコメンドするために、ユーザ、販売店、流通などの分野を繋いでいる。そのため、いろいろなサービスを提供している、サービスを支えるためのサーバーやアプリを管理することが非常に重要な課題となる。
弊社のサービスはもちろん全部AWSでDocker環境で実行している。開発をより効率的に進められるため、kubernetesを導入してみたいと考えた。さらに、AWSに簡単にkubernetesクラスタを構築できるようにrancherと出会った。
この記事で、自分がkubernetesクラスタでサービスを構築する際に、勉強した知識、仕事中の心得をまとめてメモをして書いたんだ。kubernetesを利用したい方もご参考になればすごく嬉しいと思う。

# 自己紹介
在日中国人で、総合電機メーカからスタートアップを経験し、開発からSEまでの仕事をされている。現在、株式会社フリックフィットに勤めている。アーキテクチャやインフラまわりの仕事をメインで苦闘中。

連絡先：wisdom.zhenbin@gmail.com

# Rancher Serverクラスタの構築
初めてのブログはRancher Serverの構築を始めたいと思う。
Rancherドキュメントの参考URL: http://rancher.com/docs/rancher/v1.6/en/installing-rancher/installing-server/

## 実行環境
DNS: Route 53
サーバー: EC2
OS: Ubuntu 16.04LTS
Docker: 17.12.0-ce, build c97c6d6
ソフトウェア： 
 - Nginx 1.10.3(Ubuntu)
 - Rancher Server Docker Image Rancher/server:stable(Rancher v1.6.14対応)
 - MySQL 5.7
 

## システム構成図
![Racher-server.png](https://qiita-image-store.s3.amazonaws.com/0/150705/2d207d41-5efc-4066-f4ca-2902305c2f76.png)

## システム構成概要
Rancher Serverを構築するためには、Docker Imageを使って簡単にできる。本番環境に使うのにHAにしないといけないため、三つのRancher Serverを立ち上げた。データベースはAWSのRDSサービスを利用している。
Nginxサーバはロードバランサとして動いている。
ここで、AWSのELBを使っていない理由はちょっと個人的にめんどくさいと思うだけだ。Rancher Serverは**websocket**通信を利用しているからELBを使うために、いろいろ設定しないといけないんだ。もちろんELBに詳しい方におすすめをするが、個人的にNginxになれるから、ELBを使わないのを選択した。

## システム設定

### Nginxの設定:

```
upstream rancher {
    ip_hash;
    server 172.31.25.168:8080 max_fails=2 fail_timeout=5s;
    server 172.31.13.85:8080 max_fails=2 fail_timeout=5s;
    server 172.31.22.73:8080 max_fails=2 fail_timeout=5s;

}

map $http_upgrade $connection_upgrade {
    default Upgrade;
    ''      close;
}

server {
    listen 8443 ssl ssl;
    server_name xxx.xxx.com;
    ssl_certificate /etc/ssl/certs/xxx.crt;
    ssl_certificate_key /etc/ssl/private/xxx.key;
    error_page 497 301 =307 https://xxx.xxx.com:8443$request_uri;

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://rancher;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_read_timeout 900s;
    }
}

server {
    listen 80;
    server_name xxx.xxx.com;
    return 301 https://$server_name$request_uri;
}
```
TODO: 
1. セッションを維持するために、nginxがロードバランスを行う際に、「**ip_hash**」を追加しないといけない。ただし、「ip_hash」でクライアントが同じIPに対していつも同じサーバーにトラフィックを誘導するので、ロードバランスの効率が悪すぎる。そのため、**sticky cookie**を利用したほうが効率的だと思う。しかし、nginxでsticky cookieを設定するために、pluginをいれないといけないため、ソースコードからビルドをすることが手間かかる。kubernetesを早めに体験したいから、一旦諦める。  
2. nginxが一個で実行しているので、なんか問題が発生すると、サービスが使えなくなる恐れがある。そのため、今後、サーバーにmonitを入れてnginx状態を監視する。nginxが死んだら、自動的に再起動され、メールで通報することが可能です。

TIPS:
EC2インスタンスのタイプは最低限t2.smallをおすすめだ。最初にはt2.microとしたんだけど、アクセスしたら、反応がめちゃくちゃ遅いんだ。smallに変更したら、結構軽くなる。

### Rancher Serverコンテナ立ち上げ：
コンテナ起動のコマンド：

```
docker run -d --restart=unless-stopped -p 8080:8080 -p 9345:9345 rancher/server:stable --db-host xxxx.ap-northeast-1.rds.amazonaws.com --db-port xxxx --db-user xxxx --db-pass xxxx --db-name xxxx --advertise-address 172.31.25.168
```

- 8080ポートはRancher Serverが外と通信用のポートだ。
- 9345ポートはRancher Serverのノードがクラスタを組むために通信用のポートだ。
- 「--advertise-address」は自分のIPをクラスタに宣言する。

### Rancher UIへアクセス
Rancher Serverクラスタが立ち上げてから、Rancher UIへアクセスすることが可能だ。
![rancher.png](https://qiita-image-store.s3.amazonaws.com/0/150705/241751e6-fb48-312d-dfb6-335345379ec6.png)

[次回](https://qiita.com/mikezhan/items/764e9a814d32e8ed56ec)にRancher UIの設定およびkubernetesクラスタを立ち上げの方法を紹介する。