2014年8月28日木曜日

[Kubernetes] Kubernetes試す & pods周り




[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-a
  • NUM_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周りを触るのとより深い設定を見て行きたいと思います。

0 件のコメント:

コメントを投稿