このエントリはKubernetesアドベントカレンダー2014の3日目です。
今日も引き続きKubernetesのDesign Overviewを見ていきます。
The Kubernetes Node
Master や Minion などのKubernetesの各nodeでは以下のプロセスが稼働します。
kubeletkube-proxy
図に出てくる cAdvisor は google/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です
なお File と HTTP 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 )で稼働します。
etcdkube-apiserverkube-schedulerkube-controller-manager
etcd
分散KVSです。Kubernetesでは Master の状態・設定を永続化するために利用しています。
watch 機能を利用して Minion や Pod などの状態をすばやくクラスタに反映させることができるようになっています。
Kubernetesでは、 Master の各プロセスと、各 Minion の kubelet が etcd を使って設定やステータスを共有します。
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 は凄いやつ。