etcd-opratorについて

この記事は[Kubernetes Advent Calendar 2016](http://qiita.com/advent-calendar/2016/kubernetes)の14日目の記事です。

CoreOSが開発している`etcd-operator`を試してみたので、その内容を書いていきたいと思います。
今回は[公式リポジトリ](https://github.com/coreos/etcd-operator)のサンプルを利用して試してみました。

# etcd-operatorとは
Operatorと呼ばれるKubernetes上で状態を維持するためのツールを使用して、
軽量KVSであるetcdのクラスタの作成・設定・管理を容易にしてくれるソフトウェアです。

# 環境
ローカルにminikubeを使用してkubernetesの環境を用意しました。

- MacOS (El Capitan) ver10.11.6
- minikube v0.13.1
- VirtualBox v5.0.26

# 使用方法
はじめに、[公式リポジトリ](https://github.com/coreos/etcd-operator)内の定義ファイルを使用する為にリポジトリをクローンしてきます。

```shell
$ git clone https://github.com/coreos/etcd-operator.git
```
## etcd-operatorの作成
公式リポジトリ内の定義ファイルを使用して`etcd-operator`を作成します。

```shell
$ cat example/deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: etcd-operator
  spec:
    replicas: 1
    template:
      metadata:
        labels:
          name: etcd-operator
      spec:
        containers:
        - name: etcd-operator
          image: quay.io/coreos/etcd-operator
          env:
          - name: MY_POD_NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace

$ kubectl create -f example/deployment.yaml
deployment "etcd-operator" created
```
`etcd-operator`は作成されると自動でThridPartyResourceを追加します。

```shell
$ kubectl get thirdpartyresources
NAME                      DESCRIPTION             VERSION(S)
etcd-cluster.coreos.com   Managed etcd clusters   v1
```

# etcdクラスタの構築
次に、下記定義ファイルを使用してetcdクラスタを構築します。

```shell
$ cat example/example-etcd-cluster.yaml

apiVersion: "coreos.com/v1"
kind: "EtcdCluster"
metadata:
  name: "example-etcd-cluster"
spec:
  size: 3
  version: "v3.1.0-alpha.1" 

$ kubectl create -f example/example-etcd-cluster.yaml
etcdcluster "example-etcd-cluster" created
```
`example-etcd-cluster.yaml`内の`size`が3となっていますが、これがetcdクラスタの数になります。この数は自由に変更可能です。今回はデフォルトのままにしています。

作成したetcdクラスタの実態はPodと、Serviceとなり、クラスタの数だけそれぞれ作成されます。
今回だとPodとServiceが3つずつ作成されている事を確認できます。

```
$ kubectl get pods
example-etcd-cluster-0000       1/1       Running   0          50s
example-etcd-cluster-0001       1/1       Running   0          22s
example-etcd-cluster-0002       1/1       Running   0          7s

$ kubectl get svc
example-etcd-cluster-0000   10.0.0.35    <none>        2380/TCP,2379/TCP   1m
example-etcd-cluster-0001   10.0.0.42    <none>        2380/TCP,2379/TCP   57s
example-etcd-cluster-0002   10.0.0.94    <none>        2380/TCP,2379/TCP   42s
```

これで`etcd-operator`とetcdクラスタの構築ができました。

構築ができたので、etcdクラスタのスケールアウトを試していきたいと思います。

## etcdクラスタのスケールアウト
本来であれば上記`example-etcd-cluster.yaml`内の`size`を変更するだけでクラスタのサイズが変更できるはずなのですが、2016/12現在不具合があるようでcurlを使用した回避方法が提供されています。

curlを利用してスケールアウトさせる為に事前にプロキシを起動させます。

```
$ kubectl proxy --port=8080
```
プロキシ起動後、下記内容のjsonファイルを作成します。

```json:body.json
{
  "apiVersion": "coreos.com/v1",
  "kind": "EtcdCluster",
  "metadata": {
    "name": "example-etcd-cluster",
    "namespace": "default"
  },
  "spec": {
    "size": 5
  }
}
```
ここで指定している`size`がクラスタの数になるので、現在の3より大きい5を指定します。
準備ができたら`body.json`をcurlでPUTしてスケールアウトさせます。

```
$ etcd-operator shinichi$ curl -H 'Content-Type: application/json' -X PUT --data @body.json http://127.0.0.1:8080/apis/coreos.com/v1/namespaces/default/etcdclusters/example-etcd-cluster
```
curlでのPUT実行あと、下記コマンドでetcdクラスタを確認してみます。

```
NAME                            READY     STATUS    RESTARTS   AGE
example-etcd-cluster-0000       1/1       Running   0          25m
example-etcd-cluster-0001       1/1       Running   0          24m
example-etcd-cluster-0002       1/1       Running   0          24m
example-etcd-cluster-0003       1/1       Running   0          12m
example-etcd-cluster-0004       1/1       Running   0          12m
```
etcdクラスタの数が3から5にスケールアウトされていることが確認できました!

# まとめ
簡単ではありますが`etcd-operator`を触ってみました。
まだ`alpha`版なので上手く動かないこともありますが、etcdクラスタの管理・操作は従来と比べて簡単にはなっているのかなと感じました。
ただ、`etcd-operator`が実運用に有効かといわれると、簡単に触っただけではまだ分からないのが正直なところです。
面白そうではあるので、今後も注目していきたいと思います。