kubernetes自体をdockerで立てる（AWS EC2）hyperkube

kubernetesの構築方法は色々あるが、CentOSの場合は7が推奨されている。
例えばCentOS6や、EC2 Amazon Linuxでは実現できないか？というと、kubernetes自体をdockerベースで起動する方法がある。「Hyperkube」
Amazon Linux上で試してみた。

基本は以下をベースにしてます。
1ホスト上での実装です。

https://github.com/kubernetes/kubernetes/blob/release-1.1/docs/getting-started-guides/docker.md

前提条件としてEC2(Amazon Linux)を起動する。

##1. dockerをインストール

参照
http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/docker-basics.html

##2. etcdコンテナを起動

```
docker run --net=host -d gcr.io/google_containers/etcd:2.0.12 /usr/local/bin/etcd --addr=127.0.0.1:4001 --bind-addr=0.0.0.0:4001 --data-dir=/var/etcd/data
```

gcr.io/google_containers/etcd:<バージョン>は、etcdのdocker image
127.0.0.1:4001はetcdの待ち受けアドレスとport。
etcd APIで以下のようにうつと、応答が返ってくる

```
$ curl -L http://127.0.0.1:4001/v2/keys/
{"action":"get","node":{"dir":true,"nodes":[{"key":"/registry","dir":true,"modifiedIndex":3,"createdIndex":3}]}}
```

##3. kubernetesコンテナを起動

```
docker run \
    --volume=/:/rootfs:ro \
    --volume=/sys:/sys:ro \
    --volume=/dev:/dev \
    --volume=/var/lib/docker/:/var/lib/docker:ro \
    --volume=/var/lib/kubelet/:/var/lib/kubelet:rw \
    --volume=/var/run:/var/run:rw \
    --net=host \
    --pid=host \
    --privileged=true \
    -d \
    gcr.io/google_containers/hyperkube:v1.1.3 \
    /hyperkube kubelet --containerized --hostname-override="127.0.0.1" \
                       --address="0.0.0.0" --api-servers=http://localhost:8080 \
                       --config=/etc/kubernetes/manifests
```
以下はproxy用

```
docker run -d --net=host --privileged gcr.io/google_containers/hyperkube:v1.1.3 /hyperkube proxy --master=http://127.0.0.1:8080 --v=2
```


gcr.io/google_containers/hyperkube:<バージョン>はkubernetesのコンテナイメージで、起動すると以下のKubernetesコンポーネントが起動する

・scheduler
・controller-manager
・kubelet
・apiserver
・kube-proxy

※単一ホスト実装なので、flannelは不要

各種コンテナが起動できていることを確認

```
$ docker ps
CONTAINER ID        IMAGE                                       COMMAND                  CREATED             STATUS              PORTS               NAMES
1db67e19cc50        gcr.io/google_containers/hyperkube:v1.1.3   "/hyperkube proxy --m"   50 minutes ago      Up 50 minutes                           cranky_engelbart
81e0be46543a        gcr.io/google_containers/hyperkube:v1.1.3   "/hyperkube scheduler"   50 minutes ago      Up 50 minutes                           k8s_scheduler.ed57faf5_k8s-master-127.0.0.1_default_e1376f76a07b85e8b0e4c363ff0fa6c1_a334614a
c6a5b65fa2de        gcr.io/google_containers/hyperkube:v1.1.3   "/hyperkube apiserver"   50 minutes ago      Up 50 minutes                           k8s_apiserver.9de8159f_k8s-master-127.0.0.1_default_e1376f76a07b85e8b0e4c363ff0fa6c1_ba3240b4
a839d533cb47        gcr.io/google_containers/hyperkube:v1.1.3   "/hyperkube controlle"   50 minutes ago      Up 50 minutes                           k8s_controller-manager.6994021e_k8s-master-127.0.0.1_default_e1376f76a07b85e8b0e4c363ff0fa6c1_eb4414a0
12cf8eb4f9eb        gcr.io/google_containers/pause:0.8.0        "/pause"                 51 minutes ago      Up 51 minutes                           k8s_POD.6d00e006_k8s-master-127.0.0.1_default_e1376f76a07b85e8b0e4c363ff0fa6c1_eeb73b8e
f8280ca30a7c        gcr.io/google_containers/hyperkube:v1.1.3   "/hyperkube kubelet -"   51 minutes ago      Up 51 minutes                           suspicious_mayer
22767776b131        gcr.io/google_containers/etcd:2.0.13        "/usr/local/bin/etcd "   51 minutes ago      Up 51 minutes                           insane_ardinghelli

```

##4. kubectlをインストール
ホストサーバからkubectlコマンドを実行できるように、これだけホストにインストールする。

kubectlバイナリをダウンロード

```
wget https://storage.googleapis.com/kubernetes-release/release/v1.0.1/bin/linux/amd64/kubectl
```

バイナリを権限を変えて移動

```
chmod +x kubectl
mv kubectl /usr/local/bin/
```

##5. 動作確認

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

minionノード（コンテナ）がReadyで認識されてればOK



##備考
オフライン環境でkubernetesクラスタを構築するため、一度オンライン環境でpullしたhyperkubeをtar.gz形式でエクスポートし、インターネット接続のないサーバへオフラインで移動させて、オフラインサーバでdocker runしてみたが、proxyやapiserverなど、ほとんどのコンテナが起動しなかった。
kubectl logsコマンドで状態を確認したところ、docker run時にgcr.ioへの接続失敗のようなエラーログが確認された。おそらくrun実行時に外部へアクセスする必要がある模様。
つまり、hyperkubeのdocker imageをDLしてオフライン環境で実行しても、正しく利用できなった。