Kubernetes Design Overviewその2

このエントリはKubernetesアドベントカレンダー2014の3日目です。

今日も引き続きKubernetesのDesign Overviewを見ていきます。

The Kubernetes Node

MasterMinion などのKubernetesの各nodeでは以下のプロセスが稼働します。

  • kubelet
  • kube-proxy

図に出てくる cAdvisorgoogle/cadvisor で、独立したプロセスではなく kubelet に組み込まれているようです(ちょっとあやふや)。

kubelet

container manifest(コンテナマニフェスト)に従いコンテナを起動します。 container manifestには、yaml形式で起動したい Pod の情報と設定を書きます。 kubelet はContainer Agent( GoogleCloudPlatform/container-agent )の後継プロダクトです。

kubelet には4つの方法でcontainer manifiestを渡せます。

  • File : ファイルパスを指定します。ファイルは20秒おきに再チェックされます
  • HTTP endpoint : HTTP endpoint (要はURL)を指定します。 kubelet は20秒おきに
  • etcd server : 指定された etcd/registry/hosts/$(hostname -f)watch します。この方法だと変更の反映がとてもすばやく実現できます
  • HTTP server : kubelet 自身がHTTPでcontainer manifestを受け取ります。まだ今のところunder specです

なお FileHTTP endpoint の再チェック間隔は設定で変更できます。

kube-proxy

ネットワークプロキシです。 Service で既定されたとおり、TCPとUDPを Pod に転送します。

kubernetes/services.md at v0.5.3 · GoogleCloudPlatform/kubernetes

このあたりは昨日のエントリに少し詳しく書いてあります。

The Kubernetes Control Plane

KubernetesのControl Planeはいくつかのプロセスで構成されていますが、ぜんぶ1つのサーバ( Master )で稼働します。

  • etcd
  • kube-apiserver
  • kube-scheduler
  • kube-controller-manager

etcd

coreos/etcd

分散KVSです。Kubernetesでは Master の状態・設定を永続化するために利用しています。 watch 機能を利用して MinionPod などの状態をすばやくクラスタに反映させることができるようになっています。

Kubernetesでは、 Master の各プロセスと、各 Minionkubeletetcd を使って設定やステータスを共有します。

kube-apiserver, kube-scheduler

2つ合わせて、いわゆる Kubernetes API Server です。

Kubernetesの3つのオブジェクト( pod , service , replicationController )に対するRESTでの操作を受け付けて etcd に保存します。それと、 Minion に対する Pod のスケジューリングと、 Pod の情報( Pod がどの Minion にいるか、どのポートを EXPOSE しているか)と Service 設定を同期します。

schedulerは今のところとてもシンプルで、登録されているホスト( Minion )の中で、priorityの値が低いものを選択します。同じプライオリティであればその中からランダムに選択します。
kubernetes/generic_scheduler.go at v0.5.3 · GoogleCloudPlatform/kubernetes

kube-controller-manager

etcd にある replicationController オブジェクトを監視( watch )して、変化があったらKubernetes APIを叩いてReplicationを発動させます。

まとめ

Kubernetesのバックエンドは etcd と、その watch 機能で構成されてます。 etcd は凄いやつ。


See also