kubernetesの構築方法は色々あるが、CentOSの場合は7が推奨されている。
例えばCentOS6や、EC2 Amazon Linuxでは実現できないか?というと、kubernetes自体をdockerベースで起動する方法がある。「Hyperkube」
Amazon Linux上で試してみた。
基本は以下をベースにしてます。
1ホスト上での実装です。
前提条件として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してオフライン環境で実行しても、正しく利用できなった。