VagrantでKubernetesクラスタを立てる



http://kubernetes.io/v1.1/docs/getting-started-guides/vagrant.html

がVagrantの公式ドキュメントだが、OSがFedoraよりCoreOSの方が良かったり、ドキュメントがCoreOSの人がちゃんとメンテしていて読みやすかったりするので、CoreOSの公式ドキュメントの

http://kubernetes.io/v1.1/docs/getting-started-guides/coreos.html

のMulti-nodeを立てるドキュメント

https://coreos.com/kubernetes/docs/latest/kubernetes-on-vagrant.html

を使う。


## kubectl の設定

kubectlは既に`gcloud`のコマンドでインストール済み (cf. [gcloudでのkubectlのインストール](http://qiita.com/awakia/items/95f0cde74301cebb4ff7#kubectl-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB) )

```bash
$ which kubectl
/Users/awakia/google-cloud-sdk/bin/kubect
```

1からのインストールではないので、kubectlが扱うクラスタ環境の切り替えを考えないといけない。

### 対象クラスタの変更

まずはkubectlした時にgcloudをいじる設定になっているのを変える。
とりあえず、現状確認:

```bash
$ kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: REDACTED
    server: https://104.155.208.215
  name: gke_kube-test-awakia_asia-east1-a_cluster-1
contexts:
- context:
    cluster: gke_kube-test-awakia_asia-east1-a_cluster-1
    user: gke_kube-test-awakia_asia-east1-a_cluster-1
  name: gke_kube-test-awakia_asia-east1-a_cluster-1
current-context: gke_kube-test-awakia_asia-east1-a_cluster-1
kind: Config
preferences: {}
users:
- name: gke_kube-test-awakia_asia-east1-a_cluster-1
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
    password: CdsJ7IG1H1laOofO
    username: admin
```

ここから設定

```bash
$ kubectl config set-cluster vagrant --server=https://172.17.4.101:443 --certificate-authority=${PWD}/ssl/ca.pem
$ kubectl config set-credentials vagrant-admin --certificate-authority=${PWD}/ssl/ca.pem --client-key=${PWD}/ssl/admin-key.pem --client-certificate=${PWD}/ssl/admin.pem
$ kubectl config set-context vagrant --cluster=vagrant --user=vagrant-admin
$ kubectl config use-context vagrant
```

詳細は https://coreos.com/kubernetes/docs/latest/configure-kubectl.html 参照。
これを打ったあと`kubectl config view`は以下のように変わる

```diff:kubctl_config_view
 apiVersion: v1
 clusters:
 - cluster:
     certificate-authority-data: REDACTED
     server: https://104.155.208.215
   name: gke_kube-test-awakia_asia-east1-a_cluster-1
+- cluster:
+    certificate-authority: /Users/awakia/src/github.com/coreos/coreos-kubernetes/multi-node/vagrant/ssl/ca.pem
+    server: https://172.17.4.101:443
+  name: vagrant
 contexts:
 - context:
     cluster: gke_kube-test-awakia_asia-east1-a_cluster-1
     user: gke_kube-test-awakia_asia-east1-a_cluster-1
   name: gke_kube-test-awakia_asia-east1-a_cluster-1
+- context:
+    cluster: vagrant
+    user: vagrant-admin
+  name: vagrant
-current-context: gke_kube-test-awakia_asia-east1-a_cluster-1
+current-context: vagrant
 kind: Config
 preferences: {}
 users:
 - name: gke_kube-test-awakia_asia-east1-a_cluster-1
   user:
     client-certificate-data: REDACTED
     client-key-data: REDACTED
     password: CdsJ7IG1H1laOofO
     username: admin
+- name: vagrant-admin
+  user:
+    client-certificate: /Users/awakia/src/github.com/coreos/coreos-kubernetes/multi-node/vagrant/ssl/admin.pem
+    client-key: /Users/awakia/src/github.com/coreos/coreos-kubernetes/multi-node/vagrant/ssl/admin-key.pem
```

シェルで打ったコマンドとの対応もわかりやすいDiffになっている。
つまり今後のGKEとの切り替えは、

```bash
$ kubectl config use-context gke_kube-test-awakia_asia-east1-a_cluster-1
```

だけで出来る。

## CoreOS+Kubernetes の Vagrant を立てる

```
$ git clone https://github.com/coreos/coreos-kubernetes.git
$ cd coreos-kubernetes/multi-node/vagrant
$ vagrant up
```

で終わり。このgitリポジトリには他にも同じ設定でawsに立てるようのGoのプログラムも用意されていたりする。

クラスタの構成の変更は、基本的なものなら

```bash
$ cp config.rb.sample config.rb
```

して、できる以下のファイルをいじればOK。

```ruby:config.rb
$update_channel="alpha"

$controller_count=1
$controller_vm_memory=512

$worker_count=1
$worker_vm_memory=512

$etcd_count=1
$etcd_vm_memory=512
```

## 設定できたか確認

```
kubectl get nodes
NAME           LABELS                                STATUS
172.17.4.201   kubernetes.io/hostname=172.17.4.201   Ready
```

vagrantの方のStateがきちんと見えていればOK。

## クラスタ上に載せるもの

kubernetes で Go言語実装のGuestbookを立ててみるのとか良い

http://kubernetes.io/v1.1/examples/guestbook-go/README.html