spreadを使ってkubernetesにmattermostのコンテナをデプロイしてみよう！

## 1. やりたいこと

Dockerコンテナを利用したデプロイングツールって何かあるのかなー、と探してると[kubernetes](https://github.com/kubernetes/kubernetes)やAWSのECSに行き当たります。

内部のソースも読むことも可能、ということでkubernetesさんに触ってみたのですが、Pods, Services, ReplicationControllers等の設定が多くてちょっとお手軽感があまりないような。。
ということで良さげなツールないかなー、と、探していたら以下の２つを見つけました。

* [spread](https://github.com/redspread/spread)
* [helm](https://github.com/helm/helm)

どちらも同じことが出来そうですが、先に見つけたspreadの方を試してみることにしました。

## 2. 実施手順

1. AWSのシングルインスタンスに、k8sのサービスを構築する
2. 手元のMacOSにkubectlをダウンロードしてパスを通し、AWSのk8sへの接続設定をする
3. 手元のMacOSにspreadをインストールする
4. mattermost用のspreadの定義をgitからcloneする
5. spred deployコマンドを利用してmattermostをデプロイする

## 3. 実施詳細

### 3-1. AWSのシングルインスタンスに、k8sのサービスを構築する

* [etcd](https://github.com/coreos/etcd)をインストールします。

```bash
curl -L  https://github.com/coreos/etcd/releases/download/v2.3.0-alpha.1/etcd-v2.3.0-alpha.1-darwin-amd64.zip -o etcd-v2.3.0-alpha.1-darwin-amd64.zip
unzip etcd-v2.3.0-alpha.1-darwin-amd64.zip
cd etcd-v2.3.0-alpha.1-darwin-amd64
```

* [kubernetes](https://github.com/kubernetes/kubernetes)をgit cloneします。

```bash
git clone https://github.com/kubernetes/kubernetes
cd kubernetes
```

* hack/local-up-cluster.sh の中の`localhost`及び`127.0.0.1`を`0.0.0.0`に書き換えます。

* [etcd](https://github.com/coreos/etcd)を`PATH`に通します。

```bash
export PATH=$PATH:/path/to/etcd
```

* cluster/kubectl.shで、serverのアドレスを設定します。

```bash
cluster/kubectl.sh config set-cluster local --server=http://*.*.*.*:8080 --insecure-skip-tls-verify=true
```

* k8sを起動します。

```
hack/local-up-cluster.sh
```

### 3-2. 手元のMacOSにkubectlをダウンロードしてパスを通し、AWSのk8sへの接続設定をする

* kubectlをダウンロードします

```bash
export K8S_VERSION=1.2.0-alpha.7
wget http://storage.googleapis.com/kubernetes-release/release/v${K8S_VERSION}/bin/linux/amd64/kubectl

export PATH=$PATH:`pwd`
```

* kubectlでAWS上のk8sのIP設定をする

```bash
kubectl config set-cluster local --server=http://*.*.*.*:8080 --insecure-skip-tls-verify=true
``` 


### 3-3. 手元のMacOSにspreadをインストールする

ここは[README](https://github.com/redspread/spread#installation)にある通りコマンド二発で実施できました＾＾

```bash
sudo brew tap redspread/spread
sudo brew install spread
```

### 3-4. mattermost用のspreadの定義をgitからcloneする

```bash
git clone https://github.com/redspread/kube-mattermost.git
cd kube-mattermost
```

### 3-5. spred deployコマンドを利用してmattermostをデプロイする

* .k2e/app-service.ymlで、portsとexternalIpsを編集する

```.k2e/app-service.yml
apiVersion: v1
kind: Service
metadata:
  name: mattermost-app
spec:
  selector:
    app: mattermost-app
  ports:
  - name: http
    protocol: TCP
    port: 8081
    targetPort: 80
  externalIPs:
    - *.*.*.*
    - x.x.x.x
```

* spread deploy ./ を実施する

```bash
spread deploy ./
```

* 作成できたかkubectlで確認してみる


```bash
kubectl get services
```

```bash
NAME             CLUSTER-IP   EXTERNAL-IP                  PORT(S)     SELECTOR              AGE
kubernetes       10.0.0.1     <none>                       443/TCP     <none>                1h
mattermost-app   10.0.0.100   *.*.*.*,x.x.x.x   8081/TCP    app=mattermost-app    4s
nginx            10.0.0.27    *.*.*.*,x.x.x.x   80/TCP      name=nginx            5m
redis-sentinel   10.0.0.234   <none>                       26379/TCP   redis-sentinel=true   45m
````


* 作成できたかWebブラウザで確認してみる

![スクリーンショット 2016-03-10 10.18.13.png](https://qiita-image-store.s3.amazonaws.com/0/49547/5048b8a7-b4c5-b870-82eb-10367b20b7bd.png)

動いているみたいですね＾＾

## 4. 所感

* kubernetesの環境や設定ファイル群が手元にあるのであれば、お手軽なコマンドラインツールとして利用するのはアリだと思いました。
* どちらかというとGUIでkubernetesで利用するPods, SVC, RC等のymlを生成してくれるyed的なツールがほしい('-'*)
* helmの方は、k8sのgithubのREADMEにも載ってたしこっちのが主流なのかな。ちょっと見てみたいです。
* spreadのソースコードはk8sのapiを叩いてる、というシンプルな作りなのでがっつり見てみたいです。


## 5. 参考


* [etcdのインストール手順](https://github.com/coreos/etcd/releases)
* [kubernetesのインストール手順](http://kubernetes.io/v1.1/docs/getting-started-guides/locally.html)
* [Dockerで簡単にSlackライクなmattermostを動かしてみよう！](http://qiita.com/letusfly85/items/475c6cbdfbbce93c8795)
* [SlackクローンのMattermostを使ってみる - 導入、初期設定編-](http://qiita.com/terukizm/items/4a4016d8ec5a21856e4f)
* [kubernetesのservicesの設定について](http://kubernetes.io/v1.1/docs/user-guide/services.html#type-loadbalancer)

---

本日は以上となります。