[TOC]
Kubernetes試す & pods周り
今日から当面Kubernetesをやります。 とりあえず今日はGCE上にKubernetesを立ててみます。
Kubernetes is 何?
公式のDesign Docを読んだほうが良いですが、 個々に書いてあるとおりで訳すと以下の感じになります。
原文
Kubernetes is a system for managing containerized applications across multiple hosts, providing basic mechanisms for deployment, maintenance, and scaling of applications. Its APIs are intended to serve as the foundation for an open ecosystem of tools, automation systems, and higher-level API layers.
訳(多分)
Kubernetesは複数ホスト間でコンテナアプリケーションの管理、導入、保守及びスケーリングのメカニズムを提供するするシステムである。そのAPIはツール、自動化及び高レベルなAPI層のオープンなエコシステムの基盤になる。
Dockerを触っていると単体でのコンテナを触る分には特に問題がないのですが、 複数コンテナ、もっと言えば複数ホストをさわろうと思った時に格段に難易度や複雑度が上がります。
例えば複数コンテナではコンテナ間のネットワークや、ホストとのポートフォワードの管理が必要で、 Dockerが提供している機能(例えばlink)だけでは管理が複雑化しやすいです。
さらにサービスをやる上ではスケーリングのために複数ホストで動かすことを考えたくなりますが、 この辺りも複数ホスト上でどおやってコンテナ間を通信させるかなどで悩みどころが多かったりします。 ※複数ホストの場合はAmbassadorsパターンを使って通信させることが多いですね
前者の複数コンテナは現状だと、docker社が採用している「fig」があります。 ただfig自体は複数ホストの管理については機能を提供していません。(多分)
そこでKubernetesのような複数ホスト上で動く、コンテナを管理する仕組が必要になってきます。
色んなベンダーがKubernetesと協業しようとしているので上記だけのシステムななくなってきている感がありますが...
Kubernetes on GCE
とりあえず公式の「Getting started on Google Compute Engine」を読めば行けそうなのでやっていきます。
前提
- GCEを使える状態にしておく
- Developer Consoleでプロジェクトを作成して、GCEを使えるようにしておく
- Google StorageとGoogle Storage JSON APIを有効にしておく
- 作ったプロジェクトでONにしておく
- Developer Consoleプロジェクト作成後、 左メニューの「APIと認証」→「API」を押下して、 Google StorageとGoogle Storage JSON APIを探してONにしておく
- Golangをインストールしておく
- Google Cloud SDKをインストールして最新化しておく
- 最新化はインストール後
$ gcloud components update
コマンドを叩く - gcloudのプロジェクトを設定しておく
$ gcloud auth login
$ gcloud config set project {作ったプロジェクト名}
- godepをインストールする
- $GOPATHを設定し、
go get github.com/tools/godep
Kubernetesのインストール
ソースを落としてきます。
$ git clone https://github.com/GoogleCloudPlatform/kubernetes.git
$ cd kubernetes
GCEとKubernetesのセットアップ
Kubernetesはsingle master nodeと、worker node (minionと呼ばれている?)と呼ばれるHostが必要です。 Kubernetesのセットアップスクリプトではこれらを自動的にGCE上に立ててくれるスクリプトが存在します。
※以降のシェルは落としてきたkubernetesレポジトリをカレントディレクトリとします。
0. 設定
インスタンスを何台立てるかや、インスタンスタイプの設定は
cluster/gce/config-default.sh
にあります。
以下に全文出しますが、デフォルトから以下を修正しています。
ZONE
: us-central1-b → asia-east1-aNUM_MINIONS
(minionサーバの台数) : 4 → 2
#!/bin/bash # Copyright 2014 Google Inc. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # TODO(jbeda): Provide a way to override project ZONE=asia-east1-a MASTER_SIZE=g1-small MINION_SIZE=g1-small NUM_MINIONS=2 # gcloud/gcutil will expand this to the latest supported image. IMAGE=backports-debian-7-wheezy NETWORK=default INSTANCE_PREFIX=kubernetes MASTER_NAME="${INSTANCE_PREFIX}-master" MASTER_TAG="${INSTANCE_PREFIX}-master" MINION_TAG="${INSTANCE_PREFIX}-minion" MINION_NAMES=($(eval echo ${INSTANCE_PREFIX}-minion-{1..${NUM_MINIONS}})) MINION_IP_RANGES=($(eval echo "10.244.{1..${NUM_MINIONS}}.0/24")) MINION_SCOPES=""
1. インスタンスの立ち上げ
設定ができたら、GCEインスタンスを立ち上げます。 この辺りは用意されているスクリプトを走らせれば行けるようです。 ※ちゃんとcleanスクリプトも有ります。
[kubernetes]$ hack/dev-build-and-up.sh
しばらく待つと設定した通りのGCEインスタンスが
gcloud
コマンドで設定したプロジェクトで起動します。
この
dev-build-and-up.sh
ではCloud Storageにmasterとインストールスクリプトとアーカイブを置いて GCEのstartup-script
(AWSで言うところのUserDataとかCloud-init)を使って それらを取得、インストールしているようです。 SaltStackもインストールしています。 apiserverなどはSaltStackを使ってインストールしているようですね。2. コンテナの立ち上げ
2.1. シンプル版
コンテナを立ち上げる前にkubernetesで利用するコマンド群をビルドしておきます。
[kubernetes]$ hack/build-go.sh
上記を行ったらnginxが動くコンテナを2台起動しています。 kubernetesのAPI Serverに対するアクセスは大体
cluster/kubecfg.sh
で行います。[kubernetes]$ cluster/kubecfg.sh -p 8080:80 run dockerfile/nginx 2 myNginx
起動したら実際にコンテナが起動しているか
kubernetes-minion-1
にSSHして確認してみます。[kubernetes]$ gcutil ssh kubernetes-minion-1 [~@kubernetes-minion-1]# sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0c4ff13d80ed dockerfile/nginx:latest "nginx" 39 minutes ago Up 39 minutes k8s--mynginx.55318977--e78ced3e_-_2e6e_-_11e4_-_89af_-_42010af0d357.etcd--8b776ef9 fb598100f220 kubernetes/pause:latest "/pause" 39 minutes ago Up 39 minutes 0.0.0.0:8080->80/tcp k8s--net.97f46b2b--e78ced3e_-_2e6e_-_11e4_-_89af_-_42010af0d357.etcd--988d0fca 346ba49a4b39 google/cadvisor:latest "/usr/bin/cadvisor" - 3 hours ago Up 3 hours k8s--cadvisor.1207d44b--cadvisor_-_agent.file--075f2562 ee68b4f0ce61 kubernetes/pause:latest "/pause" 3 hours ago Up 3 hours 0.0.0.0:4194->8080/tcp k8s--net.46426d55--cadvisor_-_agent.file--efd1acc9
nginxのコンテナが起動しているのがわかります。 ちなみにcadvisorは同じくGoogleが開発しているOSSの Dockerコンテナのリソース解析ツール(?)のようでsう。
またpause系のコンテナはよくわかりません(白目 多分netワーク周りを解決するためのコンテナのようです。 ちなみにkubernetesがちゃんと見守っているので、nginxコンテナを削除すると勝手にコンテナが上がります。
[~@kubernetes-minion-1]sudo docker rm -f 0c4 [~@kubernetes-minion-1]# sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fb598100f220 kubernetes/pause:latest "/pause" 44 minutes ago Up 44 minutes 0.0.0.0:8080->80/tcp k8s--net.97f46b2b--e78ced3e_-_2e6e_-_11e4_-_89af_-_42010af0d357.etcd--988d0fca 346ba49a4b39 google/cadvisor:latest "/usr/bin/cadvisor" - 3 hours ago Up 3 hours k8s--cadvisor.1207d44b--cadvisor_-_agent.file--075f2562 ee68b4f0ce61 kubernetes/pause:latest "/pause" 3 hours ago Up 3 hours 0.0.0.0:4194->8080/tcp k8s--net.46426d55--cadvisor_-_agent.file--efd1acc9 [~@kubernetes-minion-1]# sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 479dd3ec30f8 dockerfile/nginx:latest "nginx" 9 seconds ago Up 9 seconds k8s--mynginx.55318977--e78ced3e_-_2e6e_-_11e4_-_89af_-_42010af0d357.etcd--d1e4e662 fb598100f220 kubernetes/pause:latest "/pause" 44 minutes ago Up 44 minutes 0.0.0.0:8080->80/tcp k8s--net.97f46b2b--e78ced3e_-_2e6e_-_11e4_-_89af_-_42010af0d357.etcd--988d0fca 346ba49a4b39 google/cadvisor:latest "/usr/bin/cadvisor" - 3 hours ago Up 3 hours k8s--cadvisor.1207d44b--cadvisor_-_agent.file--075f2562 ee68b4f0ce61 kubernetes/pause:latest "/pause" 3 hours ago Up 3 hours 0.0.0.0:4194->8080/tcp k8s--net.46426d55--cadvisor_-_agent.file--efd1acc9
なおどのサーバでどのコンテナ(正確に言うとpods)が立ち上がっているかは以下で確認ができます。
$ ./cluster/kubecfg.sh list pods Name Image(s) Host Labels ---------- ---------- ---------- ---------- e78ced3e-2e6e-11e4-89af-42010af0d357 dockerfile/nginx kubernetes-minion-1.c.bft-all-staff-study.internal/ name=myNginx,replicationController=myNginx b7fb8713-2e72-11e4-89af-42010af0d357 dockerfile/nginx kubernetes-minion-2.c.bft-all-staff-study.internal/ name=myNginx,replicationController=myNginx
またちゃんとnginxが起動しているかブラウザ確認したい場合は、デフォルトのままだとGCEのFirewallの8080ポートが開いていないためアクセスできません。
$ gcutil addfirewall --allowed=tcp:8080 --target_tags=kubernetes-minion kubernetes-minion-8080
コンテナを止める場合は以下のようにします。
$ ./cluster/kubecfg.sh stop myNginx
そしてコンテナを削除します。
$ ./clister/kubecfg.sh rm myNginx
2.2. podsファイル版
実際には生のコンテナを直接使うというよりpodsの設定ファイルを利用して立ち上げます。 Kubernetesではある程度サンプルのpodsファイルがあるのでそれを使ってみます。
$ cluster/kubecfg.sh -c api/examples/pod.json create /pods
Podsを確認します。
$ cluster/kubecfg.sh list pods
細かいのはまた別日にやるので削除
$ cluster/kubecfg.sh delete pods/php
GCEインスタンスなどを削除
ひと通り確認が終わったので削除します。
$ cluster/kube-down.sh
これで全ての設定が削除されます
所感
clusteringやコンテナの管理などdockerが自体が提供していないところですが、 実運用で必ず必要になる部分は網羅できている感があります。
単純に1ホスト1コンテナ構成や、1ホスト複数コンテナ構成であればfigとかでもいいのでしょうが、 実際にサービスとかで考えるとkubernetesのようなものは必要になりそうです。
まだ細かい部分バグが有る気がしますが(
cluster/kubecfg.sh list pods
の時に古いnginxが残ってしまっていた今調べ中) 非常に期待できるシステムな気がします。
次はpods周りを触るのとより深い設定を見て行きたいと思います。