OSS 版 drone.io 0.4 の環境を Kubernetes で構築

#概要

drone0.4 の plugin が増えてきたので、0.3からのバージョンアップを検討中。
プラグインのリストは[ここ](http://readme.drone.io/plugins/)から確認できる。

drone0.4環境については、Docker 化のついでに kubernetes で構築する。
kubernetes の構築はめんどいので GKE を利用する。

レポジトリは [Bitbucket](https://bitbucket.org) を利用。

#kubernetes 環境構築

コンテナクラスタ作成するのみ。

[以前](http://qiita.com/quickguard/items/9fdf263b2f822474305c)作成した terraform のコードを利用。
drone の sqlite データベース用の Persistent Disk 用の tf ファイルを追加する。
ディスク名(ここでは drone-data-disk)は kubernetes の設定時にも使用するのでひかえておく。

```:disk.ft
resource "google_compute_disk" "drone" {
  name = "drone-data-disk"
  type = "pd-ssd"
  zone = "${var.zone}"
  size = 10
}
```

また、PD マウントのため、ノードインスタンスにコンピュート権限を追加する必要がある（oauth_scopes に追加）

```:container_cluster.tf
resource "google_container_cluster" "default" {
  name = "${var.cluster_name}"
  zone = "${var.zone}"
  network = "${var.network}"
  initial_node_count = "${var.initial_node_count}"

  node_config {
    machine_type = "${var.machine_type}"
    disk_size_gb = "${var.disk_size}"
    oauth_scopes = [
      "https://www.googleapis.com/auth/compute"
    ]
  }

  master_auth {
    username = "${var.master_auth_username}"
    password = "${var.master_auth_password}"
  }

}
```

terraform apply が完了したら kubectl の認証情報を取得。

```
$ gcloud container clusters get-credentials cluster-1
```

#kubernetes で drone の Service を作成

まずはサービス用マニフェストを作成

```:drone-service.yml
apiVersion: v1
kind: Service
metadata:
  name: drone
  labels:
    name: drone
spec:
  type: LoadBalancer
  selector:
    name: drone
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80
```

Service 作成

```
$ kubectl create -f drone-service.yml
service "drone" created
```

LB の IP アドレスを確認（EXTERNAL_IP）

```
$ kubectl get svc
NAME         CLUSTER_IP     EXTERNAL_IP       PORT(S)   SELECTOR     AGE
drone        10.55.252.25   xxx.xxx.xxx.xxx   80/TCP    name=drone   2m
```

#Bitbucket の設定

**コンシューマキーの登録**
右上メニューの「Settings」→「OAuth」で コンシューマキーを追加。

**入力内容**
Name： 適当に
Callback URL：  http://｛先ほど確認した LB の IP アドレス｝/authorize
権限： 以下の通り
![01.png](https://qiita-image-store.s3.amazonaws.com/0/105824/4435ce8c-20b8-daff-f60d-1d2941c60d87.png)

保存して、「鍵」と「Secret」の情報をひかえておく。



#kubernetes で ReplicationController 作成

レプリケーションコントローラ用マニフェストを作成

```:drone-rc.yml
apiVersion: v1
kind: ReplicationController
metadata:
  name: drone
  labels:
    name: drone
spec:
  replicas: 1
  selector:
    name: drone
  template:
    metadata:
      labels:
        name: drone
    spec:
      containers:
      - name: drone
        image: drone/drone:0.4
        env:
        - name: SERVER_ADDR
          value: ":80"
        - name: DATABASE_DRIVER
          value: sqlite3
        - name: DATABASE_CONFIG
          value: /var/lib/drone/drone.sqlite
        - name: REMOTE_DRIVER
          value: bitbucket
        - name: REMOTE_CONFIG
          value: https://bitbucket.org?client_id=｛Bitbucketの鍵｝&client_secret=｛BitbucketのSecret｝&open=true
        ports:
          - containerPort: 80
            protocol: TCP
        volumeMounts:
          - mountPath: /var/lib/docker
            name: docker
          - mountPath: /var/run/docker.sock
            name: docker-socket
          - mountPath: /var/lib/drone
            name: drone-db
      volumes:
        - name: docker
          hostPath:
            path: /var/lib/docker
        - name: docker-socket
          hostPath:
            path: /var/run/docker.sock
        - name: drone-db
          gcePersistentDisk:
            pdName: drone-data-disk
            fsType: ext4
```

ReplicationController 作成

```
$ kubectl create -f rc.yml
replicationcontroller "drone" created
```

#アカウントの登録

Drone の UI にアクセスする。
http://｛先ほど確認した LB の IP アドレス｝/

![02.png](https://qiita-image-store.s3.amazonaws.com/0/105824/f9ee5d54-8ea4-651e-b6f9-6ac644b9c4d1.png)

ログインを押して、Bitbucket アカウントでログインして、アクセス許可する。
![03.png](https://qiita-image-store.s3.amazonaws.com/0/105824/a5fc08ed-fd22-a74c-41be-f5980355ae3b.png)

ダッシュボードにレポジトリの一覧が表示されたらOK。
![04.png](https://qiita-image-store.s3.amazonaws.com/0/105824/80e85e74-5a6f-b27b-7044-61c5689f483f.png)


とりあえず初期構築はここまで。
CI については別途。